[英]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>
鍵,請檢查:
(Default)
值,其中包含非空白字符串。 如果存在,則為文件擴展名的ProgID。 您可以打開HKEY_CLASSES_ROOT\\<ProgID>
鍵,查看它是否具有包含應用程序路徑的shell\\<verb>\\command
子鍵(可能存在多個<verb>
值,因此您必須枚舉它們)。 如果沒有,請檢查ProgID項是否具有CLSID
子項。 如果存在,則其(Default)
值將是處理與該ProgID相關聯的所有內容的COM對象的CLSID
。 您可以打開HKEY_CLASSES_ROOT\\CLSID\\<CLSID>
項,並檢查它是否具有InprocHandler
, InprocHandler32
, InprocServer
或InprocServer32
子項,該子項包含擁有該COM對象的EXE或DLL文件的完整路徑。
PersistentHandler
子項。 如果存在,則其(Default)
值將是處理該文件擴展名的COM對象的CLSID
。 您可以根據需要檢查CLSID。
一個OpenWithProgIds
子項。 如果存在,則它將包含您可以根據需要檢查的ProgID列表。
一個OpenWithList
子項。 如果存在,它將包含已注冊應用名稱的列表。 您可以打開HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\<AppName>
鍵以獲取每個應用程序的完整路徑。
還有其他幾種可能性(ShellEx鍵,DDE鍵,其他與Shell相關的COM對象鍵等),但我想您明白了。 可能需要進行大量挖掘,以確定哪個應用程序可以處理給定的文件擴展名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.