`
touchinsert
  • 浏览: 1327609 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个COM异步实现接口列集(Marshal)源代码实例

 
阅读更多

在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;
}

分享到:
评论

相关推荐

    进程间通讯(两个应用程序如何通讯)C#源代码.rar

    本资源包含的“进程间通讯C#源代码”很可能是为了演示和学习这些通信方法而编写的实例。 1. 管道通信(Named Pipes) 命名管道是一种半双工的通信方式,可以在同一台计算机上的不同进程间或跨网络的进程间提供通信...

    [源代码] C# WinForms 模块 - 图片管理工具模块

    【源代码】 C# WinForms 模块 - 图片管理工具模块 在C# WinForms环境中开发图片管理工具,能够实现一系列与图像处理相关的功能,包括遍历指定目录下的所有图片,图片格式转换,打印图片,应用图片特效,调整图片的...

    COMDEMO.rar_C#

    【描述】中的"Code for c#"表明这个压缩包包含的是C#的源代码,可能是为了演示或测试特定功能。"Sample Test"提示这些代码可能是示例或者测试用例,用于教学、学习或是验证某种编程概念或技术。 【标签】"c#"进一步...

    C#导出Excel高级报表的实例

    SQL Server 2005提供了ADO.NET,这是一个强大的数据访问框架,用于连接、查询和操作数据库。在C#代码中,你可以使用SqlConnection对象建立与数据库的连接,SqlCommand对象执行SQL查询,SqlDataReader或...

    C#winform读取Excel文档实例

    一个是Microsoft.Office.Interop.Excel,这是微软提供的用于与Office应用进行交互的COM接口。另一个是System.Data.OleDb,它是.NET框架的一部分,用于处理ODBC(开放数据库连接)兼容的数据源,包括Excel文件。这两...

    c# 调用windows API的实例

    6. **错误处理**:大多数API函数返回一个错误代码,通常零表示成功,非零表示错误。在C#中,你可以检查返回值或使用` Marshal.GetLastWin32Error()` 获取最近的错误代码。 7. **异步调用**:对于可能阻塞UI线程的长...

    实现GridView中的数据转换成EXCEL中,基于EXCEL模板.zip

    1. **创建Excel工作簿和工作表**:使用Microsoft.Office.Interop.Excel库(需要安装Office或OpenXML SDK),创建一个新的Excel应用程序实例,并创建一个工作簿和工作表。 ```csharp using Excel = Microsoft.Office...

    C# 软件之间通讯之WM_COPYDATA

    同时,源代码.txt文件可能包含了上述示例的源代码。在实际开发中,你可以根据项目需求调整这些示例,以适应更复杂的通信场景,比如传递更复杂的数据结构或者实现异步通信。 总之,C#利用WM_COPYDATA消息进行进程间...

    Go-通过TCP轻松将结构化日志发送到Datadog

    3. **定义日志结构体**:为了将日志结构化,定义一个Go结构体,包含你希望记录的字段,如时间戳、级别、源、消息等。例如: ```go type Log struct { Timestamp time.Time `json:"timestamp"` Level string `...

    spring-framework-3.2.0.RC2-schema.zip

    《Spring Framework 3.2.0.RC2 ...综上所述,Spring Framework 3.2.0.RC2的各模块通过XML Schema进行配置,构建出一个高度灵活、可扩展的开发环境。理解并熟练运用这些模块,将有助于提升Java应用的开发效率和质量。

    BMP_CHANGE

    在IT行业中,BMP_CHANGE可能指的是一个与处理...在BMP_CHANGE-master这个压缩包中,可能包含了源代码、示例、测试用例等资源,用于演示或实现特定的BMP图像处理功能。如果要深入了解,你需要解压并查看其中的具体内容。

Global site tag (gtag.js) - Google Analytics