IMoniker::ComposeWith 方法 (objidl.h)

結合目前的Moniker與指定的Moniker,以建立新的複合Moniker。

語法

HRESULT ComposeWith(
  [in]  IMoniker *pmkRight,
  [in]  BOOL     fOnlyIfNotGeneric,
  [out] IMoniker **ppmkComposite
);

參數

[in] pmkRight

要撰寫到這個Moniker結尾之 Moniker上IMoniker 介面的指標。

[in] fOnlyIfNotGeneric

如果 為 TRUE,則呼叫端需要非泛型組合,因此只有在 pmkRight 是這個 Moniker 可以撰寫的 Moniker 類別時,此作業才應該繼續進行,此 Moniker 可以透過形成泛型複合以外的一些方式來撰寫。 如果為 FALSE,方法可以視需要建立泛型複合。 大部分的呼叫端都應該將此參數設定為 FALSE

[out] ppmkComposite

接收複合Moniker指標的 IMoniker 指標變數指標。 成功時,實作必須在產生的Moniker上呼叫 AddRef ;呼叫者必須負責呼叫 Release。 如果發生錯誤,或當Moniker撰寫為無 (例如,使用專案Moniker或檔案Moniker撰寫反Moniker) ,則 *ppmkComposite 應設定為 NULL

傳回值

這個方法可以傳回標準傳回值E_OUTOFMEMORY和E_UNEXPECTED,以及下列值。

傳回碼 描述
S_OK
Moniker 已成功合併。
MK_E_NEEDGENERIC
表示 fOnlyIfNotGenericTRUE,但 Moniker 在建立泛型複合 Moniker 的情況下無法組合在一起。

備註

將兩個Moniker聯結在一起稱為 組合。 有時候,同一類別的兩個Moniker可以在稱為非泛型組合的內容中合併。 例如,代表不完整路徑的檔案Moniker和另一個代表相對路徑的檔案Moniker可以合併成代表完整路徑的單一檔案Moniker。 特定Moniker類別的非泛型組合只能在該Moniker類別的 ComposeWith 實作中處理。

結合任何類別的兩個Moniker稱為 泛型組合,可透過 呼叫 CreateGenericComposite 函式來完成。

Moniker 的組成是關聯作業。 也就是說,如果 A、B 和 C 是 Moniker,則 Comp () 代表組合作業 Comp ( Comp ( A、B ) 、C )

一律等於 Comp ( A、Comp ( B、C ) ) 。

來電者附註

若要結合兩個Moniker,您應該呼叫 ComposeWith ,而不是呼叫 CreateGenericComposite 函式,讓第一個 Moniker 有機會執行非泛型組合。

提供專案 Moniker 來識別其物件的 物件會呼叫 ComposeWith ,以提供可完整識別物件位置的 Moniker。 例如,這適用於支持連結至檔部分的伺服器,或支持連結至其檔內內嵌物件的容器。 在這種情況下,您會執行下列動作:

  1. 建立識別物件的專案Moniker。
  2. 取得識別物件容器的Moniker。
  3. 在識別容器的Moniker上呼叫 ComposeWith ,並將專案Moniker傳遞為 pmkRight 參數。

實作者的注意事項

您可以使用非泛型或泛型組合,使用 pmkRight 指向的 Moniker 來撰寫目前的 Moniker。 如果 pmkRight 所指示的 Moniker 類別與目前 Moniker 的類別相同,可以使用 pmkRight 的內容來執行更聰明的非泛型組合。

在撰寫新的Moniker類別時,您必須決定是否有任何類型的Moniker,無論是您自己的類別還是另一個類別,您想要提供特殊處理。 如果是,請實作 ComposeWith 來檢查 pmkRight 是否為應該具有此處理之類型的 Moniker。 若要這樣做,您可以呼叫Moniker的 IPersist::GetClassID 方法,或者如果您已定義支援自定義介面的Moniker物件,您可以在該介面的Moniker上呼叫 QueryInterface 。 特殊處理範例是絕對檔案Moniker與相對檔案Moniker的非一般組合。 特殊Moniker最常見的案例是moniker類別的反轉, (您從 IMoniker::Inverse) 實作傳回的任何專案。

如果 pmkRight 完全否定接收者,讓產生的複合是空的,您應該在 ppmkComposite 中傳回 NULL,並傳回狀態代碼S_OK。

