如图所示:

Test MsgBox COM Server菜单命令创建CSimpleMsgBoxImpl对象并调用DoSimpleMsgBox()。因为这
是个简单的方法,要写的代码不长。
我们先用CoCreateInstance()创建一个COM对象。
void DoMsgBoxTest(HWND hMainWnd)
{
ISimpleMsgBox* pIMsgBox;
HRESULT hr;
hr = CoCreateInstance ( __uuidof(CSimpleMsgBoxImpl), // 组件对象类的CLSID
NULL, // 非聚合
CLSCTX_INPROC_SERVER, // 只使用进程内服务器
__uuidof(ISimpleMsgBox), // 所请求接口的IID
(void**) &pIMsgBox ); // 容纳接口指针的缓冲
if ( FAILED(hr) )
return;
然后调用DoSimpleMsgBox()方法并释放接口。
pIMsgBox->DoSimpleMsgBox ( hMainWnd, _bstr_t("Hello COM!") );
pIMsgBox->Release();
}
就这么简单。代码中从头到尾都有TRACE语句,这样在调试器中运行测试程序就可以看到服务器的每一个方法
是如何被调用的。
另外一个菜单命令是调用CoFreeUnusedLibraries()函数,从中你能看到服务器DllCanUnloadNow()函数的运行。
其它细节-COM宏
COM代码中有些宏隐藏了实现细节,并允许在C和C++客户端使用相同的声明。本文中没有使用宏,但在例子代
码中用到了这些宏,所以必须掌握它们的用法。下面是ISimpleMsgBox的声明
struct ISimpleMsgBox : public IUnknown
{
// IUnknown 方法
STDMETHOD_(ULONG, AddRef)() PURE;
STDMETHOD_(ULONG, Release)() PURE;
STDMETHOD(QueryInterface)(REFIID riid, void** ppv) PURE;
// ISimpleMsgBox 方法
STDMETHOD(DoSimpleMsgBox)(HWND hwndParent, BSTR bsMessageText) PURE;
};
STDMETHOD()包含virtual关键字,返回类型和调用规范。STDMETHOD_()也一样,除非你指定不
同的返回类型。PURE扩展了C++的“=0”,使此函数成为一个纯虚拟函数。
STDMETHOD()和STDMETHOD_()有对应的宏用于方法实现——STDMETHODIMP和STDMETHODIMP_()。
例如DoSimpleMsgBox()的实现:
STDMETHODIMP CSimpleMsgBoxImpl::DoSimpleMsgBox ( HWND hwndParent, BSTR bsMessageText )
{
...
}
最后,标准的输出函数用STDAPI宏声明,如:
STDAPI DllRegisterServer()
STDAPI包括返回类型和调用规范。要注意STDAPI不能和__declspec(dllexport)一起使用,
因为STDAPI的扩展。输出必须使用.DEF文件。
更多内容请看PCdog.com--FTP服务器 代理服务器技术 刀片服务器专题
