0

我有一个带有 C 文件的 .vcxproj,它执行以下操作:

extern long __stdcall CallCreateTube(long **Data)
{
    char DllPath[256];
    FARPROC pfn;
    long rtn;
    long *pData;

    pData = *Data;

    lstrcpy(DllName, progPath);
    lstrcat(DllName, "XEQ\\tube");
    lstrcat(DllName, ".DLL");

    HANDLE hLib = LoadLibrary(DllPath); // believe me here that DllPath is constructed properly.
    if (!hLib) return -1;

    pfn = GetProcAddress((HMODULE)hLib, "CreateTube");
    if (!pfn) return -1;

    rtn = (pfn) (pData); // this will load tube.dll again!

    if(!FreeLibrary((HMODULE)hLib))
        return -1;
    return rtn;
}

使用 Process Explorer,当我调用 LoadLibrary 时,会加载“tube.dll”。当我调用rtn = (pfn)(pData)上面的行时,它会再次加载“tube.dll”!!

此 dll (tube.dll) 是使用 /clr 编译的混合程序集 (C++/CLI)。是否有可能在 clr 上下文中加载了“tube.dll”的第二个实例?如果是这样,如何防止呢?DLL需要加载一次才能使用GetProcAddress,但调用函数时不需要再次加载!

4

0 回答 0