46

プログラムに関連付けられているデータファイルをダブルクリックすると、アプリケーションが開かれ、ファイル名がパラメーターとしてアプリケーションに渡されるように、ファイル拡張子をC++アプリケーションに登録する最もクリーンな方法を知りたいです。

現在、wixインストーラーを使用してこれを行っていますが、アプリケーションがユーザーのコンピューターにインストールされない場合があるため、アプリケーションを介してレジストリキーを作成するオプションも必要です。

さらに、これは、アプリケーションが削除された場合、レジストリ内の未使用のエントリがそのまま残ることも意味しますか?

4

4 に答える 4

88

プロセスの基本的な概要は、このMSDNの記事に記載されています。重要な部分はリストの一番下にあります:

  • ProgIDを登録する

ProgID(基本的にはファイルタイプレジストリキー)は、アイコン、説明、ファイルをダブルクリックしたときに使用されるアプリケーションなどのコンテキストメニュー項目などの重要なファイルタイププロパティを含むものです。多くの拡張子は同じファイルタイプを持っているかもしれません。そのマッピングは次のステップで行われます。

  • ファイルタイプのファイル名拡張子を登録する

ここでは、拡張機能のレジストリ値を設定し、その拡張機能のファイルタイプを前の手順で作成したProgIDに設定します。

アプリケーションでファイルを開くために必要な最小限の作業は、2つのレジストリキーを設定/作成することです。このサンプル.regファイルでは、ファイルタイプ()を作成し、blergcorp.blergapp.v1ファイル拡張子()を関連付けます.blerg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command]
@="c:\path\to\app.exe \"%1\""
[HKEY_CURRENT_USER\Software\Classes\.blerg]
@="blergcorp.blergapp.v1"

今、あなたはおそらくこれをプログラムで達成したいと思うでしょう。絶対にコッシャーになるために、これらのキーの存在を確認し、それに応じてプログラムの動作を変更することができます。特に、一般的なファイル拡張子の制御を想定している場合はそうです。ただし、SetValue関数を使用してこれらの2つのキーを設定することにより、目標を達成できます。

私は正確なC++構文に肯定的ではありませんが、C#では構文は次のようになります。

Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command", null, @"c:\path\to\app.exe \"%1\"");
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.blerg", null, "blergcorp.blergapp.v1");

もちろん、各サブキーを手動で開き、ProgIDと拡張サブキーを手動で作成してからキー値設定することもできますが、このSetValue関数の優れた点は、キーまたは値が存在しない場合、それらが自動的に作成されることです。とても便利な。

ここで、使用するハイブについて簡単に説明します。MSDNの例を含め、オンラインの多くのファイルの関連付けの例では、これらのキーがで設定されていることが示されていますHKEY_CLASSES_ROOT。これを行うことはお勧めしません。HKEY_LOCAL_MACHINE\Software\Classesそのハイブは、 (システムのデフォルト)とHKEY_CURRENT_USER\Software\Classes(ユーザーごとの設定)のマージされた仮想ビューであり、ハイブ内のサブキーへの書き込みは、内の同じキーにリダイレクトされHKEY_LOCAL_MACHINE\Software\Classesます。これを行う直接的な問題はありませんが、この問題が発生する可能性があります。HKCR(HKLMにリダイレクト)に書き込み、ユーザーがHKCUで異なる値を持つ同じキーを指定した場合、HKCU値が優先されます。HKEY_CURRENT_USERしたがって、書き込みは成功しますが、設定が設定よりも優先されるため、変更は表示されませんHKEY_LOCAL_MACHINE

したがって、アプリケーションを設計する際には、これを考慮に入れる必要があります。HKEY_CURRENT_USERさて、反対に、ここでの私の例が示すように、あなたはにしか書くことができません。ただし、そのファイルの関連付け設定は現在のユーザーに対してのみ読み込まれ、アプリケーションがすべてのユーザーに対してインストールされている場合、他のユーザーがWindowsでファイルを開いたときにアプリケーションは起動しません。

それはあなたがやりたいことのためのまともな入門書になるはずです。さらに読むために私は提案します

また、同様の質問に対する私の同様の回答も参照してください。

