0

我试图寻找答案,但没有什么能完全满足我的要求。

我正在编写一组可以作为包使用或单独使用的 DLL。如果应用程序还链接到 DLL-B,我将如何在 DLL-A 中进行检测

该应用程序并不总是由我编写,只是 DLL 的。

一旦我确认 DLL-B 是程序的一部分,我希望能够在 2 个 DLL 之间进行通信。

如果这没有意义,请告诉我,现在已经很晚了:P

4

2 回答 2

3

只需GetModuleHandle()使用您要检查的 DLL 的名称进行调用,无需路径。如果它返回NULL,则未加载 DLL。如果它以其他方式返回,则加载它。

然后您可以继续GetProcAddress()使用 DLL 句柄和您要调用的函数的名称进行调用。它将返回一个指向该函数的指针,您可以将其转换为适当的函数指针类型并调用它。

于 2013-01-30T15:41:36.423 回答
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 加载的事实(注意确保您查看上面每个开关案例的含义并进行适当的初始化)。老实说,它几乎可以做任何事情,但可能会调用一个单例并在那里注册(创建你的接口的一个实例?)。

一旦你有了它,你应该能够做你想做的事。如果您以相同的方式注册两个 DLL,您将获得 2 路通信。

注意,如果您提供 API,如果您对两个 DLL 有一些共同的初始化调用,以便用户设置“共享环境”,那可能会很好

于 2013-01-30T15:31:33.427 回答