![協会の仕組み](https://rvso.com/image/1317520/%E5%8D%94%E4%BC%9A%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF.png)
ファイルの関連付けに問題があります。C# アプリケーションでは、独自の拡張子に対してファイルの関連付けを設定できるため、ユーザーが使用するプロジェクト ファイルをダブルクリックすると、アプリケーションが開き、ファイルが読み込まれます。
これにより、2 つのサードパーティ コンポーネントで問題が発生します。それぞれライセンスを使用します。
ダブルクリックを使用すると、両方のコンポーネントのライセンス ダイアログが表示されます。実行可能ファイルからアプリを実行すると、これは発生しません。適切なファイルをアプリのショートカットにドラッグすると、アプリはそのファイルで起動し、ライセンス ダイアログは表示されません。
したがって、問題は Windows がファイルの関連付けアクションを実行する方法にあると結論付けざるを得ません。
ライセンス コードを作成する人たちによると、実行可能ファイル名が変更され、ライセンス コードがそれを拒否したことが問題である可能性が高いとのことです。これはファイル名を含む引数に関連しているとしか考えられません。
コード内のブレークポイントを介してコード実行をキャッチしようとしましたが、ブレークポイントが実行される最初の行にある場合でも、実行できません。Windows が何をしても、そのポイントを通過します。
答え1
協会の仕組み
Windows エクスプローラーでファイルをダブルクリックすると、Windows シェルはレジストリでファイルの拡張子を検索し、拡張子が登録されているかどうかを確認します。拡張子が登録されていない場合、Windows は [ファイルを開く] ダイアログ ボックスを表示し、ユーザーがファイルの種類に関連付けるアプリケーションを選択できるようにします。拡張子が登録されている場合、Windows は "open" コマンドで ShellExecute() 関数を呼び出します。また、ダブルクリックされたファイルの名前をコマンド ライン パラメータとして渡します。
ただし、関連付けは単にファイルを開くだけではありません。エクスプローラーでテキスト ファイル (.TXT) を右クリックすると、コンテキスト メニューの上部に 2 つの項目が表示されます。最初の項目は [開く] です。このメニュー項目を選択することは、エクスプローラーでファイルをダブルクリックするのと同じです。[開く] を選択すると、選択したファイルが読み込まれた状態で NOTEPAD.EXE が起動します (Windows の既定のインストールを想定)。2 番目のメニュー項目は [印刷] です。このメニュー項目をクリックすると、メモ帳がまったく表示されずにファイルが印刷されます。
他のファイルの種類では、エクスプローラーのコンテキスト メニューにさらに多くの項目が表示されます。たとえば、Microsoft PowerPoint ファイルを右クリックすると、[開く]、[新規作成]、[印刷]、[表示] という名前のコンテキスト メニュー項目が表示されます。特定のファイルの種類に対してコンテキスト メニューに表示される項目は、レジストリから取得されます。
Windows でファイルの関連付けを作成するには、少なくとも 2 つの方法があります。1 つは、Windows エクスプローラーでファイルを右クリックし、コンテキスト メニューから [プログラムから開く] を選択することです。これを行うと、Windows は [プログラムから開く] ダイアログを表示します。当然、この方法ではユーザーの介入が必要です。アプリケーションを展開するときに、ユーザーにファイルの関連付けを手動で設定させるのは望ましくないでしょう。
関連付けを作成するためのより良い方法は、アプリケーションからさまざまなレジストリ エントリを作成することです。優れたインストール プログラムではレジストリ エントリが自動的に作成されますが、プロセスをより細かく制御する必要がある場合があります。
協会の登録
ファイルの関連付けを登録するには、2 つの個別のレジストリ キーを作成する必要があります。両方のキーは、HKEY_CLASSES_ROOT
レジストリの セクションに作成されます。
ファイル拡張子キー
最初のキーは、ドットが先頭に付いたファイル拡張子の名前です。
HKEY_CLASSES_ROOT\.zzy
実稼働アプリケーションでは、新しいキーを作成する前に、レジストリをチェックしてキーが存在しないことを確認する必要があります。キーが既に存在する場合、アプリケーションはユーザーにファイルの関連付けを置き換えるように求めるか、まったく別のファイル拡張子を使用する準備をする必要があります。
このキーの値は、作成する 2 番目のキーにリンクされています。実際、これは 2 番目のキーの名前です。サンプル プログラムでは、このキーに「Test App File」という値を指定しました。この値は任意の値にすることができますが、最初のキーと同様に、キーがレジストリに既に存在していないことを確認する必要があります。
アプリケーション関連付けキー
2 番目のキーの名前は、最初のキーのデフォルト値と同じです。
HKEY_CLASSES_ROOT\Test App File
このキーには少なくとも 1 つのサブキーが必要です。Windows はアプリケーションを実行するときにこのサブキーを使用します。キー全体は次のように構成されます。
HKEY_CLASSES_ROOT
Test App File
shell
open
command
コマンドキーに与えられる文字列は、アプリケーションのフルパスとファイル名に続いて%1。 例えば:
C:\MyApp\MyApp.exe %1
Windowsがアプリケーションを起動すると、%1Windows エクスプローラーでダブルクリックされたファイルのパスとファイル名を持つシンボル。この値は、コマンド ライン パラメーターとしてアプリケーションに渡されます。
追加キー
ファイル関連付けキーの下に作成できるサブキーは他にもあります。そのようなキーの 1 つがDefaultIcon
キーです。このキーは、登録されている種類のファイルの横に Windows シェルが表示するアイコンを指定するために使用されます。登録されているファイルの種類が 1 つだけであり、そのファイルの種類でアプリケーション アイコンを使用する場合は、このキーは必要ありません。既定のアプリケーション アイコンを指定する関連付けの DefaultIcon キーの値は、次のようになります。
C:\MyApp\MyApp.exe,0
これは、アプリケーションの EXE ファイルで見つかった最初のアイコンを、ファイルの関連付けの表示アイコンとして使用することを指定します。アプリケーションに複数のファイル タイプがある場合は、コンマに続くアイコン インデックスを変更して、他のアイコンを指定できます。たとえば、C++Builder には、プロジェクト ファイル、フォーム ファイル、ソース ファイルなどのアイコンがあります。下のレジストリを見ると、HKEY_CLASSES_ROOT\BCBProject\DefaultIcon
プロジェクト ファイルのアイコンはアイコン インデックス 4 であることがわかります (少なくとも C++Builder 4 の場合)。
ユーザーがドキュメントを印刷できるようにするには、open サブキーに加えて print サブキーを追加できます。print サブキーの値は open サブキーの値と似ていますが、次の 1 つの例外があります。
C:\MyApp\MyApp.exe /p %1
この値にはコマンドラインスイッチがあることに注意してください。/pアプリケーション名と%1シンボル。アプリケーションは/pスイッチを検出し、スイッチが検出されたときに適切なアクションを実行します。
特定のファイルの種類に対して、必要な数のサブキーを追加できます。各サブキーの名前は、エクスプローラーのコンテキスト メニューに表示されます。アプリケーションが選択されたコンテキスト メニュー項目を識別できるように、各コマンドの種類に対してコマンド ライン スイッチを追加するだけで済みます。サブキーに既定値を指定すると、Windows はコンテキスト メニュー項目のテキストにそのテキストを使用します。既定値を指定しないと、Windows はメニュー項目にキー名自体を使用します。
すべての情報はここから取得されます記事。