0

私の質問を説明するのは少し難しいですが、最善を尽くします。

まず、C と WinAPI を使用して Multi-Document-Interface アプリを開発しています。私のプログラムは、コマンドライン引数を解析して複数のファイルを開くことができます。「X:\MyAppName.exe」「%1」という文字列 を、txt ファイルのコマンド リストで開くの下に配置して、Windows エクスプローラーで任意の .txt ファイルを右クリックし、アプリで開くことができるようにします。ただし、複数のファイルを選択すると、エクスプローラーはコマンド"X:\MyAppName.exe" "%1"を複数回実行するため、アプリの複数のインスタンスが開始されます。

ちょっと待って! それは最もトリッキーな部分ではありません。代わりに、私のアプリは、1 つのファイルを開くことと、一度に複数のファイルを開くことを、別々の視覚スタイルを持つ 2 つの異なるものとして扱います。一度に 1 つのインスタンスを実行し続けるという考えは知っています (ただし、それを実装する C コードは知りません)。しかし、複数のファイルを 1 つずつ開くことと、複数のファイルを同時に開くことの違いを見分ける方法がわかりません。

私はそれを明確にすることを願っています。

4

1 に答える 1

1

現在のようにレジストリを使用すると、単一のファイルから複数のファイルを直接区別することはできません。既にお気づきのように、要求された各ファイルはアプリの新しいコピーを開始します。単一インスタンス化を実装する場合 (これはそれほど難しいことではありません)、最初のファイルが要求されたときにそれを検出して短いタイマーを開始し、後続の各ファイルでそのタイマーをリセットすることができます。最終的に経過したら、収集したファイルの数を確認し、必要に応じてそれらに対処します。

代わりに、インターフェイスを実装するアウトプロセス COM オブジェクトをアプリ内に作成することをお勧めしIDropTargetます。その後、Windows は、単一のエントリ ポイントを介してファイル情報をアプリに送り込むことができます。アプリは、情報がどこから来ているかを気にする必要はありません。一度に複数のファイルだけでなく、さまざまな形式のファイル情報もサポートできます (Windows はファイル名だけを渡すことも、実際のファイル データ自体を渡すこともできます)。

Windows は、必要なファイル情報を保持する単一のIDataObjectオブジェクトを構築し、それをIDropTargetオブジェクトに渡します。IDropTargetアプリが既に実行されている場合、COM は既存のオブジェクトにアクセスできます。アプリがまだ実行されていない場合、COM はそのIDropTargetオブジェクトにアクセスする前にアプリを自動的に起動します。いずれにせよ、一度実行すると、IDropTarget渡されたデータを見て、それを受け入れるか拒否するかを決定できます。

COM オブジェクトを目的のファイル拡張子のCLSIDとして登録するDropTargetと、ユーザーはそのようなファイルをダブルクリックするか、そのようなファイルを選択して Enter キーを押すと、IDropTargetオブジェクトに渡されます。

アプリに を登録してAppPathから をアプリにCLSIDとして登録するDropTargetと、ユーザーは拡張子に関係なくファイルをアプリの exe ファイル自体にドラッグでき、IDropTargetオブジェクトに渡されます。

関数で同じ COM オブジェクトを使用するとRegisterDragDrop()、ユーザーは拡張子に関係なく、ファイルをアプリの UI に直接ドラッグでき、IDropTargetオブジェクトに渡されます。

于 2012-11-21T00:08:59.790 に答える