Activex控件的子线程新开窗口的问题

icefireren 2008-01-16 06:35:05
遇到一个问题,做了一个的ocx控件,主线程有窗口,同时还在子线程中调用CreateWindow创建窗口,遇到的现象就是createwindow有时会没有返回值,消息循环能够收到wm_create,wm_move,wm_size这三个消息。不知道是什么原因导致的?或者说有没有什么有效的方法,来实现子线程里创建窗口的目的?

网上找到一篇文章:http://support.microsoft.com/kb/157437
貌似所有的ActiveX 都是 STA类型,是由主线程处理消息,如果在ActiveX用CreateThread 创建新的线程,这个线程是不能收到系统消息的,所以用createwindow不响应。所有的界面,窗口都必须在主线程创建。子线程可以往主线程窗口发送消息。


确实如此吗?如果确实如此,那为什么有时候可以有时不行?
...全文
173 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
关注 接分
  • 打赏
  • 举报
回复
因为你的工作线程没有消息循环,所以创建窗口的线程必须有消息循环,也就是GetMessage

这个GetMessage 的介绍.
The GetMessage function retrieves a message from the calling thread's message queue
jameshooo 2008-01-17
  • 打赏
  • 举报
回复
在消息循环处跟踪,看看挂起的是哪个消息
icefireren 2008-01-17
  • 打赏
  • 举报
回复
没返回=函数挂死,线程挂起
jameshooo 2008-01-17
  • 打赏
  • 举报
回复
遇到的现象就是createwindow有时会没有返回值
======================================
没有返回值是什么意思?返回的HWND为NULL也是有返回值啊
icefireren 2008-01-17
  • 打赏
  • 举报
回复
谢谢回复

“先说说为何要在线程中创建窗口? ”
呵呵,这个是根据应用需要以及防止因业务需要导致主线程阻塞

主线程起来后,会创建一个操作窗口,同时新建几个子线程,子线程在执行独立逻辑时,根据情况,创建新窗口,此新窗口的父窗口是主线程创建的窗口。
之所以要由子线程创建窗口,

我们的WM_CREATE里没做什么事情啊?!
captain_x 2008-01-16
  • 打赏
  • 举报
回复
mark
jameshooo 2008-01-16
  • 打赏
  • 举报
回复
先说说为何要在线程中创建窗口?

ActiveX都是STA没错,新线程也能创建窗口,你都已经收到WM_CREATE之类的消息了说明窗口窗口已经创建成功了。没人要求所有的窗口都必须在主线程创建。你的问题可能在于在线程的消息响应里面执行了其它错误操作,比如访问一个未被列集的COM接口。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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