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,以及下列值。
傳回碼 | 描述 |
---|---|
|
Moniker 已成功合併。 |
|
表示 fOnlyIfNotGeneric 為 TRUE,但 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。 例如,這適用於支持連結至檔部分的伺服器,或支持連結至其檔內內嵌物件的容器。 在這種情況下,您會執行下列動作:
- 建立識別物件的專案Moniker。
- 取得識別物件容器的Moniker。
- 在識別容器的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 以判斷接下來要執行的動作。 如果 fOnlyIfNotGeneric 為 TRUE,請透過 ppmkComposite 傳回 NULL,並傳回狀態代碼MK_E_NEEDGENERIC。 如果 fOnlyIfNotGeneric 為 FALSE,請呼叫 CreateGenericComposite 函式以一般方式執行組合。
實作特定附注
實作 | 備註 |
---|---|
反Moniker | 如果 fOnlyIfNotGeneric 為 TRUE,此方法會將 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 | 如果 fOnlyIfNotGeneric 為 TRUE,此方法會將 *pmkComposite 設定為 NULL ,並傳回MK_E_NEEDGENERIC;否則,方法會呼叫 CreateGenericComposite 函式,傳回合並兩個 Moniker 的結果。 |
專案Moniker | 如果 pmkRight 是反 Moniker,則傳回的 Moniker 為 NULL。 如果 pmkRight 是最左邊的元件是反 Moniker 的複合,傳回的 Moniker 是移除最左邊反 Moniker 之後的複合。 如果 pmkRight 不是反 Moniker,則如果 fOnlyIfNotGeneric 為 FALSE,此方法會將這兩個 Moniker 合併為泛型複合;如果 fOnlyIfNotGeneric 為 TRUE,此方法會傳回 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 之後的複合。 如果 fOnlyIfNotGeneric 為 FALSE,則傳回的 Moniker 是兩個 Moniker 的泛型複合;否則,方法會將 *ppmkComposite 設定為 NULL ,並傳回MK_E_NEEDGENERIC。 |
URL Moniker | URL Moniker 支援兩個 URL 的組合:以相對 URL 撰寫的基底 URL。 此組合是根據相對 URL 上的 RFC 來完成。 如果 fOnlyIfNotGeneric 為 TRUE,則方法會傳回MK_E_NEEDGENERIC。 否則,此方法只會傳回 CreateGenericComposite (this, pmkRight, ppmkComposite) 。 |
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | objidl.h |