Essential COM – moniker

總之,COM提供一種機制,該機制使用了 monikers.

moniker是 COM object, 其實作 IMoniker interface. 該 interface 提供 BindToObject() function

在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ 找不到什麼有用的 (Visual Studiio Express 2010)

但在 C:\Windows\Dev-Cpp 找到了好東西

在 C:\Windows\Dev-Cpp\include\objidl.h, 好像是 IMoniker 的 interface 定義

 STDMETHOD(BindToObject)(THIS_ IBindCtx*,IMoniker*,REFIID,PVOID*) PURE;
 STDMETHOD(BindToStorage)(THIS_ IBindCtx*,IMoniker*,REFIID,PVOID*) PURE;
 STDMETHOD(Reduce)(THIS_ IBindCtx*,DWORD,IMoniker**,IMoniker**) PURE;
 STDMETHOD(ComposeWith)(THIS_ IMoniker*,BOOL,IMoniker**) PURE;
 STDMETHOD(IsEqual)(THIS_ IMoniker*) PURE;
 STDMETHOD(IsRunning)(THIS_ IBindCtx*,IMoniker*,IMoniker*) PURE;
 STDMETHOD(GetTimeOfLastChange)(THIS_ IBindCtx*,IMoniker*,LPFILETIME) PURE;
 STDMETHOD(Inverse)(THIS_ IMoniker**) PURE;
 STDMETHOD(CommonPrefixWith)(THIS_ IMoniker*,IMoniker**) PURE;
 STDMETHOD(RelativePathTo)(THIS_ IMoniker*,IMoniker**) PURE;
 STDMETHOD(GetDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR*) PURE;
 STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR,ULONG*,IMoniker**) PURE;
這些只是部分…

MkParseDisplayName() 似乎是一個 COM library 的 global function, 跟 CoGetClassObject(), CoInitialize() …等一樣。

COM 給我們的方法是,

請用 CreateClassMoniker() 這個 library function 得到 Class Moniker;

用 CreateBindCtx() 去得一個 binding context。

後來又有一個新 function 叫 CoGetObject () ,把以上數個動作包起來:

p.138 頁的圖非常好,可以好好看一下。

client 從 CoGetObject() 拿到的是 IClassFactory 的 pointer, 由它再去拿到 IApe 的 instance.

但在CoGetObject () 內部,BindToObject () 因為是 IMoniker 的 function, 我們必須先拿到一個 IMoniker 的指標,

為了拿到IMoniker 的指標,我們要拿一個字串(它是公開的,眾所周知的字串)去餵給 MkParseDisplayName(), 就可以拿到 IMoniker 指標。

看來,moniker 的目的是想要把「怎樣拿到 class object」這件事封裝起來。

本書告訴我們 moniker 有三種,代表三種演算法。

好! 現在我們進展到 p.139 ,下期待續…

—————————–

註1: moniker, 原意為「名字」


%d bloggers like this: