说明进程外组件的实现有三个部分组成分别是:
进程外组件: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.