• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > ATL控件创建的线程向内部窗口发消息,无法收到,是什么回事

ATL控件创建的线程向内部窗口发消息,无法收到,是什么回事

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了atl控件,atl34砂轮,atl方形动力电池,atl80.dll官方下载,atl71.dll一键修复等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: ATL 控件创建的线程向内部窗口发消息,无法收到,是什么回事
描述:

Free,多线程 模式
创建线程,创建一个消息处理窗口,从线程里往窗口发送消息,窗口无没收到消息,这是什么回事,应该什么解决?
如果改用Apartment 模式就可以正常接收消息了,但我必须便用Free模式。
窗口是ATL的class CMyWindow :public   CWindowImpl<CMyWindow,   CWindow,   CNullTraits>
创建线程和窗口:
STDMETHODIMP CCCCTest::Init(void)
{
mEventWindow = new CMyWindow(this);
mEventHwnd = mEventWindow->CreateWindows();
// TODO: Add your implementation code here
mHadle = CreateThread( 
NULL,                   // default security attributes
0,                      // use default stack size  
MyThreadFunction,       // thread function name
this, // argument to thread function 
0,                      // use default creation flags 
&mThreadID); // returns the thread identifier 
return S_OK;
}
线程内容
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
CCCCTest* pTest = (CCCCTest*)lpParam;
DWORD dwTS = GetTickCount();
CoInitializeEx( NULL, COINIT_MULTITHREADED);
while (!pTest->mExit)
{
Sleep(5000);
if(pTest->mEventHwnd)
{
dwTS = GetTickCount();
MessageBox(NULL,L"PostMessage",L"MyThreadFunction",MB_OK);
if (!::PostMessage(pTest->mEventHwnd, WM_CALLBACK, (WPARAM)dwTS, 0))
{
}
}
}
CoUninitialize();
return 0;
}
如果有兴趣了解这个问题的,留下邮箱,我把整个测试代码发过去


解决方案1:

引用 10 楼 fastxyf 的回复:
TO oyljerry: 
没看明白 
1.我没有用到MFC,写的ATL 组件没有用到MFC的类和库,调用COM的例子用的是C# 
2.ATL的内部线程,我是调用CoInitializeEx(NULL, COINIT_MULTITHREADED)

内部你不需要处理,消息循环本身却是线程相关的。
你必须在建立的窗口的线程中有消息循环才行。
如果你不用apartment,估计开发的难度比较大。

解决方案2:

需要建立消息循环。

解决方案3:

添加了一些测试代码


        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(AppDomain.GetCurrentThreadId().ToString() );//添加
            client = new CCCLib.CCCTest();
            client.Init();
            client.registerSuccess += new CCCLib._ICCCTestEvents_registerSuccessEventHandler(registerSuccess);
            //thThread = new Thread(new ThreadStart(DoThreadEx));
            //mExit = false;
            //thThread.Start(); 
        }


DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
TCHAR buff[10];
_itow(::GetCurrentThreadId(),buff,10);
MessageBox(NULL,buff,TEXT("wnd"),MB_OK);
CCCCTest* pTest = (CCCCTest*)lpParam;
DWORD dwTS = GetTickCount();
////////////////////////////////////////////////
STDMETHODIMP CCCCTest::Init(void)
{
mEventWindow = new CMyWindow(this);
mEventHwnd = mEventWindow->CreateWindows();
TCHAR buff[10];
_itow(mEventWindow->GetWindowThreadID(),buff,10);
MessageBox(NULL,buff,TEXT("wnd"),MB_OK);
// TODO: Add your implementation code here
mHadle = CreateThread( 
NULL,                   // default security attribute

结论创建com对象的线程没有消息循环。
在APARTMENT模型下C#的创建的窗口的线程和创建com对象的线程是同一个线程,c#程序会提供消息循环,所以运行正常;
在free模型下,C#的创建的窗口的线程和创建com对象的线程和MyThreadFunction的线程都是不同的线程,所以说在MyThreadFunction的创建消息循环是没有效果的。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于cabarc打包atl控件的问题,郁闷中~~~
  • ATL控件2问
  • 关于ATL做复合控件的问题
  • 大家一般都怎么打包Atl开发的ActiveX控件?
  • 使用ATL编写控件的接收器时,怎样在事件处理方法中得到事件源接口?
  • 请教,ATL写的ActiveX控件在IE中加载时接口的调用顺序
  • 在一个atl的复合控件项目中,如果调用其它ocx控件的方法??
  • 如何使用ATL编写的COM控件来播放AVI文件,需要在IE上使用的
  • 如何得到用ATL作的控件的窗口句柄,试了几个都无效,怎么回事?
  • 想用ATL做个控件,但这是怎么回事?

相关文章

  • 2017-06-05 MFCActivex控件出来的对话框怎么随着网页的缩放位置也跟着变换?
  • 2017-06-05 我的子线程阻塞后,直接结束对话框,产生内存泄露,怎么解决?
  • 2017-06-04 急!!!!!!!!!!分不够可以再加!!!
  • 2017-06-05 多线程共享数据区的问题
  • 2017-06-04 DirectSound声卡录音问题。
  • 2017-06-05 急:各位高手快出来!!!
  • 2017-06-05 com中所有方法的返回值都必须是HRESULT吗?
  • 2017-06-04 急急急,ATL中怎么样把数据集(Recordset)当事件的参数来传递?
  • 2017-06-04 想做一个可插入到CRichEditCtrl中显示GIF动画的组件,遇到点问题,请朋友们帮忙指点谢谢
  • 2017-06-04 请教vb调用com组件方法时传递参数类型的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何编一个驻留程序,检查所有当前打开的窗口,遇到特定的窗口就执行特定的操作?
    • 控件高手请进,关于购买数字证书的问题。
    • 向CSDN的朋友请教一个问题!
    • 我用VC6+sp6+win2000编译的控件在xp下会报错,而2000下是好的,为什么阿?
    • 简单问题求助:请问如何建立一个service的程序?
    • 新手做播放器——怎样将打开画面指定自己的窗口?
    • 求助:如何实现虚拟硬盘
    • ATL做的ActiveX控件注册问题
    • 如何在console程序中调用activex控件
    • 为什么加两行代码,打开IE出现加载错误?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有