我有一个MFC DLL。初始化时,它在另一个库上使用LoadLibrary。当我的析构函数被调用时,它调用FreeLibrary。 MFC dll是OPOS服务对象(SO)。话虽如此,我做了一个简单的C#程序,它使用OPOS与SO对话。据报道,当用户使用OPOS命令Close()时,它有时会崩溃(Windows 7)或者只是消失(Windows XP)。我们亲切地称这个错误关闭关闭。它一直是我脖子上的主要刺。虽然我已经在这个SO上工作了大约一年,但我承认我的C ++调试技能非常缺乏。我更像是一个C#家伙。现在我不确定是不是因为我现在正在使用VS2013预览,或者VS2010和VS2012只是没有一个很好的C ++程序调试器,或者我只是不明白我在看什么(我' d保证第二个任何人。调试器指向加载的库中的函数。它几乎每次都是相同的函数,但我认为我会在该库中的任何函数中得到此错误。所以我完全不知道如何缩小造成这种情况的原因。它并不是每次都这样做。
我知道这段代码不会有多大帮助。但是......我不知道还有什么地方可以看。所以这段代码有效。它是用于LoadLibrary的代码
#define INITPROCADDR(dllIns,funcName) (FARPROC&)funcName = GetProcAddress(dllIns,#funcName);\
if(NULL==funcName){\
CString szMsg;\
szMsg.Format(_T("Function: %s can't be found."),#funcName);\
AfxMessageBox(szMsg);\
FreeLibrary(dllIns);\
return FALSE;\
}
BOOL MasterRD_Load_rfLib(HINSTANCE *phInstMaster)
{
CString strDll;
LPTSTR szBuf = strDll.GetBuffer(MAX_PATH);
GetModuleFileName(AfxGetInstanceHandle(), szBuf, MAX_PATH);
strDll.ReleaseBuffer();
strDll = strDll.Left(strDll.ReverseFind('\\') + 1);
strDll += _T("\\MasterRD.Dll");
*phInstMaster = LoadLibrary(strDll);
if(!(*phInstMaster))
{
AfxMessageBox(_T("Can't load MasterRD.dll!"));
exit(0);
return FALSE;
}
INITPROCADDR((*phInstMaster), rf_GetVer);
INITPROCADDR((*phInstMaster), rf_DES_Encrypt);
//Load rest of the functions
}
这就是实例化服务对象时的使用方法
private:
HINSTANCE m_hMasterRD;
if (!MasterRD_Load_rfLib(&m_hMasterRD))
{
m_hMasterRD = NULL;
}
所以关闭并不多。我有一个正在运行的后台线程被关闭。该后台线程大量使用MasterRD。关闭时我会这样做
for(int i=0; i<100; i++)
{
GetExitCodeThread(ReaderThread, &exitStatus);
if(exitStatus==3)
break;
Sleep(10);
}
CloseHandle(ReaderThread);
ReaderThread = NULL;
现在我的程序并不总是崩溃,但是当它崩溃时它总是在关闭时崩溃。目前,我们总是参考MasterRD中的一个功能。所以...我不知道。我怎么知道为什么我对该图书馆的引用偶尔会消失。我想它可能是那个库,但我不太了解C ++如何验证这一点。想法?