簡體   English   中英

在應用程序中注冊的擴展名列表

[英]List of extensions registered with an application

對於一個應用程序(例如:excel.exe),我想知道所有擴展名(例如:.xlt,.xlsx等)都已向應用程序(excel.exe)注冊。 如何實現呢?

平台:Windows

語言:C / C ++ / C#

不幸的是,文件擴展名注冊的使用可能有點復雜。 沒有確定的API可以提取您要查找的信息。 IQueryAssociations接口,但是它在查詢方式上沒有給您很大的靈活性。 它更像是一對一查詢,但是您正在尋找“多對一”查詢。 因此,您將必須直接在注冊表中查找該信息。

使用RegOpenKeyEx()打開HKEY_CLASSES_ROOT配置單元,並使用RegEnumKeyEx()枚舉其所有直接子鍵,查找以句點開頭的鍵名。 這將為您提供已知文件擴展名的列表。

對於每個HKEY_CLASSES_ROOT\\<ext>鍵,請檢查:

  1. (Default)值,其中包含非空白字符串。 如果存在,則為文件擴展名的ProgID。 您可以打開HKEY_CLASSES_ROOT\\<ProgID>鍵,查看它是否具有包含應用程序路徑的shell\\<verb>\\command子鍵(可能存在多個<verb>值,因此您必須枚舉它們)。 如果沒有,請檢查ProgID項是否具有CLSID子項。 如果存在,則其(Default)值將是處理與該ProgID相關聯的所有內容的COM對象的CLSID 您可以打開HKEY_CLASSES_ROOT\\CLSID\\<CLSID>項,並檢查它是否具有InprocHandlerInprocHandler32InprocServerInprocServer32子項,該子項包含擁有該COM對象的EXE或DLL文件的完整路徑。

  2. PersistentHandler子項。 如果存在,則其(Default)值將是處理該文件擴展名的COM對象的CLSID 您可以根據需要檢查CLSID。

  3. 一個OpenWithProgIds子項。 如果存在,則它將包含您可以根據需要檢查的ProgID列表。

  4. 一個OpenWithList子項。 如果存在,它將包含已注冊應用名稱的列表。 您可以打開HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\<AppName>鍵以獲取每個應用程序的完整路徑。

還有其他幾種可能性(ShellEx鍵,DDE鍵,其他與Shell相關的COM對象鍵等),但我想您明白了。 可能需要進行大量挖掘,以確定哪個應用程序可以處理給定的文件擴展名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM