4

私のアプリケーションはかなり行儀の良い Windows 市民なので、それを Windows Vista/7 に移植するときに、カスタム ファイル形式の関連付けコードをDefault Programs API のサポートに置き換えました。ただし、アプリケーションのアンインストーラーを作成しようとしたときに問題が発生しました。既定のプログラムAPIを介してファイル形式の関連付けを削除する方法がないようです。

IApplicationAssociationRegistration::ClearUserAssociations を呼び出そうとしましたが、実際には他のアプリケーションの関連付けを含むすべての関連付けが削除され、OS のデフォルト状態が完全に復元されます (これはもちろん受け入れられません)。

IApplicationAssociationRegistration::SetAppAsDefaultを呼び出して、ファイル形式の関連付けを以前の「所有者」に戻そうとしましたが、OS がサポートしていない多くの固有のファイル形式をアプリケーションが処理し、以前の「所有者」が存在しないため、役に立ちません。Windows では、空の文字列を SetAppAsDefault に渡すことはできません...

それで、私は何をしますか?良い解決策はありますか?

4

4 に答える 4

1

Default Programs API の使い方が間違っていると思います。私の理解が正しければ、既定のプログラム機能は、既定のブラウザーとして Internet Explorer を置き換える法的要件により、Microsoft によって追加されたものです。アプリケーションで使用される通常のファイル関連付けとは別の機能セットを提供します。登録するファイルの関連付けが単純なだけの場合は、以前の動作に固執することをお勧めします。

MSDNから:Default Programs (Windows) :
Default Programsは主に、.mp3 や .jpg ファイルなどの標準ファイル タイプ、または HTTP や mailto などの標準プロトコルを使用するアプリケーション向けに設計されています。独自の独自のプロトコルとファイルの関連付けを使用するアプリケーションは、通常、既定のプログラム機能を使用しません。

于 2010-04-03T06:27:40.767 に答える
0

ファイルの関連付けはアプリで行うのではなく、インストーラーで行います。WiXを使用すると、インストール時にファイルの関連付けを設定し、アンインストール時にそれらを削除するインストーラーを作成できます。

于 2010-04-09T10:45:19.683 に答える
0

補足: Default Programs API を使用する代わりに、レジストリ内のファイルの関連付けを直接変更する場合でも、以下のすべての考慮事項が適用されます。

最初の実行時に、アプリケーションは、存在するすべてのファイル タイプの以前の所有者を収集し、IApplicationAssociationRegistration::QueryCurrentDefaultアプリが所有するストレージに保存する必要があります。

アンインストール時に、アプリケーションは を使用IApplicationAssociationRegistration::SetAppAsDefaultして、まだ所有しているファイルの関連付けを以前の所有者に復元しようとする必要があります。アプリがまだ所有しているが以前の所有者がわからない関連付けについては、HKCRレジストリに移動し、対応する拡張子、プロトコル、または MIME タイプのエントリを削除します。アプリが現在の所有者ではない関連付けには触れないでください。ユーザーの選択が上書きされます。

最初の実行時のバッチ バックアップとアンインストール時のクリーンアップが、既定のプログラム API によって単一の API 呼び出しとして提供されることを願っていますが、すべてのアプリに対してその動作を一般化することを決定するまでは、あなた次第です。

アンインストール時にアプリケーションが実行するクリーンアップは、アンインストールするユーザーに固有のものになることに注意してください。アプリケーションを使用してデフォルトを変更した可能性のある他のユーザーは、クリーンアップされません。

タスク スケジューラで上記の手順を実行する単純なユーザーごとのタスクを追加することで、各ユーザーのクリーンアップを自動化できます。タスクは 1 回実行するようにスケジュールされ、ユーザー タスク スケジューラから削除されます。このアプローチの唯一の潜在的な問題は、何人のユーザーが存在するかわからないため、そのタスクの dll をマシンから削除するタイミングを知ることができないことです。もう一度言いますが、その dll を ProgramData フォルダーに置いておけば、大したことではありません。

于 2010-04-09T07:42:31.700 に答える
0

ファイル拡張子をアプリケーションに関連付ける正しいコードは、Windows レジストリ設定を使用しています。通常、これはレジストリ ハイブを使用して (ユーザーに関係なく) マシン全体に対して行われます。また、エイリアス (レジストリ ショートカット)HKEY_LOCAL_MACHINE\SOFTWARE\Classesを介してより便利にアクセスできます。HKEY_CLASSES_ROOT

プロセスには次の 3 つのステップが含まれます。

  1. アプリケーションをインストールする前に、「古い」設定を保存します(ところで、そうしているのは素晴らしいことです。多くのアプリケーションは、マッピングを完全に削除するだけです!)

  2. 独自の関連付けを作成します。これを実行する方法の良い例は、Modifying File Associations With Registry Editor にあります。詳細な説明は MSDN にあります。

  3. アンインストール時には、手順(1)で保存された「古い」設定を復元し、インストールされた値をこれらの元の値に書き換えます。「古い」設定がない場合、適切な市民権とは、単にクラス キーをレジストリから完全に削除することを意味します。

デバッグを支援し、クラス (拡張子) マッピングがどのように変化するかを確認するためのツールの 1 つは、FileAsoc Windows File Association Editorにあります。アプリケーションのデバッグ中にファイル拡張子を回復できます。この Web ページには、値が正確にどのように格納されるかについての簡単な説明も記載されています。

お役に立てれば!

于 2010-04-08T19:52:38.920 に答える