设为首页 加入收藏

TOP

VC调用COM的方法总结 (一)
2014-11-23 19:30:40 】 浏览:313
Tags:调用 COM 方法 总结

在文章<<采用ATL模型代替lib dll 的调用 >>中我介绍了VC中通过ProgID用度CLSID调用COM的一种方法,现在介绍其它方法。

一、COM端的设计
1、COM接口的设计
设计方法原理可参考我的文章<<采用ATL模型代替lib dll 的调用 >>

我们决定导出四个接口:

[cpp]
public:
STDMETHOD(get_CurrentAccount)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_CurrentAccount)(/*[in]*/ double newVal);
STDMETHOD(Withdraw)(/*[in]*/double x);
STDMETHOD(Deposit)(/*[in]*/double x);

public:
STDMETHOD(get_CurrentAccount)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_CurrentAccount)(/*[in]*/ double newVal);
STDMETHOD(Withdraw)(/*[in]*/double x);
STDMETHOD(Deposit)(/*[in]*/double x);
类设计如下:

[cpp] view plaincopyprint class ATL_NO_VTABLE CAccount :
public CComObjectRootEx,
public CComCoClass,
public IDispatchImpl
{
public:
CAccount()
{
CurrentValue = 0;
}

DECLARE_REGISTRY_RESOURCEID(IDR_ACCOUNT)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CAccount)
COM_INTERFACE_ENTRY(IAccount)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IAccount
public:
STDMETHOD(get_CurrentAccount)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_CurrentAccount)(/*[in]*/ double newVal);
STDMETHOD(Withdraw)(/*[in]*/double x);
STDMETHOD(Deposit)(/*[in]*/double x);

protected:
double CurrentValue;
};

class ATL_NO_VTABLE CAccount :
public CComObjectRootEx,
public CComCoClass,
public IDispatchImpl
{
public:
CAccount()
{
CurrentValue = 0;
}

DECLARE_REGISTRY_RESOURCEID(IDR_ACCOUNT)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CAccount)
COM_INTERFACE_ENTRY(IAccount)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IAccount
public:
STDMETHOD(get_CurrentAccount)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_CurrentAccount)(/*[in]*/ double newVal);
STDMETHOD(Withdraw)(/*[in]*/double x);
STDMETHOD(Deposit)(/*[in]*/double x);

protected:
double CurrentValue;
};
在设计完成COM接口后,我们编写注册脚本文件Account.rgs(参考文章<>):

[cpp]
HKCR
{
NoRemove AppID
{
{2F2CD476-6C09-4CFD-A819-7BE66BBE2CAF} = s 'Bank'
'Bank.EXE'
{
val AppID = s {2F2CD476-6C09-4CFD-A819-7BE66BBE2CAF}
}
}
}

HKCR
{
NoRemove AppID
{
{2F2CD476-6C09-4CFD-A819-7BE66BBE2CAF} = s 'Bank'
'Bank.EXE'
{
val AppID = s {2F2CD476-6C09-4CFD-A819-7BE66BBE2CAF}
}
}
}
并把得到的.rgs文件导入到Res资源文件中。(目的将会在下面看到)

2、COM端提供服务有两种方式(测试时只要任选一种就可以了):
做为一个COM的服务器,为了实现服务器的调用逻辑,我们设计一个服务器的类,它继承自CComModule。

[cpp]
class CExeModule : public CComModule
{
public:
LONG Unlock();
DWORD dwThreadID;
HANDLE hEventShutdown;
void MonitorShutdown();
bool StartMonitor();
bool bActivity;
};

class CExeModule : public CComModule
{
public:
LONG Unlock();
DWORD dwThreadID;
HANDLE hEventShutdown;
void MonitorShutdown();
bool StartMonitor();
bool bActivity;
};且我们得到服务器模块的对象:

[cpp]
CExeModule _Module;

CExeModule _Module;
不管是采用哪种方式我们都要让服务器初始化,目的是将第1、部设计的COM接口和当前的服务器对象绑定:

[cpp]
_Module.Init(ObjectMap, hInstance, &LIBID_BANKLib);

_Module.Init(ObjectMap, hInstance, &LIBID_BANKLib);

(1)注册COM服务器方式
由于在第1、步中我们把Account.rgs导入到RES文件中,所以注册服务器前得更新此资源,然后调用RegisterServer注册:

[cpp]
_Module.UpdateRegistryFromResource(IDR_Bank, TRUE);
nRet = _Module.RegisterServer(TRUE);

_Module.UpdateRegistryFromResource(IDR_Bank, TRUE);
nRet = _Module.RegisterServer(TRU

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇vc 下拉列表框 编程 下一篇模板的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目