我试图寻找答案,但没有什么能做到我想要的。
我正在编写一组可以用作包或单独使用的DLL。如果应用程序也链接到DLL-B
,我将如何检测DLL-A应用程序并不总是由我编写,只是DLL的编写。
一旦我确认DLL-B是程序的一部分,我希望能够在2个DLL之间进行通信。
如果这没有意义,请告诉我,这是非常深夜:P
答案 0 :(得分:3)
只需使用您要检查的DLL的名称调用GetModuleHandle()
,而不使用路径。如果它返回NULL
,则不加载DLL。如果否则返回,则加载它。
然后,您可以继续使用DLL句柄和要调用的函数名称调用GetProcAddress()
。它将返回一个指向该函数的指针,您可以将其强制转换为相应的函数指针类型并调用它。
答案 1 :(得分:0)
您需要创建一个DLLMain
函数,当您加载或卸载DLL时将调用该函数。
http://msdn.microsoft.com/en-gb/library/windows/desktop/ms682583(v=vs.85).aspx
BOOL WINAPI DllMain(HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
/* Init Code here */
break;
case DLL_THREAD_ATTACH:
/* Thread-specific init code here */
break;
case DLL_THREAD_DETACH:
/* Thread-specific cleanup code here.
*/
break;
case DLL_PROCESS_DETACH:
/* Cleanup code here */
break;
}
/* The return value is used for successful DLL_PROCESS_ATTACH */
return TRUE;
}
现在在这里你需要调用你设计的函数来注册加载DLL的事实(N.B.确保你看看每个开关盒的含义并正确初始化)。它可以做任何事情,说实话,但可能会调用singleton并注册(创建一个接口的实例?)。
一旦你拥有了它,你应该能够做你想做的事。如果您以相同的方式注册两个DLL,您将获得2路通信。
N.B。如果您提供API,那么如果您对两个DLL都有一些共同的初始化调用可能会很好,这样用户就可以设置“共享环境”