在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#源代码”很可能是为了演示和学习这些通信方法而编写的实例。 1. 管道通信(Named Pipes) 命名管道是一种半双工的通信方式,可以在同一台计算机上的不同进程间或跨网络的进程间提供通信...
【源代码】 C# WinForms 模块 - 图片管理工具模块 在C# WinForms环境中开发图片管理工具,能够实现一系列与图像处理相关的功能,包括遍历指定目录下的所有图片,图片格式转换,打印图片,应用图片特效,调整图片的...
【描述】中的"Code for c#"表明这个压缩包包含的是C#的源代码,可能是为了演示或测试特定功能。"Sample Test"提示这些代码可能是示例或者测试用例,用于教学、学习或是验证某种编程概念或技术。 【标签】"c#"进一步...
SQL Server 2005提供了ADO.NET,这是一个强大的数据访问框架,用于连接、查询和操作数据库。在C#代码中,你可以使用SqlConnection对象建立与数据库的连接,SqlCommand对象执行SQL查询,SqlDataReader或...
一个是Microsoft.Office.Interop.Excel,这是微软提供的用于与Office应用进行交互的COM接口。另一个是System.Data.OleDb,它是.NET框架的一部分,用于处理ODBC(开放数据库连接)兼容的数据源,包括Excel文件。这两...
6. **错误处理**:大多数API函数返回一个错误代码,通常零表示成功,非零表示错误。在C#中,你可以检查返回值或使用` Marshal.GetLastWin32Error()` 获取最近的错误代码。 7. **异步调用**:对于可能阻塞UI线程的长...
1. **创建Excel工作簿和工作表**:使用Microsoft.Office.Interop.Excel库(需要安装Office或OpenXML SDK),创建一个新的Excel应用程序实例,并创建一个工作簿和工作表。 ```csharp using Excel = Microsoft.Office...
同时,源代码.txt文件可能包含了上述示例的源代码。在实际开发中,你可以根据项目需求调整这些示例,以适应更复杂的通信场景,比如传递更复杂的数据结构或者实现异步通信。 总之,C#利用WM_COPYDATA消息进行进程间...
3. **定义日志结构体**:为了将日志结构化,定义一个Go结构体,包含你希望记录的字段,如时间戳、级别、源、消息等。例如: ```go type Log struct { Timestamp time.Time `json:"timestamp"` Level string `...
《Spring Framework 3.2.0.RC2 ...综上所述,Spring Framework 3.2.0.RC2的各模块通过XML Schema进行配置,构建出一个高度灵活、可扩展的开发环境。理解并熟练运用这些模块,将有助于提升Java应用的开发效率和质量。
在IT行业中,BMP_CHANGE可能指的是一个与处理...在BMP_CHANGE-master这个压缩包中,可能包含了源代码、示例、测试用例等资源,用于演示或实现特定的BMP图像处理功能。如果要深入了解,你需要解压并查看其中的具体内容。