我正在开发一个需要读取多种文件格式并合并数据的应用程序。因为我们将来可能希望支持其他格式,所以文件阅读器必须开发为 DLL,并在运行时根据用户输入加载。我通常会一次加载两个 DLL。
我在想我可以创建一个抽象接口(像这样),但是如果我在每个(子类)DLL 类中使用工厂函数,当我加载两个 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
正如我在评论中已经提到的:永远不要从另一个上下文(其他 DLL 或 EXE)释放分配在 DLL 中的内存!