首页
社区
课程
招聘
[求助]关于VC++在新线程中CreateDialog引发非法操作内存错误。
发表于: 2013-8-29 20:36 12379

[求助]关于VC++在新线程中CreateDialog引发非法操作内存错误。

bxc 活跃值
6
2013-8-29 20:36
12379
先上代码:
UINT WINAPI BeginDebug(void *Param)
{
    MainHwnd = CreateDialogW(DllBase,MAKEINTRESOURCE(MAIN_DIALOG),NULL,DlgProc);
    return 1;
}

BOOL LaunchDebugger(long LaunchParam)
{
    ProcHandle = _beginthreadex(NULL,0,&BeginDebug,NULL,0,&ProcID);
    if (ProcHandle == 0 || ProcHandle == -1)
        return FALSE;
    else
        return TRUE;
}


这样子写的话,新线程倒是能成功创建,但是一执行到CreateDialog,就会崩溃,看地址应该是user32出的问题。

如果不用新线程CreateDialog,直接CreateDialog,就是好的。也不会崩溃,这是什么原因啊?

--------------------------------------------------------------------------------------------------------
经过修改,把栈的初始大小调高了之后,user32中的错误解决了。但是在程序里还有错误。
用VS2010调试时,发现出现 0x394020e0处有未经处理的异常: 0xC0000005: 读取位置 0x394020e0 时发生访问冲突。
(Dll基址为0x39400000)。
这个时候反汇编窗口中跳到0x394020e0,显示全是??,dll可能已被卸载。
重新调试dll,在出现异常之前中断。跳到0x394020e0。
就停在_except_handler4(反汇编窗口) / __set_flsgetvalue(源代码窗口)。
应该是C++的异常处理程序吧。为什么多线程中会出现这样的错误?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
线程启动时调用一下InitCommonControls
2013-8-29 22:26
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
3
一样会崩溃。。
2013-8-29 23:19
0
雪    币: 175
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
_beginthreadex的最后一个参数是线程id,而不是进程id。
2013-8-29 23:46
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
他是传回线程id,我填的ProcID不是进程ID。。。
Proc的意思是过程,ProcID在我的程序里就是个全局变量
2013-8-30 00:05
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
DLL的执行环境是什么,在什么进程中
2013-8-31 02:09
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
就是普通进程。。DllLoader
2013-8-31 11:05
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
少个函数。afx很长的一个函数,函数意思是指定当前模块空间而不是进程空间
2013-8-31 11:27
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
我dll是win32的啊。。跟MFC没关系。。。
要是mfc我就用AfxBeginThread了。。。
2013-8-31 13:46
0
雪    币: 291
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你的父窗口不能为NULL,你可以获得顶级窗口试试
2013-9-2 11:48
0
雪    币: 1392
活跃值: (5212)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
11
应该是和模式对话框还有非模式的对话框有关吧。
2013-9-2 11:54
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
12
我不用_beginthread就能创建成功,父窗口为NULL,就是创建顶级窗口。。。
2013-9-2 12:35
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
13
不用_beginthread就好的。
2013-9-2 12:37
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
为啥非得要新建线程创建窗口,你这是非模态吧.
2013-9-2 17:29
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
15
我是想注入DLL,DLL有个导出函数创建一个窗口。如果直接在导出函数里创建。那么这个函数就只能等窗口结束了才能返回。
2013-9-2 22:44
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
非模态窗口是异步返回的.
2013-9-3 11:22
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
17
异步就是MessageBox类型的吧?
就是因为异步才创建新线程。因为不能及时返回。
2013-9-3 11:26
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
晕,非模态是不会阻塞的,也就是能及时返回的,你尝试一下
2013-9-3 11:31
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
19
CreateDialog是能及时返回,问题是还得while循环处理消息啊。
2013-9-3 11:32
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这个我就没试过. 资源窗口也要循环处理消息么? 不是直接指定一个proc么..
2013-9-3 11:35
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
21
我看网上的实例都有while处理消息循环,我原来写的一个程序在dllmain里CreateDialog的,没有消息处理也行。
2013-9-3 11:39
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
是的啊,我之前也写过,没写消息循环.
2013-9-3 11:45
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
23
我重新编译了一遍,现在都没错误了,但窗口显示不出来。换成GUI的DllLoader就好了。
问题解决了。0.0
2013-9-3 12:16
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
哟西,为你感到高兴
2013-9-3 15:30
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
25
谢谢了,又有新问题了0.0
传送门
2013-9-3 17:07
0
游客
登录 | 注册 方可回帖
返回
//