0

"print"ファイル拡張子が与えられた場合、特定のShellExecute動詞(私の場合)を実際に呼び出さずに処理するようにプログラムが登録されているかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

5
#include <windows.h>
#include <Shlwapi.h>
#include <stdio.h>

#if _WIN32_WINNT <= 0x0501
#define ASSOCF_INIT_IGNOREUNKNOWN   0x00000400 
#endif

BOOL AssocExtHasVerb(LPCTSTR dotExt,LPCTSTR verb) 
{
    HKEY hKey;
    HRESULT hr = AssocQueryKey(ASSOCF_INIT_IGNOREUNKNOWN,ASSOCKEY_SHELLEXECCLASS,dotExt,verb,&hKey);
    if (SUCCEEDED(hr)) 
    {
        RegCloseKey(hKey);
        return TRUE;
    }
    return FALSE;
}


void main() 
{
    LPCTSTR ext=".txt",verb="print";
    printf("%s:%s=%d\n",ext,verb,AssocExtHasVerb(ext,verb));
}

レジストリを自分でクエリしたい場合(なぜですか?)、頭のてっぺんからいくつかの「リダイレクト」を処理できる必要があります。

  • (Vista +)最初にHKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \%。ext%\ UserChoiceを確認してください:(REG_SZ) "ProgId"
  • そのキーが空の場合は、HKCR \%。ext%を読み取ります:(REG_SZ) ""(デフォルト)

これでProgIdができたはずです。次に、HKCR \%ProgId%:(REG_SZ) "CurVer"を確認します。存在する場合(およびシェルサブキーがある場合)、「実際の」ProgIdが見つかった場合は、元のProgIdを引き続き使用します。

これで、HKCR \%ProgId%\ shell \%verb%を確認できます(文字列を含むコマンドサブキー、またはdroptargetやdde値などがあるかどうかを実際に確認する必要があります)

(XP +)progidの下に動詞が見つからなかった場合:

  • HKCR \ SystemFileAssociations \%。ext%\ shell \%verb%を確認してください

(XP +)まだ動詞が見つからない場合は、HKCR \%。ext%を読んでください:(REG_SZ) "PerceivedType"、空でない場合は、HKCR \ SystemFileAssociations \%PerceivedType%\shellを確認してください

それでも動詞が見つからない場合は、の下を確認してHKCR\*くださいHKCR\AllFilesystemObjectsHKCR\Unknown

(Win7はサブメニューなどを追加しました、私はそれらを考慮していません、そして私はおそらく他のいくつかのステップを省略しました、AFAIKはこれのすべてが文書化されているわけではありません)


これをすべて行ったとしても、動詞が存在する可能性があり、それを検出していません。シェル拡張機能は実行時に動詞を追加できます。これらをチェックする唯一の方法は、実際のファイルでIContextMenuを使用することです...

于 2011-03-25T17:53:37.120 に答える
2

私はあなたがレジストリをうろつくことができると思います。

HKCU\Software\Classes\<.extension>デフォルト値が必要なものを検索します。これを調べてくださいHKCU\Software\Classes\<value>\Shell\<verb>\Command。下の値が見つからない場合は、 try (またはそのエイリアス)HKCU\Software\Classesも試してください。HKLM\Software\ClassesHKCR

于 2011-03-24T20:44:40.580 に答える