COM进程外组件的实现vc++

说明进程外组件的实现有三个部分组成分别是:

进程外组件:com_test->simple(接口)

代理存根  :com_proxy

客户端    :com_client

开发环境:WIN7+VS2010

(一) 创建进程外组件

使用VS2010创建ATL项目,项目名称是com_test,点击确定之后需要注意的是选择可执行程序,而不是dll!,其他保持默认,之后类似进程内组件,添加一个简单对象,

simple,同时添加一个自定义接口,我是这样做的,分别修改三个文件 com_test.idl,simple.c和simple.cpp

在com_test.idl文件的接口描述中添加

interface Isimple : IDispatch{
	HRESULT test(int a,int b);
};

在simple.h文件中添加

STDMETHOD(test)(int a,int b);

在simple.cpp文件中添加

STDMETHODIMP Csimple::test (int a,int b)
{
	int c=a+b;
	char buf[20]={0};
	sprintf(buf,"%d",c);
	MessageBoxA(NULL,buf,"test",0);
	return S_OK;
}

之后Ctrl+F5即可完成,这样进程外组件就完成了

(二)代理存根对象的实现com_proxy.dll

将com_test.idl文件保存到一个比较干净的目录当中,使用VS2010的midl工具,进入com_test.idl文件所在目录,使用midl ..\com_test.idl命令来编译获

得com_test.h,com_test.tlb,com_test_i.c,com_test_p.c,dlldata.c,然后创建win32的控制台项目,注意创建一个dll的空项目,添加上述6个文件,编辑项目属性,其实修

改的只有两处,一是:C++的预处理器中的预处理定义添加  REGISTER_PROXY_DLL,二是在链接器条目的输入项中添加依赖项 rpcrt4.lib和uuid.lib,然后Crel+F5即可得到

com_test即可。

(三)模拟客户端com_client

创建一个win32的控制台项目,源代码如下:

#include
  
  
   
   
#include
   
   
    
    
#include"interface.h"//里面的内容是com_proxy项目中生成的.h文件
using namespace std;
extern "C" const GUID IID_Isimple=
{
	0xEFEFD281,0xBF44,0x416B,{0xBF,0x21,0x82,0xBA,0x42,0xF5,0x8A,0x4D}//在interface头文件中寻找
};
extern "C" const GUID CLSID_simple=
{
	0xB9FB4559,0x22AB,0x4D9E,{0xA0,0xE1,0xE2,0x89,0x3C,0x54,0x40,0x25}

};
int _tmain(int argc, _TCHAR* argv[])
{
	::CoInitialize (NULL);
	IUnknown*pUnk=NULL;
	Isimple* psim=NULL;
	HRESULT hr=::CoCreateInstance(CLSID_simple,NULL,CLSCTX_LOCAL_SERVER,IID_Isimple,(void**)&pUnk);
	if(S_OK==hr)
	{
		cout<<"CoCreateInstance successfully\n";		
	}
	else
		return 0;
	hr=pUnk->QueryInterface(IID_Isimple,(void**)&psim);
	if(S_OK==hr)
	{
		cout<<"QueryInterface successfully\n";
	}
	else
		return 0;
	hr=psim->test (2,3);
	psim->Release();
	pUnk->Release();
	return 0;
}

   
   
  
  

这样进程外组件就实现了但是还有一个问题,就是如果成员方法参数中含有指针则会失败,比如

 
HRESULT test(BSTR var)
{
MessageBox(NULL,var,L"测试",0);
return S_OK;
}

测试时不会得到任何内容,除此之外,我们怎么保证在客户端退出时,进程外组件也会同样退出???that is a problem,but not this blog to solve,so i will continue.



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值