COM DLL中创建一个线程来触发事件的问题

jinliu 2004-11-01 10:52:04
我利用ATL WIZARD创建了一个COM DLL,然后创建一个线程来出发事件,可在COM SERVER中一调用事件,就XP就报异常,客户退出,不知是什么原因?
DWORD WINAPI QueryThreadProc(LPVOID lpParameter)
{
HRESULT hr=CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(FAILED(hr))
OutputDebugString("CoInitializeEx Fail");
CBox* p=(CBox*)lpParameter;
while (WaitForSingleObject(p->m_hEvent, 0) != WAIT_OBJECT_0)
{
p->Fire_OnQueryMinData(1,1);//这句激发事件调用会报错,VB客户异常退出
}
CoUninitialize();
return(0);
}



为了不列集接口,我将套间改为了自由套间
即将stdafx.h中的#define _ATL_APARTMENT_THREADED改为#define _ATL_FREE_THREADED,同时将COM对象的派生基类从CComObjectRootEx<CComSingleThreadModel>改为CComObjectRoot,但这些都不能解决问题,
class ATL_NO_VTABLE CBox :
public CComObjectRoot,//CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CBox, &CLSID_Box>,
public ISupportErrorInfo,。。。。
不知是不是在DLL中不支持MTA,我的客户是VB开发的,是不是VB不支持MTA SERVER。

我需要在COM SERVER中创建一个线程来监视一个硬件状态,当状态改变时利用事件通知客户,不知应该如何在用户线程中来激发事件?请高手指点
...全文
277 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
步履人生 2004-11-04
  • 打赏
  • 举报
回复
Mark this
icelight 2004-11-02
  • 打赏
  • 举报
回复
看起来, 你的的控件主线程没有消息汞。还有, 我假设你在主线程激发事件不会引起VB出错。

如果是MFC写的控件, 解决办法就很简单, 你的工作者线程不要p->Fire_OnQueryMinData(1,1);而是PostMessage()一个自定义消息给主线程的消息汞, 由主线程去FireOn。

现在你是在ATL中。有朋友说过, 可以在ATL实现一个隐藏的窗口,利用其消息汞接收工作者线程发来的要求激发事件。他说他试过是可以的。我还未有时间作试验。楼主不妨一试。
foremans 2004-11-01
  • 打赏
  • 举报
回复
我知道在c中创建线程调用vb的函数肯定是可以的,事件....我也想知道,
关注ing

3,248

社区成员

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

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