一个COM异步实现接口列集(Marshal)源代码实例
来源:互联网 发布:个人自动发卡源码带wap 编辑:程序博客网 时间:2024/05/21 15:50
在COM中实现异步是非常复杂但又非常有用的。Process如下:
1. 列集要在线程里使用的接口。
2. Create一个线程。
3. 在线程里Release列集。
4. 调用接口的方法。
头文件如下:
class ATL_NO_VTABLE CAsync
{
protected:
CAsync();
virtual ~CAsync();
private:
unsigned int RunThread();
static unsigned int __stdcall ThreadFunction(void *pFun); //线程函数
HANDLE m_hThread;
protected:
STDMETHOD(EnableAsyncFunction)( IUnknown *pUnkSink); //异步的方法,传入需要列集的接口
/////////////////////////////////////////////////////////////////////
IStream *m_pIStream;
};
源文件如下:
STDMETHODIMP CAsync::EnableAsyncFunction( IUnknown *pUnkSink)
{
HRESULT hr = S_OK;
_AsyncNeedMarshal *m_pIHelper=0;
hr = pUnkSink->QueryInterface(IID__NEED, (void**)&m_pIHelper);
if (SUCCEEDED(hr))
{
//列集m_pIHelper
if( FAILED( ::CoMarshalInterThreadInterfaceInStream(IID__AsyncNeedMarshal,m_pIHelper, &m_pIStream)) )
{
return S_FALSE;
}
m_pIHelper->Release();
}
if (SUCCEEDED(hr))
{
DWORD threadID = 0;
//起线程
m_hThread =CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, this, 0, &threadID);
if (0 == m_hThread)
{
hr = E_FAIL;
m_hThread = INVALID_HANDLE_VALUE;
}
}
return hr;
}
unsigned int __stdcall CAsync::ThreadFunction(void *pFun)
{
unsigned int result = 0;
if (pFun)
{
::CoInitialize(0);
//线程函数调用RunThread()方法,真正的运行内容在RunThread()内。
CAsyncMessageReceive &me = *(CAsyncMessageReceive*)pFun;
result = me.RunThread();
::CoUninitialize();
}
return result;
}
unsigned int CAsync::RunThread()
{
_AsyncNeedMarshal *m_pIHelper=0;
//反列集,注意抛出异常的原因有:列集的接口没有在注册表里注册。
HRESULT hr = ::CoGetInterfaceAndReleaseStream(m_pIStream, IID__AsyncNeedMarshal, (void**)&m_pIHelper );
//得到接口对象指针,可以调用该对象的方法了。
m_pIHelper ->Function();
if (m_pIHelper!=NULL)
{
m_pIHelper->Release();
m_pIHelper= 0;
}
return 0;
}
- 一个COM异步实现接口列集(Marshal)源代码实例
- 术语: Marshal (编列、列集)
- COM 接口得到实现该接口的对象实例
- COM连接点 - 一个COM接口实现多个连接点(3)
- COM专题四---实现COM接口(implement COM Interface)
- 接口(十)初始化一个接口实例
- (com组件)普通接口实例
- COM连接点 - Part III - 一个COM接口实现多个连接点
- 一个java接口实例
- 接口的一个实例
- Python 实现的一个使用接口的实例
- struct和byte[]相互转换(用Marshal类实现)
- struct和byte[]相互转换(用Marshal类实现)
- 一个Marshal.Copy的问题
- 一个ORM的实现(附源代码)
- @Scheduled+BlockingQueue实现异步接口
- Spring实现Async异步接口
- python 中数据序列化与反序列化(marshal)
- 鸣人
- 继续
- Solaris 8 Sparc平台下NS的安装
- Struts+Spring+Hibernate实例--Spring的bean.xml(Hibernate_Context.xml)
- 对于ibatis学习后的思考
- 一个COM异步实现接口列集(Marshal)源代码实例
- 注册个BLOG,欢迎大家来玩
- SQLSERVER按行统计
- 开发J2EE应用应遵循的几点原则
- DataSet 中的删除行问题
- 回家了
- 我的程序语录
- 由窗句柄获得对应可执行文件名
- 用INDY判断网页是否存在