如果 pmkRight 參數不是您提供特殊處理之類別,請檢查 fOnlyIfNotGeneric 以判斷接下來要執行的動作。 如果 fOnlyIfNotGenericTRUE,請透過 ppmkComposite 傳回 NULL,並傳回狀態代碼MK_E_NEEDGENERIC。 如果 fOnlyIfNotGenericFALSE,請呼叫 CreateGenericComposite 函式以一般方式執行組合。

實作特定附注

實作 備註
反Moniker 如果 fOnlyIfNotGenericTRUE,此方法會將 ppmkComposite 設定為 NULL moniker,並傳回MK_E_NEEDGENERIC;否則,方法會傳回將兩個Moniker合併成泛型復合的結果。 請注意,在反Moniker右側撰寫檔案、專案或指標Moniker會產生泛型複合,而不是撰寫成不做任何內容,就像反轉組合順序的情況一樣。
類別Moniker 遵循合約,其行為就像是專案Moniker,因為它可以傳回E_INVALIDARG和MK_E_NEEDGENERIC等等。
檔案Moniker 如果 pmkRight 是反 Moniker,則傳回的 Moniker 為 NULL。 如果 pmkRight 是最左邊的元件是反 Moniker 的複合,則傳回的 Moniker 是已移除最左邊反 Moniker 的複合。 如果 pmkRight 是檔案 Moniker,此方法會盡可能將兩個 Moniker 折疊成單一檔案 Moniker。 例如,如果兩 (個檔案 Monikers 都代表絕對路徑,例如 d:\work 和 e:\reports) ,則傳回的 Moniker 為 NULL ,且傳回值MK_E_SYNTAX。 如果 pmkRight 不是反 Moniker 或檔案 Moniker,此方法會檢查 fOnlyIfNotGeneric 參數;如果為 FALSE,則方法會將這兩個 Moniker 合併為泛型複合;如果為 TRUE,此方法會將 *ppmkComposite 設定為 NULL ,並傳回MK_E_NEEDGENERIC。
泛型複合Moniker 如果 fOnlyIfNotGenericTRUE,此方法會將 *pmkComposite 設定為 NULL ,並傳回MK_E_NEEDGENERIC;否則,方法會呼叫 CreateGenericComposite 函式,傳回合並兩個 Moniker 的結果。
專案Moniker 如果 pmkRight 是反 Moniker,則傳回的 Moniker 為 NULL。 如果 pmkRight 是最左邊的元件是反 Moniker 的複合,傳回的 Moniker 是移除最左邊反 Moniker 之後的複合。 如果 pmkRight 不是反 Moniker,則如果 fOnlyIfNotGenericFALSE,此方法會將這兩個 Moniker 合併為泛型複合;如果 fOnlyIfNotGenericTRUE,此方法會傳回 NULL Moniker 和傳回值MK_E_NEEDGENERIC。
OBJREF Moniker 如果 pmkRight 是反 Moniker,則傳回的 Moniker 為 NULL。 如果 pmkRight 是最左邊的元件是反 Moniker 的複合,則傳回的 Moniker 是已移除最左邊反 Moniker 的複合。 如果 pmkRight 不是反 Moniker 或複合 Moniker,其最左邊的元件是反 Moniker,此方法會檢查 fOnlyIfNotGeneric 參數。 如果是 FALSE,方法會將這兩個 Moniker 合併為泛型複合;如果為 TRUE,方法會將 *ppmkComposite 設定為 NULL ,並傳回MK_E_NEEDGENERIC。
指標 Moniker 如果 pmkRight 是反 Moniker,則傳回的 Moniker 為 NULL。 如果 pmkRight 是最左邊的元件是反 Moniker 的複合,傳回的 Moniker 是移除最左邊反 Moniker 之後的複合。 如果 fOnlyIfNotGenericFALSE,則傳回的 Moniker 是兩個 Moniker 的泛型複合;否則,方法會將 *ppmkComposite 設定為 NULL ,並傳回MK_E_NEEDGENERIC。
URL Moniker URL Moniker 支援兩個 URL 的組合:以相對 URL 撰寫的基底 URL。 此組合是根據相對 URL 上的 RFC 來完成。 如果 fOnlyIfNotGenericTRUE,則方法會傳回MK_E_NEEDGENERIC。 否則,此方法只會傳回 CreateGenericComposite (this, pmkRight, ppmkComposite) 。

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 objidl.h

另請參閱

CreateGenericComposite

IMoniker