COM编程入门,十分浅显易懂
if ( SUCCEEDED ( hr ) )
{
// 用pISL调用方法
// 通知COM 对象不再使用它
pISL->Release();
}
接下来将详细讨论IUnknown接口。
基本接口——IUnknown
每一个COM接口都派生于IUnknown。这个名字有点误导人,其中没有未知(Unknown)接口的意思。它的原意是如果有一个指向某COM对象的IUnknown指针,就不用知道潜在的对象是什么,因为每个COM对象都实现IUnknown。 IUnknown 有三个方法:
AddRef() —— 通知COM对象增加它的引用计数。如果你进行了一次接口指针的拷贝,就必须调用一次这个方法,并且原始的值和拷贝的值两者都要用到。在本文的例子中没有用到AddRef()方法;
Release() —— 通知COM对象减少它的引用计数。参见前面的Release()示例代码段;
QueryInterface() —— 从COM对象请求一个接口指针。当coclass实现一个以上的接口时,就要用到这个方法;
前面已经看到了Release()的使用,但如何使用QueryInterface()呢?当你用CoCreateInstance()创 建对象的时候,你得到一个返回的接口指针。如果这个COM对象实现一个以上的接口(不包括IUnknown),你就必须用
QueryInterface()方法来获得任何你需要的附加的接口指针。QueryInterface()的原型如下:
HRESULT IUnknown::QueryInterface (
REFIID iid,
void** ppv );
以下是参数解释:
iid:所请求的接口的IID。
ppv:接口指针的地址,QueryInterface()通过这个参数在成功时返回这个接口。 让我们继续外壳链接的例子。它实现了IShellLink 和IPersistFile接口。如果你已经有一个IShellLink指针,pISL,可以从COM对象请求IPersistFile接口:
HRESULT hr;
IPersistFile* pIPF;