最近,VC调用DLL,,在释放DLL时出现如下提示,百思不解。
在DEBUG环境下,VC 输出窗口提示:
“JWGB_BK.exe”: 已加载“F:\VC\JWGB_BK\test\prd\BK122.dll”,已加载符号。
Init()--- 协议:f TY_GetProtocal OK
Init()---TY_Exit OK
Init()---TY_GetDlgOper OK
Init()---TY_SendMsgProc OK
TYBK.exe 中的 0x00000000 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
“TYBK.exe”: 已卸载“F:\VC\TYBK\test\prd\BK122.dll”
线程 'Win32 线程' (0x149c) 已退出,返回值为 0 (0x0)。
程序“[4332] TYBK.exe: 本机”已退出,返回值为 0 (0x0)。
看来在DLL的初始地址上出现了问题,反复跟踪程序,没有发现异常。
在Release环境下,程序出现异常提示:
实在很烦,查找了一下以前的DLL调用,也没有出现这个问题,很纳闷。
经过反复调试,发现问题出在全局变量的使用上,
如果把全局变量定义为:
CIOCard g_cIOCard;
CProduct g_cProduct;在卸载DLL时就出现上述提示。
于是把其改为:
CIOCard* g_pIOCard = NULL;
CProduct* g_pProduct = NULL;
然后DLL的CWinApp类函数实现全局函数实例:
BOOL CBKApp::InitInstance()
{
CWinApp::InitInstance();
g_pIOCard = new CIOCard;
g_pProduct = new CProduct;
return TRUE;
}
int CBKApp::ExitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
delete g_pIOCard;
g_pIOCard = NULL;
delete g_pProduct;
g_pProduct = NULL;
return CWinApp::ExitInstance();
}一切都OK,总算可以休息了。
经历这次,总结如下,在DLL中如果要调用全局变量,应采用new方式实现。