COM编程入门:深入COM服务器
2006-07-21 11:44:59 来源:WEB开发网其中,CreateInstance()是创建COM对象的方法。LockServer()在必要时让COM库增加或减少服务器的引用计数。
一个定制接口的例子
这个工程是一个能运行的DLL服务器例子,对象由类工厂创建,此DLL服务器在 CSimpleMsgBoxImpl组件对象类中实现了一个接口:ISimpleMsgBox。
接口定义
我们的新接口是ISimpleMsgBox。所有的接口多必须从IUnknown派生。这个接口只有一个方法:DoSimpleMsgBox()。注意它返回标准类型HRESULT。所有的方法都应该返回HRESULT类型,并且所有返回到调用者的其它数据都应该通过指针参数操作。
struct ISimpleMsgBox : public IUnknown
{
// IUnknown 方法
ULONG AddRef();
ULONG Release();
HRESULT QueryInterface( REFIID riid, void** ppv );
// ISimpleMsgBox方法
HRESULT DoSimpleMsgBox( HWND hwndParent, BSTR bsMessageText );
};
struct __declspec(uuid("{7D51904D-1645-4a8c-BDE0-0F4A44FC38C4}")) ISimpleMsgBox;
有__declspec的一行将一个GUID赋值给ISimpleMsgBox,并且以后可以用__uuidof操作符来获取GUID。这两个东西都是微软的C++的扩展。
DoSimpleMsgBox()的第二个参数是BSTR类型。意思是二进制串——即定长序列位的COM表示。BSTRs主要用于Visual Basic 和 Windows Scripting Host之类的脚本客户端。
接下来这个接口由CSimpleMsgBoxImpl C++类来实现。其定义如下:
class CSimpleMsgBoxImpl : public ISimpleMsgBox
{
public:
CSimpleMsgBoxImpl();
virtual ~CSimpleMsgBoxImpl();
// IUnknown 方法
ULONG AddRef();
ULONG Release();
HRESULT QueryInterface( REFIID riid, void** ppv );
// ISimpleMsgBox 方法
HRESULT DoSimpleMsgBox( HWND hwndParent, BSTR bsMessageText );
protected:
ULONG m_uRefCount;
};
class __declspec(uuid("{7D51904E-1645-4a8c-BDE0-0F4A44FC38C4}")) CSimpleMsgBoxImpl;
当某一客户端想要创建一个SimpleMsgBox COM对象时,它应该用下面这样的代码:
ISimpleMsgBox* pIMsgBox;
HRESULT hr;
// 组件对象类的CLSID
hr = CoCreateInstance ( __uuidof(CSimpleMsgBoxImpl), NULL, // 非聚合
CLSCTX_INPROC_SERVER, // 进程内服务器
__uuidof(ISimpleMsgBox), // 所请求接口的IID
(void**) &pIMsgBox ); // 返回的接口指针的地址
更多精彩
赞助商链接