• 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 > 进程外COM第二线程激发事件(外接口)的问题,还请高手解惑

进程外COM第二线程激发事件(外接口)的问题,还请高手解惑

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

佚名通过本文主要向大家介绍了多进程和多线程的区别,线程和进程的区别,进程和线程,线程和进程区别和联系,java进程和线程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 进程外COM第二线程激发事件(外接口)的问题,还请高手解惑
描述:

我在COM对象中建立了一个线程,当符合条件时,从该线程中激发事件(invoke),通过COM对象的外接口运行客户端的具体事件响应实现。因为采用的是STA模式,所以通过CoMarshalInterThreadInterfaceInStream在自建线程外进行列集,在线程函数中用CoGetInterfaceAndReleaseStream散集。经过我的测试,在外接口的函数中和在进入自建线程前检查Thread ID,二者是相同的,但仍然不能激发客户端的Invoke实现。迷惑不解ing。还请了解原因的朋友帮忙看一下。我是新人,分值不多,给分100,还请笑纳。下面是部分源码:
服务端
//
// TestServer.h : Declaration of the CTestServer
#ifndef __TESTSERVER_H_
#define __TESTSERVER_H_
#include "resource.h"       // main symbols
#include "FireEventInSecondThread_ServerCP.h"
/////////////////////////////////////////////////////////////////////////////
// CTestServer
class ATL_NO_VTABLE CTestServer : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTestServer, &CLSID_TestServer>,
public IConnectionPointContainerImpl<CTestServer>,
public IDispatchImpl<ITestServer, &IID_ITestServer, &LIBID_FIREEVENTINSECONDTHREAD_SERVERLib>,
public CProxy_ITestServerEvents< CTestServer >
{
public:
CTestServer()
{
m_pUnkMarshaler = NULL;
//
}
~CTestServer()
{
TerminateThread(m_hThread,0);
}
DECLARE_REGISTRY_RESOURCEID(IDR_TESTSERVER)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CTestServer)
COM_INTERFACE_ENTRY(ITestServer)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CTestServer)
CONNECTION_POINT_ENTRY(DIID__ITestServerEvents)
END_CONNECTION_POINT_MAP()
HRESULT FinalConstruct()
{
char tmp[256] = {0};
sprintf(tmp,"ThreadID in Main is %0x",GetCurrentThreadId());
MessageBox(NULL,tmp,"",0);
ITestServer *pItest = 0;
QueryInterface(_GUID(IID_ITestServer),(void**)(&pItest));
CoMarshalInterThreadInterfaceInStream(IID_ITestServer,pItest,&m_pStm);
m_hThread = CreateThread(NULL,0,ThreadFunc,m_pStm,0,&m_nThreadID);
return CoCreateFreeThreadedMarshaler(
GetControllingUnknown(), &m_pUnkMarshaler.p);
}
void FinalRelease()
{
m_pUnkMarshaler.Release();
}
CComPtr<IUnknown> m_pUnkMarshaler;
// ITestServer
public:
STDMETHOD(DO)(/*[in]*/long param);
static DWORD WINAPI ThreadFunc(LPVOID);
void MyThreadFunc(long param);
HANDLE m_hThread;
unsigned long m_nThreadID;
IStream * m_pStm;
};
#endif //__TESTSERVER_H_
// TestServer.cpp : Implementation of CTestServer
#include "stdafx.h"
#include "FireEventInSecondThread_Server.h"
#include "TestServer.h"
/////////////////////////////////////////////////////////////////////////////
// CTestServer
DWORD WINAPI CTestServer::ThreadFunc(LPVOID pUser)
{
ITestServer *ITestserver;
static bEnterApartMent = FALSE;
if(!bEnterApartMent)
{
bEnterApartMent = TRUE;
CoInitialize(NULL);
}
CoGetInterfaceAndReleaseStream(LPSTREAM(pUser),IID_ITestServer,(void**)(&ITestserver));
static int i = 0;
while(1)
{
if(i >= 10)
break;
i++;
Sleep(3000);
ITestserver->DO(0);
}
ITestserver->Release();
if(bEnterApartMent)
CoUninitialize();
return 0;
}
void  CTestServer::MyThreadFunc(long param)
{
}
STDMETHODIMP CTestServer::DO(long param)
{
// TODO: Add your implementation code here
Fire_Fire(0);
return S_OK;
}


解决方案1:

ITestServer *pItest = 0;
QueryInterface(_GUID(IID_ITestServer),(void**)(&pItest));这里是否成功?pitem是否有值
CoMarshalInterThreadInterfaceInStream(IID_ITestServer,pItest,&m_pStm);//m_pstm是否有值
CoGetInterfaceAndReleaseStream(LPSTREAM(pUser),IID_ITestServer,(void**)(&ITestserver));
ITestserver这里是否成功获得?


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

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

  • 进程外组件对象线程模型
  • 进程外组件的线程模型
  • 多线程调用进程外COM组件
  • 多线程的bird错????
  • 多线程的疑惑!
  • 怎么判断一个进程或一个线程仍然活这呢??????
  • 请问线程和进程有什么区别
  • 一个进程最多可以创建几个线程?
  • 如何在一个线程中终止另一个进程执行。
  • 如何得到本进程的所有子线程?急

相关文章

  • 2017-06-04 如果一个exe里面是包含了com对象的,那么exe的PE文件是不是需要具备某种特殊的2进制结构?
  • 2017-06-05 windows有没有不属于内核下的同步方式
  • 2017-06-04 如何从IE中获得鼠标消息!急!!!!在线等。
  • 2017-06-04 如何查找WORD的"首行"缩进,首行的位置?
  • 2017-06-04 一个COM的初级问题
  • 2017-06-04 (急急急!高分相送!)GUID存取注册表中取出问题?
  • 2017-06-05 为什么总是返回NULL:GetProcAddress()
  • 2017-06-05 如何分析动态链接库中的函数和函数的参数?
  • 2017-06-04 mfcactivex控件里面有调度映射和事件映射,他们什么区别?
  • 2017-06-05 请教从CMemFile内存文件中实现DLL的加载方法

文章分类

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

最近更新的内容

    • #import"xxxtlb"no_namespace带来的麻烦!
    • dll调用外部函数的问题。
    • 我是初用vc和ATL,请问在ATL里面怎么使用对话框资源阿
    • 如何用Delphi做一个ActiveX?
    • 线程能否一直运行?
    • 简单的问题,请问在Dll的函数参数能不能是结构类构的。
    • vc单文档程序中嵌入word怎么没有word的菜单栏常用工具也不能用怎么修改?
    • com的DLL在被IE调用的时候,怎么样可以把这个COMDLL改名呢?急求COM使用中删除
    • windows核心编程中一疑惑,有关共享变量的问题;小弟第一次提问,还请多多帮助
    • VC6创建一个ATL项目,没有找到Com要求的各个接口啊?

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

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