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) です。"tube.dll" の 2 番目のインスタンスが clr コンテキストに読み込まれる可能性はありますか? もしそうなら、それを防ぐ方法は?を使用するには DLL を 1 回ロードする必要がありますがGetProcAddress、関数を呼び出すときに再度ロードする必要はありません。

4

0 に答える 0