现在的位置: 首页 > 综合 > 正文

VC 在DLL中使用全局变量出现异常问题

2013年04月09日 ⁄ 综合 ⁄ 共 934字 ⁄ 字号 评论关闭

最近,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方式实现。

抱歉!评论已关闭.