E);
(2)运行COM服务EXE方式
在运行COM服务EXE前只需要注册类对象即可:
[cpp] view plaincopyprint hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE);
hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE);
注册的类对象通过之前Init已经实现了:
[cpp] view plaincopyprint _Module.Init(ObjectMap, hInstance, &LIBID_BANKLib);
_Module.Init(ObjectMap, hInstance, &LIBID_BANKLib);注意:由于采用的运行EXE方式,只要此EXE进程退出,客户端即会出现调用不到接口的现象,虽然不会报接口出错,但得到的数据都是0。
二、客户端的设计
客户端要能调用到服务端的接口,必须满足两个条件:
(1)服务器开启了服务;
(2)知道服务器端的IID与CLSID;
1、在客户端我们先定义IID与CLSID:
[cpp]
///////////////////////////////////////CLSID & IID
const IID IID_IAccount = {0xEF327845,0x40A8,0x4AE0,{0x90,0x50,0xEA,0x7F,0xAD,0x02,0x75,0xEA}};
const IID LIBID_BANKLib = {0x98ECF356,0x06EF,0x4F72,{0xA3,0xA0,0x6E,0xCA,0x37,0x25,0x50,0x9E}};
const CLSID CLSID_Account = {0xEB914BA1,0x3C9C,0x4321,{0xBB,0x87,0xD2,0xF8,0xE3,0xEF,0xEB,0x09}};
///////////////////////////////////////CLSID & IID
const IID IID_IAccount = {0xEF327845,0x40A8,0x4AE0,{0x90,0x50,0xEA,0x7F,0xAD,0x02,0x75,0xEA}};
const IID LIBID_BANKLib = {0x98ECF356,0x06EF,0x4F72,{0xA3,0xA0,0x6E,0xCA,0x37,0x25,0x50,0x9E}};
const CLSID CLSID_Account = {0xEB914BA1,0x3C9C,0x4321,{0xBB,0x87,0xD2,0xF8,0xE3,0xEF,0xEB,0x09}};
2、获得服务器的接口IAccount *pAccount;
通过CoCreateInstance获得IUnknown指针,然后通过IUnknown指针返回IAccount指针:
[cpp]
//创建对象实例,并返回IUnknown 指针
hr = CoCreateInstance(CLSID_Account, NULL,
CLSCTX_LOCAL_SERVER , IID_IUnknown, (void**)&pUnknown);
if(FAILED(hr))
{
MessageBox("创建对象实例失败!");
return false;
}
//通过IUnkonwn指针去查询接口指针,返回IAccount指针
hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
if(FAILED(hr))
{
MessageBox("没有查找的接口指针!");
return false;
}
pUnknown->Release();
//创建对象实例,并返回IUnknown 指针
hr = CoCreateInstance(CLSID_Account, NULL,
CLSCTX_LOCAL_SERVER , IID_IUnknown, (void**)&pUnknown);
if(FAILED(hr))
{
MessageBox("创建对象实例失败!");
return false;
}
//通过IUnkonwn指针去查询接口指针,返回IAccount指针
hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
if(FAILED(hr))
{
MessageBox("没有查找的接口指针!");
return false;
}
pUnknown->Release();
作者:chenyujing1234