奇怪的VC++问题

AbnerChai 2010-02-06 02:27:25
我有一个MFC 的程序,编译通过,但是一运行,就报莫名的非法内存访问,
Callstack:如下:
ntdll.dll!7c910ede()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c913959()
ntdll.dll!7c910385()
ntdll.dll!7c91019b()
ntdll.dll!7c910041()
ntdll.dll!7c9104ac()
ntdll.dll!7c910482()
advapi32.dll!77dd792e()
> Demo.exe!CWinApp::_LoadSysPolicies() Line 488 + 0x14 bytes C++
Demo.exe!__decomp() + 0xeeab bytes C++
Demo.exe!00501c7f()
kernel32.dll!7c839a88()

Debug 说下面的代码有问题:

// This function is not exception safe - will leak a registry key if exceptions are thrown from some places
// To reduce risk of leaks, I've declared the whole function throw(). This despite the fact that its callers have
// no dependency on non-throwing.
BOOL CWinApp::_LoadSysPolicies() throw()
{
HKEY hkPolicy = NULL;
DWORD dwValue = 0;
DWORD dwDataLen = sizeof(dwValue);
DWORD dwType = 0;

// clear current policy settings.
m_dwPolicies = _AFX_SYSPOLICY_NOTINITIALIZED;

static _AfxSysPolicyData rgExplorerData[] =
{
{_T("NoRun"), _AFX_SYSPOLICY_NORUN},
{_T("NoDrives"), _AFX_SYSPOLICY_NODRIVES},
{_T("RestrictRun"), _AFX_SYSPOLICY_RESTRICTRUN},
{_T("NoNetConnectDisconnect"), _AFX_SYSPOLICY_NONETCONNECTDISCONNECTD},
{_T("NoRecentDocsHistory"), _AFX_SYSPOLICY_NORECENTDOCHISTORY},
{_T("NoClose"), _AFX_SYSPOLICY_NOCLOSE},
{NULL, NULL}
};

static _AfxSysPolicyData rgNetworkData[] =
{
{_T("NoEntireNetwork"), _AFX_SYSPOLICY_NOENTIRENETWORK},
{NULL, NULL}
};

static _AfxSysPolicyData rgComDlgData[] =
{
{_T("NoPlacesBar"), _AFX_SYSPOLICY_NOPLACESBAR},
{_T("NoBackButton"), _AFX_SYSPOLICY_NOBACKBUTTON},
{_T("NoFileMru"), _AFX_SYSPOLICY_NOFILEMRU},
{NULL, NULL}
};

static _AfxSysPolicies rgPolicies[] =
{
{_T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"),
rgExplorerData},
{_T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Network"),
rgNetworkData},
{_T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Comdlg32"),
rgComDlgData},
{NULL, NULL}
};

_AfxSysPolicies *pPolicies = rgPolicies;
_AfxSysPolicyData *pData = NULL;

while (pPolicies->szPolicyKey != NULL)
{

if (ERROR_SUCCESS == ::RegOpenKeyEx(
HKEY_CURRENT_USER,
pPolicies->szPolicyKey,
NULL,
KEY_QUERY_VALUE,
&hkPolicy
))
{
pData = pPolicies->pData;
while (pData->szPolicyName)
{
if (ERROR_SUCCESS == ::RegQueryValueEx(
hkPolicy,
pData->szPolicyName,
NULL,
&dwType,
(BYTE*)&dwValue,
&dwDataLen))
{
if (dwType == REG_DWORD)
{
if (dwValue != 0)
m_dwPolicies |= pData->dwID;
else
m_dwPolicies &= ~pData->dwID;
}
}
dwValue = 0;
dwDataLen = sizeof(dwValue);
dwType = 0;
pData++;
}
::RegCloseKey(hkPolicy);
hkPolicy = NULL;
}
pPolicies++;
};
return TRUE;
}


而这个代码我根本不知道在哪儿用到的,这是windows自带的代码,在appcore.cpp中。

我用的是VS2008, XP SP2.

...全文
290 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xylicon 2010-02-06
  • 打赏
  • 举报
回复
我觉得还是先同你自己的代码着手找问题吧。

调试运行,然后call stack,看看堆栈报错在哪里。
老邓 2010-02-06
  • 打赏
  • 举报
回复
你使用了野指针:指针值未初始化。
我猜想你使用的是野函数指针,在call这个函数的时候,越界了。

如果确定了原因,请跟帖说明一下。
关注。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