GetClassFile 函式 (objbase.h)

傳回與指定檔名相關聯的CLSID。

語法

HRESULT GetClassFile(
  [in]  LPCOLESTR szFilename,
  [out] CLSID     *pclsid
);

參數

[in] szFilename

您要求相關聯 CLSID 之檔名的指標。

[out] pclsid

傳回時寫入相關聯 CLSID 之位置的指標。

傳回值

此函式可以傳回任何檔案系統錯誤,以及下列值。

傳回碼 描述
S_OK
已成功擷取 CLSID。
MK_E_CANTOPENFILE
無法開啟指定的檔名。
MK_E_INVALIDEXTENSION
登錄中指定的擴充功能無效。

備註

當指定檔名時, GetClassFile 會尋找與該檔案相關聯的 CLSID。 其用法的範例是在 OleCreateFromFile 函式中,它會傳遞檔名並需要相關聯的 CLSID,以及在 IMoniker::BindToObject 的 OLE 實作中,這會在啟動檔案型文件的連結時,呼叫 GetClassFile 來找出可開啟檔案的物件應用程式。

GetClassFile 會使用下列策略來判斷適當的 CLSID:

  1. 如果檔案包含記憶體物件,如呼叫 StgIsStorageFile 函式所決定, GetClassFile 會傳回以 IStorage::SetClass 方法寫入的 CLSID。
  2. 如果檔案不是記憶體物件, GetClassFile 會嘗試根據登錄中的模式比對檔案中的各種位。 登入中的模式可以包含表單的一系列專案:

    entry = offsetcbmaskvalue

    位移專案的值是檔案開頭或結尾的 位移而 cb 專案是以位元組為單位的長度。 這兩個值代表檔案中的特定位元組範圍。 (會從檔案結尾解譯位移專案的負值) 。 遮罩值是位掩碼,用來執行邏輯 AND 作業,以及位移cb 所指定的位元組範圍。 邏輯 AND 作業的結果會與 項目進行比較。 如果省略 遮罩 ,則會假設為所有遮罩。

    登錄中的每個模式都會以資料庫中的模式順序與檔案進行比較。 第一個模式,其中每個值專案符合 AND 作業的結果會決定檔案的 CLSID。 例如,登錄下列專案中包含的模式需要前四個字節是AB CD 12 34,最後四個字節必須是FE FE FE FE:

    HKEY_CLASSES_ROOT 
       FileType
          {12345678-0000-0001-C000-000000000095}
             0 = 0, 4, FFFFFFFF, ABCD1234 
             1 = -4, 4, , FEFEFEFE 

    如果檔案包含這類模式,CLSID {12345678-0000-0001-C000-00000000000095} 會與此檔案相關聯。

  3. 如果上述策略失敗, GetClassFile 會在登錄中搜尋對應至檔名之 .ext 部分的 擴展名 機碼。 如果資料庫專案包含有效的 CLSID,GetClassFile 會傳回該 CLSID。
  4. 如果所有策略都失敗,函式會傳回MK_E_INVALIDEXTENSION。

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows 2000 Server [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 objbase.h
程式庫 Ole32.lib
Dll Ole32.dll
API 集合 ext-ms-win-com-ole32-l1-1-5 (於 Windows 10 10.0.15063 版)

另請參閱

WriteClassStg