web-dev-qa-db-ja.com

WindowsのWinRARコンテキストメニューとファイルタイプの検出

これまでのところ、ファイルの種類ではなくファイル拡張子に基づいたWindowsの表示コンテキストメニューを知っています。私はちょうどwinampでmp3拡張子を持つ空のテキストファイルでテストしました、そして結果は以下の通りです:

Winamp context menu

空のファイルを拡張子exeでテストするのと同じ方法で、Windowsは「管理者として実行」などのコンテキストメニューを表示します。 Executable's context menu

しかし、同じexe拡張子を持つsfxアーカイブを作成した場合、次の図に示すように、Windowsで異なるアイコンが表示され、WinRARで「ここに抽出」などの特別なコンテキストメニューが表示されます。

SFX context menu

私の質問は、Windowsリーダーのファイルヘッダーで関連データを表すか、WinRARに特別なファイル検出スキームがありますか?コンテキストメニューの作成中にWinRARが呼び出されなかったため、2番目のものは疑わしいです。

もう1つの質問は、ヘッダーを読み取るWindowsの動作(写真やビデオのサムネイルを作成するなど)が原因であるかどうかですが、拡張機能の重要性は低くなっていますか?コンテキストメニューに影響はありませんか?

5
Jones

Windowsのコンテキストメニューハンドラーは、staticdynamicの両方にすることができます。詳しく知りたい場合はさらに、 ショートカット(コンテキスト)メニューとショートカットメニューハンドラー の記事、特に 静的または動的ショートカットメニューメソッドの選択カスタマイズ動的動詞を使用したショートカットメニュー

これからの引用 Visual Basic Shell Programming本の抜粋

動的コンテキストメニュー

静的コンテキストメニューは、特定のタイプのすべてのファイルオブジェクトで同じであるため、制限されています。また、静的メニューで処理できるファイルの数は、コマンドの実行に使用されるプログラムによって制限されます。 20個のファイルを処理する必要がある場合はどうなりますか?ファイル自体の状態に基づいて異なる処理オプションが必要な場合はどうなりますか?ファイルのグループ用に1つのコンテキストメニューが必要で、単一のファイル用に別のコンテキストメニューが必要な場合もあります。ここで、動的なコンテキストメニューが役立ちます。

.。

1つまたは複数のファイルが選択されているかどうかに基づいて、異なるメニュー項目を表示したい場合があります。選択したファイルの数はIShellExtInit :: Initializeで決定できるため、これは簡単なことです。 メニュー項目をファイル自体に基づいて作成することもできます。選択したファイルの数に加えて、問題のファイル名もすでに知っているはずです。これは、ファイルを開いて情報を取得できることを意味します。 、および実際のデータに基づいてメニュー項目を作成します。または、ファイルの他の属性(作成日、サイズ、読み取り専用ステータスなど)を調べて、その情報に基づいてメニュー項目を作成することもできます。

最後に、ファイルが実際にWinRARのシェル拡張子DLL(疑わしいと思われるため)によって読み取られていることを証明する必要がある場合は、 によって登録されたさまざまなReadFile呼び出し)があります。 プロセスモニター WinRAR SFXを右クリックするだけで:

1

(コンテキストメニューハンドラーは、シェルが実行のためにExplorer.exeのメモリスペースに直接ロードする「処理中」のCOMオブジェクトであるため、プロセス名は、rarext.dllではなくExplorer.exeとして表示されます。)

ご覧のとおり、最初の7バイトを読み取って、EXEであることを確認します。

2

さらにデータを読み取った後(ヘッダーを取得して解析することは間違いありません)、オフセット101,376から7バイトを読み取って、古いEXEだけでなくWinRARSFXであることを確認します。

3

これにより、「WinRARで開く」、「WinRARで抽出する」など、「通常の」EXEでは追加されないさまざまなコンテキストメニューエントリを追加するように求められます。

さらに、WinRARの[設定]ダイアログには、SFXアーカイブを確認する場所:)というタイトルのオプションがあります。

4

ヘルプファイルの内容は次のとおりです。

「SFXアーカイブを確認する場所」オプションは、コンテキストメニューでSFXアーカイブの処理を制御します。 実行可能ファイルの内容をチェックし、それが自己解凍(SFX)アーカイブであるかどうかを検出すると、すべての「.exe」ファイルを右クリックするときに遅延が発生します。これは、WinRARがファイルデータを読み取って分析し、SFXであるかどうかを確認する必要があるためです。このような遅延は、高速のローカルハードドライブでは無視できますが、低速のネットワークディスクの場合は顕著になります。このオプションのグループにより、ローカルハードディスク、ネットワークディスク、およびCD-ROMやCD-ROMなどの他のディスクのSFX処理を有効または無効にできます。 USBとは別に。これらのオプションをオフにすると、SFXアーカイブを右クリックしたときにSFX関連のコンテキストメニュー項目がすべて表示されないため、「。exe」ファイルを右クリックしたときに実際に遅延が発生する場合にのみ、これらのオプションを無効にしてください。

それがあなたの疑問を静めることを願っています。 :)拡張機能の重要性が低く、「コンテキストメニューに影響を与えない」かどうかについての2番目の質問については、意味がわかりません。画像/ビデオのサムネイルでさえ、シェル拡張ハンドラー(DLL)によって生成されます。さまざまなハンドラーのリストを見つけることができます ここ 。ご覧のとおり、ショートカットメニュー、ドラッグアンドドロップ操作、アイコン、アイコンオーバーレイ、プロパティシートに至るまで、すべてのカスタムシェル拡張ハンドラーを使用できます。 、サムネイル、情報ヒント、メタデータ、エクスプローラー列、コピー/移動/削除/名前変更ダイアログ、検索...

編集:偶然にも、レイモンドチェンはたまたま 記事 今日もシェル拡張について投稿しました(読むことを忘れないでください 前のもの も)。

6
Karan

Windowsエクスプローラーはヘッダーを読み取りません。

レジストリキーに基づいて拡張機能用に最初に作成されたメニューであり、Windowsエクスプローラーのスタートアップキーと見なすことができます。

HKLM\SOFTWARE\Classes\Protocols\Filter
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks           
HKLM\Software\Classes\*\ShellEx\ContextMenuHandlers         
HKLM\Software\Classes\Directory\ShellEx\ContextMenuHandlers
HKLM\Software\Classes\Directory\Shellex\DragDropHandlers
HKLM\Software\Wow6432Node\Classes\Directory\Shellex\DragDropHandlers
HKLM\Software\Classes\Directory\Shellex\CopyHookHandlers
HKLM\Software\Classes\Directory\Background\ShellEx\ContextMenuHandlers
HKLM\Software\Classes\Folder\Shellex\ColumnHandlers
HKLM\Software\Wow6432Node\Classes\Folder\Shellex\ColumnHandlers
HKLM\Software\Classes\Folder\ShellEx\ContextMenuHandlers    
HKLM\Software\Classes\Folder\ShellEx\DragDropHandlers       
HKLM\Software\Classes\Folder\ShellEx\PropertySheetHandlers  
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 
HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 

HKCU\Software\Classes\*\ShellEx\ContextMenuHandlers 
HKCU\Software\Classes\Directory\Background\ShellEx\ContextMenuHandlers

HKEY_LOCAL_MACHINE\Software\ClassesおよびHKEY_CURRENT_USER\Software\Classesにファイル拡張子による検索があり、ファイル拡張子が見つかった場合は、指定されたファイルハンドラーを実行します。

0
STTR