2010-10-03 90 views
2

我想向用戶顯示一個已知文件擴展名列表供他選擇。我知道這些都是存儲在註冊表HKEY_CLASSES_ROOT下通常是這樣的:從註冊表中讀取已知的文件擴展名/類型

.TXT - >(默認值)=「txtfile」

其中txtfile然後包含相關程序等

不幸的是,信息在註冊表中的那個地方還存儲大量的其他按鍵,如文件類型(例如txtfile)和條目類似

CAPICOM.Certificates(無論是)

如何確定的EN嘗試是文件擴展名?還是有不同的方式來獲得像API函數這些擴展?

(我不認爲它很重要,但我使用德爾福的計劃。)

+0

萬一有人有興趣,這是我最後寫道:http://sourceforge.net /p/dzlib/code/125/tree/dzlib/trunk/src/u_dzFileTypes.pas請注意,目前它大多未經測試。 – dummzeuch 2012-05-01 17:08:13

回答

3

不能保證HKEY_CLASSES_ROOT中每個以點爲前綴的鍵都用於文件關聯,但每個文件關聯都需要創建一個以點爲單位的鍵。有關File Types主題,請參閱MSDN。我們在這裏描述的方法符合Windows 設置文件關聯功能如何工作以獲得所有已知文件類型的列表。這是基於我以前的觀察,當我研究這個問題。

爲了實現這個目標,你需要做複雜的步驟如下:

  1. 枚舉一個點.之前每次按鍵,你可以使用RegQueryInfoKey()和RegEnumKeyEx()用於此目的。

  2. 在一個點之前的每個鍵,看看默認值數據:

    一個。如果默認值是非空,這足以說明「前點密鑰」用於所有Windows NT版本中的文件關聯,然後嘗試按值數據所述打開密鑰名稱,只需說TheKeyNameMentioned

    A1)如果子項shell\open\command下TheKeyNameMentioned,然後測試由該鍵的缺省值指向的路徑的存在;如果路徑存在,則存在與該擴展關聯的默認應用程序;如果路徑不存在,則默認應用程序是未知的。要獲取文件擴展名說明,請查看默認值TheKeyNameMentioned。要獲得程序說明,​​首先測試以下鍵是否包含等於EXE文件路徑的值名稱,即HKCR\Local Settings\Software\Microsoft\Windows\Shell\MuiCache。如果它存在,然後查看數值數據以獲取文件描述;如果不存在,請直接使用GetFileVersionInfo()獲取文件描述。

    A2)如果沒有子項shell\open\command下TheKeyNameMentioned,那麼默認的應用程序是未知的。要獲取文件擴展名說明,請查看默認值TheKeyNameMentioned

    b。在Windows Vista和更高版本上,當點[a]失敗時,您需要額外檢查。如果默認值爲爲空,請測試該密鑰是否有名爲OpenWithProgIDs的子項。

    • 如果OpenWithProgIDs子項存在,使用RegEnumValue()來查找符合條件的第一個遇到的值的名稱,也就是值名稱必須指向現有的密鑰(只是說: TheKeyNameMentioned。)與名稱的名稱相同。如果TheKeyNameMentioned存在,則這足以表示「前點密鑰」用於文件關聯。讀取點a1a2爲下一個步驟。

    • 如果OpenWithProgIDs子項不存在,則默認應用程序是未知的。要獲取文件擴展名說明,請查看默認值TheKeyNameMentioned

希望有所幫助。 :-)

+0

我已經提供了一些額外的信息給我的答案。 – Vantomex 2010-10-04 10:44:18

+1

不要只看'shell \ open \ command'子項。任何自定義動詞名稱都可以在'shell'鍵下注冊,而不僅僅是'open',並且並非所有動詞都使用'command'子鍵,有些使用'ddeexec'或'DropTarget'子鍵。 – 2010-10-04 23:41:28

+0

似乎還有另一種選擇:如果TheKeyNameMentioned的默認值爲空,則可以有一個FriendlyTypeName值,其中包含類型名稱。更糟的是,這個類型名稱可以指向一個資源字符串。有關示例,請參閱PerfFile(.pma)的條目。另見http://msdn.microsoft.com/en-us/library/windows/desktop/dd374120(v=vs.85).aspx – dummzeuch 2012-05-01 15:11:41

0

恕我直言 - 所有這些註冊表開始點(.)子項 - 對於文件擴展名。

例如,在您的情況下,.txt代表「txt」擴展名,而txtfile不以點開頭。

+0

這是你的猜測(我也猜到了)還是記錄在某處?我在MSDN中找到了HKEY_CLASSES_ROOT的文檔,但沒有說明哪些條目是擴展名,哪些不是。 – dummzeuch 2010-10-03 15:19:08

+0

這是我的「科學猜測」。我試圖從點開始在HKEY_CLASSES_ROOT下添加一個新的子項。然後添加相應的東西,最後稱爲'SHChangeNotify'。而且 - 瞧!這工作! – valdo 2010-10-03 18:08:26

+0

我的印象是「txtfile」是一個間接的級別。你可以有例如「txtfile」和指向它的幾個點式樣條目,例如「.txt」,「.ini」,「.csv」然後全部指向存儲共享設置的「txtfile」。 – 2010-10-04 09:41:33

1

對於命令行替代方案,Windows中包含的assoc命令行程序顯示已註冊的文件擴展名。

c:\> assoc 
.3g2=VLC.3g2 
.3gp=VLC.3gp 
.3gp2=VLC.3gp2 
.3gpp=VLC.3gpp 
... 

我不確定這是哪個動詞。 Open也許?我也不確定哪個擴展名會出現在這個列表中。也許可以從命令行打開的文件的擴展名。

然後,爲了找出可執行文件映射到每個文件類型,ftype命令將告訴:

c:\> ftype VLC.3g2 
VLC.3g2="c:\vlc.exe" --started-from-file "%1" 
+0

今天學到了新東西......對於那些想知道的人:這個命令已經存在於Windows XP。 – dummzeuch 2012-02-15 08:48:25