協會如何運作

協會如何運作

我的文件關聯有問題。我的 C# 應用程式可以為其自己的副檔名設定檔案關聯,以便使用者雙擊它使用的專案檔案將開啟我的應用程式並載入該檔案。

這會導致兩個第三方元件出現問題。每個使用許可。

使用雙擊時,會出現兩個元件的許可證對話框。從可執行檔運行應用程式時,不會發生這種情況。如果我將適當的文件拖曳到我的應用程式捷徑上,應用程式將隨該文件啟動,並且不會出現許可證對話框。

因此我不得不得出結論,問題出在Windows執行檔案關聯操作的方式。

創建許可證代碼的人告訴我,問題可能是可執行文件名稱已更改,而許可證代碼拒絕它。我只能假設這與包含文件名的參數有關。

我試圖透過程式碼中的斷點捕獲程式碼執行,但即使斷點位於執行的第一行,我也無法讓它發生。無論 Windows 做什麼,都已經超越了這一點。

答案1

協會如何運作

當您在 Windows 資源管理器中雙擊某個檔案時,Windows shell 會在登錄中尋找該檔案的副檔名,以查看該副檔名是否已註冊。如果未註冊擴展名,Windows 將顯示「開啟方式」對話框,允許使用者選擇與檔案類型關聯的應用程式。如果擴充功能已註冊,Windows 將使用「open」指令呼叫 ShellExecute() 函數。它還將雙擊的檔案名稱作為命令列參數傳遞。

不過,關聯不僅僅是開啟一個檔案。如果您在資源管理器中右鍵單擊文字檔案 (.TXT),您將在上下文功能表頂部看到兩個項目。第一個名為「開放」。選擇此選單項目與在資源管理器中雙擊檔案相同。當您選擇「開啟」時,NOTEPAD.EXE 將啟動並載入所選檔案(假設預設 Windows 安裝)。第二個選單項目稱為「列印」。點擊此選單項目將導致列印文件而不顯示記事本。

其他文件類型在資源管理器的上下文功能表上顯示更多項目。例如,如果右鍵單擊 Microsoft PowerPoint 文件,您將看到名為「開啟」、「新建」、「列印」和「顯示」的上下文功能表項目。特定文件類型的上下文選單中顯示的項目是從註冊表中取得的。

在 Windows 中至少有兩種建立檔案關聯的方法。一種方法是在 Windows 資源管理器中右鍵單擊文件,然後從上下文選單中選擇開啟方式...。當您這樣做時,Windows 將顯示「開啟方式」對話方塊。當然,這種方法需要使用者介入。當您部署應用程式時,您可能不希望強制使用者手動設定檔案關聯。

建立關聯的更好方法是從應用程式中建立各種註冊表項。一個好的安裝程式將為您建立註冊表項,但有時您需要對該過程進行更多控制。

註冊協會

註冊文件關聯需要建立兩個單獨的註冊表項。這兩個密鑰都是在HKEY_CLASSES_ROOT註冊表的部分中建立的。

檔案副檔名密鑰

第一個鍵是檔案副檔名,前面有一個點。

HKEY_CLASSES_ROOT\.zzy

在生產應用程式中,您應該在嘗試建立新金鑰之前檢查註冊表以確保某個金鑰不存在。如果金鑰已經存在,您的應用程式將需要提示使用者替換檔案關聯,或準備完全使用不同的檔案副檔名。

該鍵的值連結到您將建立的第二個鍵。事實上,它是第二個鍵的名稱。對於範例程序,我將此鍵的值指定為「Test App File」。該值可以是您選擇的任何值,但是,與第一個金鑰一樣,您必須確保註冊表中尚不存在該金鑰。

應用程式關聯密鑰

第二個鍵與第一個鍵的預設值具有相同的名稱。

HKEY_CLASSES_ROOT\Test App File

該項必須至少有一個子項。 Windows 在執行應用程式時使用此子項。整個密鑰的結構如下:

HKEY_CLASSES_ROOT
  Test App File
    shell
      open
        command

提供給命令鍵的字串是應用程式的完整路徑和檔名,後面接著%1。例如:

C:\MyApp\MyApp.exe %1

當 Windows 啟動應用程式時,它會替換%1符號,其中包含在 Windows 資源管理器中雙擊的檔案的路徑和檔案名稱。該值作為命令列參數傳遞到您的應用程式。

附加按鍵

您可以在檔案關聯項下建立其他子項。一把這樣的鑰匙就是DefaultIcon鑰匙。此鍵用於指定 Windows shell 將在註冊類型的檔案旁邊顯示的圖示。如果您只註冊了一種文件類型並且該文件類型應使用應用程式圖標,則不需要此鍵。以下是 DefaultIcon 鍵的值如何找到指定預設應用程式圖示的關聯:

C:\MyApp\MyApp.exe,0

這指定在應用程式的 EXE 檔案中找到的第一個圖示應用作檔案關聯的顯示圖示。如果您的應用程式具有多種檔案類型,則可以透過變更逗號後面的圖示索引來指定其他圖示。例如,C++Builder 具有專案文件、表單文件、來源文件等的圖示。如果您查看下面的註冊表,HKEY_CLASSES_ROOT\BCBProject\DefaultIcon您將看到專案文件的圖示是圖示索引 4(至少對於 C++Builder 4 而言)。

如果您希望允許使用者列印文檔,除了開啟子項目之外,還可以新增列印子項目。 print 子鍵的值與 open 子鍵的值類似,但有一個例外:

C:\MyApp\MyApp.exe /p %1

請注意,該值的命令列開關為/p插入應用程式名稱和%1象徵。您的應用程式可以監視/p切換並在偵測到切換時採取適當的動作。

您可以為特定文件類型新增任意數量的子項。每個子項的名稱將顯示在資源管理器上下文功能表中。您只需為每個命令類型新增一個命令列開關,以便您的應用程式可以識別所選的上下文選單項目。如果您為子項目提供預設值,Windows 將使用該文字作為上下文選單項目文字。如果您不提供預設值,Windows 將使用選單項目的鍵名稱本身。

所有資訊均取自此文章

相關內容