为什么我的类在执行线程时总是会有0xC0000005Access Violation错误?

earth2150 2004-11-29 02:03:22
//我写了一个CStart类,继承CWinThread
//其中的线程运行主要有两个函数控制
//
BOOL CStart::StartMonitoring()
{
if(!(m_Thread=AfxBeginThread(ThreadFunc,this))) //CWinThread * m_Thread;
return FALSE;
TRACE("\nStart Thread");
return TRUE;
}

UINT CStart::ThreadFunc (LPVOID lpParam)
{
DWORD Event;
ASSERT (NULL != lpParam);
CStart* hp=(CStart*)lpParam;
pThread->m_bThreadAlive=TRUE;
for(;;)
{
//测试线程工作与否
TRACE("\nEnter ThreadFunc->switch =>Start Monitorint...");

}

return 0;
}




//然后在视类加了一个WM_LBUTTONDOWN事件触发线程
void CSnifferhpView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
pCStart->Init();
pCStart->StartMonitoring();

CView::OnLButtonDown(nFlags, point);
}

//但在Debug时触发线程时老是报告Access Violation错误,不知错在哪里,恳请各位大虾指教!
...全文
304 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
earth2150 2004-12-01
  • 打赏
  • 举报
回复
分数已给,多谢!
netgm 2004-11-30
  • 打赏
  • 举报
回复
晕.解决了给分
NNBWOLF 2004-11-29
  • 打赏
  • 举报
回复
earth2150 2004-11-29
  • 打赏
  • 举报
回复
ok
earth2150 2004-11-29
  • 打赏
  • 举报
回复
问题解决,多谢!
快乐鹦鹉 2004-11-29
  • 打赏
  • 举报
回复
CStart * pCStart;
pCStart->Init();
你是这么写的么?
那么pCStart根本就没有初始化,你直接调用Init当然会报告这个错误了。
怎么也得CStart *pCStart = new CStart();
如果需要,还要调用比如pCStart->Create()之类的函数进行创建后才有效。
earth2150 2004-11-29
  • 打赏
  • 举报
回复
问题好像就出在调用pCStart->Init()时,他的定义CStart * pCStart,那么应该怎么初始化它呢?
老夏Max 2004-11-29
  • 打赏
  • 举报
回复
关注一下!
Hotthing 2004-11-29
  • 打赏
  • 举报
回复
见我的贴:
http://community.csdn.net/Expert/topic/3587/3587727.xml?temp=.4329645


开发人员备注
需要可执行内存区域的应用程序在分配内存时,必须使用 PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_WRITECOPY 属性。另外,应用程序不能从默认进程堆或堆栈执行。

大多数执行与 DEP 不兼容的操作的应用程序必须进行更新,以便与 DEP 保持兼容。如果某个应用程序从专用堆分配可执行内存,则必须确保该堆内存中设置了 EXECUTE 标志。该应用程序可以使用 VirtualAlloc 应用程序编程接口 (API) 分配具有适当保护设置的内存。

如果应用程序不从专用堆分配可执行内存,则必须对其进行修改以使其从专用堆分配可执行内存。该应用程序必须使用 VirtualAlloc API 创建此堆,并且至少为该内存指定 EXECUTE 标志。生成的任何代码必须放在该可执行堆中。

在生成可执行代码后,我们建议您为该应用程序设置内存保护,以禁止通过 VirtualProtect API 对该堆进行写访问。该措施将为进程地址空间的那些可执行区域提供更多保护。

配置和疑难解答

与数据执行保护支持有关的故障的症状包括:在启用 DEP 时尝试从内存执行的应用程序中发生访问冲突。在此情况下,将出现一个对话框,指示应用程序因 DEP 而出现错误。该对话框包含与以下内容类似的消息:
数据执行保护
Windows 安全功能检测到一个问题,并关闭了此程序。
名称:应用程序名称
发行商:应用程序发行商

数据执行保护帮助保护免受病毒和其他安全威胁的破坏。它是如何工作的?
(后跟“高级”和“确定”按钮。)
如果 DEP 是导致应用程序出现错误的原因,建议您与应用程序供应商取得联系,以确定是否有可用的更新,以使应用程序在启用 DEP 时能够正常运行。要解决这些问题,建议您安装此更新。

在单击“确定”后,将出现一个标准的 Windows 错误报告提示,并提供一个发送错误报告的选项。还可以通过“单击此处”选项查看收集了哪些信息。

在错误报告界面上单击“单击此处”链接后,将出现详细信息界面。在该数据的“错误签名”部分,您可以查看是否将此错误标识为“事件类型:BEX。BEX 指示与 DEP 相关的错误。

此界面还提供其他信息,这些信息主要来自一些异常参数: 参数 数据
1 应用程序名称
2 应用程序版本
3 应用程序时间戳
4 模块名称
5 模块版本
6 模块时间戳
7 模块偏移
8 异常代码(c0000005=访问冲突、c0000409=缓冲区溢出)

在初始界面上,您还可以单击“高级”来访问 DEP 配置设置。您可以使用这些设置为出现错误的应用程序添加例外项。

“数据执行保护”对话框提供以下三个选项:• 为所有程序启用 DEP(推荐)
• 关闭 DEP(不推荐)
• 帮助保护除下列程序之外的所有程序:
通过选择其中一个选项,您可以排除一个或多个应用程序,或者为整个计算机配置 DEP 设置。如果设置“关闭 DEP”选项,则会为当前运行的 Windows 安装的 boot.ini 配置文件添加一个开关。boot.ini 开关如下所示:• /noexecute — 这是默认开关。启用 DEP。
• /execute — 它禁用 DEP。
注意:建议您不要全局性地禁用 DEP。这会使计算机处于不太安全的状态。

也可以在“系统”属性中访问这些 DEP 设置。

如果没有适用于您的应用程序的更新,请按照下列步骤操作以访问和配置 DEP 配置设置:1. 在应用程序出现错误时,单击“高级”。
2. 在“数据执行保护”对话框中,选择“帮助保护除下列程序之外的所有程序:”
3. 单击应用程序旁边的复选框,然后单击“应用”。
4. 这时会出现一个提示,告诉您必须重新启动系统。单击“确定”。
5. 再次单击“确定”,然后重新启动系统。
也可以在“系统”属性中执行此过程:1. 单击“开始”,然后单击“控制面板”。
2. 在经典视图中,双击“系统”。
3. 单击“高级”选项卡,单击“性能”,然后单击“设置”。
4. 在“性能选项”对话框中,单击“数据执行保护”选项卡。
5. 选择“为所有程序和服务启用 DEP,但我选择的程序和服务除外:”,然后单击“添加”。
6. 在“打开”对话框中,找到并选择该应用程序,然后单击“打开”。
7. 单击“应用”,然后单击“确定”。将出现一个提示,通知您必须重新启动系统后设置才能生效。单击“确定”。


快乐鹦鹉 2004-11-29
  • 打赏
  • 举报
回复
在所有涉及指针的地方都加上断点。
错误显然是某个指针没有初始化,或者得到的指针是错误的。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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