我试图寻找答案,但没有什么能完全满足我的要求。
我正在编写一组可以作为包使用或单独使用的 DLL。如果应用程序还链接到 DLL-B,我将如何在 DLL-A 中进行检测
该应用程序并不总是由我编写,只是 DLL 的。
一旦我确认 DLL-B 是程序的一部分,我希望能够在 2 个 DLL 之间进行通信。
如果这没有意义,请告诉我,现在已经很晚了:P
只需GetModuleHandle()
使用您要检查的 DLL 的名称进行调用,无需路径。如果它返回NULL
,则未加载 DLL。如果它以其他方式返回,则加载它。
然后您可以继续GetProcAddress()
使用 DLL 句柄和您要调用的函数的名称进行调用。它将返回一个指向该函数的指针,您可以将其转换为适当的函数指针类型并调用它。
您需要创建一个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 加载的事实(注意确保您查看上面每个开关案例的含义并进行适当的初始化)。老实说,它几乎可以做任何事情,但可能会调用一个单例并在那里注册(创建你的接口的一个实例?)。
一旦你有了它,你应该能够做你想做的事。如果您以相同的方式注册两个 DLL,您将获得 2 路通信。
注意,如果您提供 API,如果您对两个 DLL 有一些共同的初始化调用,以便用户设置“共享环境”,那可能会很好