于 2010-01-15T04:39:06.943 に答える
8

これは2段階のプロセスです。

1.拡張機能を処理するプログラムを定義します:(既存のプログラムを使用する場合を除く)
      1.1たとえば、「HKCU \\ Software \\Classes\\」にキーを作成します
          "Software \\ Classes \\ YourProgramName.file.ext"
      1.2サブキー「Software\\Classes \\ YourProgramName.file.ext\\DefaultIcon」を作成します
        1.2.1デフォルト値( "")をアプリケーションのフルパスに設定して取得する
              リソースからのアイコン
      1.3サブキー「Software\\Classes \\ YourProgramName.file.ext \\ Shell \\ OperationName\\Command」を作成します
          OperationName =たとえば、Open、Print、またはOther
        1.3.1デフォルト値( "")をアプリケーションのフルパスに設定+オプションのランタイムパラメータ(ファイル名)

2.ファイル拡張子をプログラムに関連付けます。
  2.1キーHKCU\\Software \\Classes\\。extを作成します-ここに拡張機能があります
  2.2デフォルト値をプログラム定義キーに設定
    ("YourProgramName.file.ext")

以下は、ファイル拡張子を関連付けるc#で記述されたプログラムの一部です。これはc++ではありませんが、それ自体を説明するのは簡単だと思います。AFAIKは、c ++のコードと同じではないにしても、非常に似ています。

1.1。


    RegistryKey keyPFCTExt0 = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc", true);
        if (keyPFCTExt0 == null)
        {
            keyPFCTExt0 = Registry.CurrentUser.CreateSubKey("Software\\Classes\\PFCT.file.enc");
            keyPFCTExt0.CreateSubKey("DefaultIcon");
                RegistryKey keyPFCTExt0ext = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc\\DefaultIcon", true);
                    keyPFCTExt0ext.SetValue("", Application.ExecutablePath +",0");
                keyPFCTExt0ext.Close();
            keyPFCTExt0.CreateSubKey("Shell\\PFCT_Decrypt\\Command");
        }
    keyPFCTExt0.SetValue("", "PFCT.file.enc");
    keyPFCTExt0.Close();

2.2。


    RegistryKey keyPFCTExt1 = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc\\Shell\\PFCT_Decrypt\\Command", true);
        if (keyPFCTExt1 == null)
            keyPFCTExt1 = Registry.CurrentUser.CreateSubKey("Software\\Classes\\PFCT.file.enc\\Shell\\PFCT_Decrypt\\Command");
        keyPFCTExt1.SetValue("", Application.ExecutablePath + " !d %1"); //!d %1 are optional params, here !d string and full file path
        keyPFCTExt1.Close(); 

于 2009-09-09T20:30:20.253 に答える
8

HKEY_CURRENT_USER\Software\Classes\<.ext>なぜ人々がそのデフォルト値(別の(ソフトウェアで作成された)クラスにリダイレクトする)と言い続けるのかわかりません。

動作しますが、によってオーバーライドされます

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<.ext>\UserChoice

そして、マイクロソフトは2番目の方法を推奨していると思います。これは、組み込みの「オープンウィズ」が行っていることだからです。この場合、Progid「キー」の値はのデフォルト値と同じですHKEY_CURRENT_USER\Software\Classes\<.ext>

于 2014-08-19T17:35:27.057 に答える
0

C#を使用して関連付けを操作しようとしたときに、次のことがわかりました。

  • hkcu \ software \ microsoft \ windows \ currentVersion \ explorer \ fileexts.reg\userchoice->ユーザー固有の設定用。openWithProgIdsキーの値は、hkcrのキーを指します。
  • hkcr \ xfile \ shell \ open\muiVerb値またはhkcr\xfile \ shell \ open \ command \defaultvalue->はオープンハンドラーに影響します。これは、プログラムへのパスを含む値です。
  • hkcr \ .x->メニューに関連するものの中でも特にコンテキストメニュー(新しいx)に影響します。

C ++コードはわかりませんが、これらの情報があれば、レジストリAPIを使用してレジストリを操作できる必要があります。

于 2019-04-30T10:56:38.977 に答える