次のことを行う 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
、関数を呼び出すときに再度ロードする必要はありません。