在C ++中,DLL是否可以访问加载它的应用程序的某些符号? 我有一个加载插件(dll)的应用程序,这些插件需要访问应用程序的某些API。
是否可以在不创建共享此API的新DLL的情况下实现此目的?
在这种情况下,函数指针的结构是否合适?
示例:主机应用程序中定义的bool Log(char *)函数以及需要记录某些事件的插件。
答案 0 :(得分:2)
将回调接口传递给插件DLL的另一个投票。即回调接口......
class IHostApplication
{
public:
virtual bool Log(const wchar_t* ip_log_string) = 0;
};
DLL插件界面
class IPlugin
{
public:
virtual void InitializePlugin(IHostApplication *ip_host) = 0;
};
主机会加载插件DLL(必要时动态加载),然后将自己作为IHostApplication *传递给插件,启用您可能需要的任何回调。
答案 1 :(得分:1)
这是可能的,但您的设计选择值得怀疑。
EXE可以像DLL一样导出函数,因此您可以按照您熟悉的方式使用GetProcAddress。
但是,为什么要设计它以便插件需要了解有关主机程序内部功能的任何信息?它应该是另一种方式。
主持人应该要求插件实现一组例程(它们导出),遵守特定的合同。作为其接口的一部分,如果需要,主机可以在指向结构的指针(例如,版本信息,功能)等中传递它们特定于主机的信息。
插件不应该尝试获取到主机模块的函数指针。
答案 2 :(得分:0)
回调函数指针,回调函数指针列表或回调接口指针 - 我会使用其中一个选项。 DLL客户端必须实现回调接口并将指针传递给此接口以动态创建Dll。动态创建的Dll保留此指针,并在必要时调用其函数,例如,报告某些事件。