检测伴随DLL链接和通信(C ++)

时间:2013-01-30 15:01:10

标签: c++ dll

我试图寻找答案,但没有什么能做到我想要的。

我正在编写一组可以用作包或单独使用的DLL。如果应用程序也链接到DLL-B

,我将如何检测DLL-A

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

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

如果这没有意义,请告诉我,这是非常深夜:P

2 个答案:

答案 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都有一些共同的初始化调用可能会很好,这样用户就可以设置“共享环境”