2012-07-19 60 views
0

我正在开发一个应用程序,需要以多种文件格式读取并合并数据。由于我们可能希望在未来支持其他格式,所以文件读取器必须作为DLL开发,并在运行时根据用户输入加载。我通常会一次加载两个DLL。
我在想我可以创建一个抽象接口(Like this),但是如果我在每个(子类)DLL类中使用工厂函数,那么当我加载两个DLL时,这两个函数定义将互相干扰。我错过了什么吗?有一个更好的方法吗?在C++中使用DLL进行子类化

谢谢!

+1

如果您使用LoadLibrary加载DLL并通过GetProcAddress获取指向工厂函数的指针,则不会出现像您想象的那样的问题。请注意,您可能不会释放从另一个DLL/EXE的DLL/EXE中分配的内存! – MFH 2012-07-19 19:44:01

+0

@MFH,这是一个很好的答案,为什么让它成为评论? – eran 2012-07-19 19:46:42

+0

@eran谢谢,我没有:) – MFH 2012-07-19 19:54:36

回答

1

(从评论升级)

如果用LoadLibrary加载的DLL你得到一个句柄DLL - 你必须在FreeLibrary以后使用卸载DLL!

获取句柄后,您可以调用GetProcAddress来获取指向该函数的指针。

示例代码:

auto library = LoadLibrary("sample.dll"); 
//test if library is null => error handling 
auto func = GetProcAddress(library, "function"); 
//test if func is null => error handling 
//you may need to cast func to a different function pointer 
auto plugin = func(); 



//after use: 
auto result = FreeLibrary(library); 
//test for error 

正如我在注释中已经提到:永远不要RELEASE内存中分配一个DLL从另一个上下文(其它DLL或EXE文件)!

+0

谢谢!我没有用DLL做很多,完全忘记了需要获得一个指向导入函数的指针。 – JeffW 2012-07-23 15:30:59