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