我有一个带有 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
,但调用函数时不需要再次加载!