我正在开发一个应用程序,需要以多种文件格式读取并合并数据。由于我们可能希望在未来支持其他格式,所以文件读取器必须作为DLL开发,并在运行时根据用户输入加载。我通常会一次加载两个DLL。
我在想我可以创建一个抽象接口(Like this),但是如果我在每个(子类)DLL类中使用工厂函数,那么当我加载两个DLL时,这两个函数定义将互相干扰。我错过了什么吗?有一个更好的方法吗?在C++中使用DLL进行子类化
谢谢!
我正在开发一个应用程序,需要以多种文件格式读取并合并数据。由于我们可能希望在未来支持其他格式,所以文件读取器必须作为DLL开发,并在运行时根据用户输入加载。我通常会一次加载两个DLL。
我在想我可以创建一个抽象接口(Like this),但是如果我在每个(子类)DLL类中使用工厂函数,那么当我加载两个DLL时,这两个函数定义将互相干扰。我错过了什么吗?有一个更好的方法吗?在C++中使用DLL进行子类化
谢谢!
(从评论升级)
如果用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文件)!
谢谢!我没有用DLL做很多,完全忘记了需要获得一个指向导入函数的指针。 – JeffW 2012-07-23 15:30:59
如果您使用LoadLibrary加载DLL并通过GetProcAddress获取指向工厂函数的指针,则不会出现像您想象的那样的问题。请注意,您可能不会释放从另一个DLL/EXE的DLL/EXE中分配的内存! – MFH 2012-07-19 19:44:01
@MFH,这是一个很好的答案,为什么让它成为评论? – eran 2012-07-19 19:46:42
@eran谢谢,我没有:) – MFH 2012-07-19 19:54:36