1

AssocQueryString を使用して関連付け情報を取得しようとしています。myapp.exe は 32 ビットの実行可能ファイルです。これが私のコードです。

WCHAR commandline[_MAX_PATH];
DWORD size = _MAX_PATH;
HRESULT h = AssocQueryStringW(ASSOCF_OPEN_BYEXENAME, ASSOCSTR_COMMAND, execName, 0, commandline, &size);
if (SUCCEEDED(h)) 
{ 
    ... 
}

「execName」が 32 ビット アプリケーションの場合、この API は完璧に機能することがわかりました。例えば、

WCHAR *execName = L"mspaint.exe";

command = "C:\Windows\system32\mspaint.exe" "%1" を取得できます

ただし、64 ビット アプリケーション (例: PaintDotNet.exe) を指定すると、SUCCEEDED(h) は FALSE を返します。変数 h = 0x80070483、これは「ファイル拡張子に関連付けられたアプリケーションがない」ことを意味します。

上記の観察から、64 ビット アプリケーション情報を取得しようとすると、この API が失敗する可能性があると思います。

だから私の質問は:

  1. AssocQueryString の無視または間違った使用法はありますか?

  2. 32 ビット アプリから 64 ビット アプリ情報を取得する別の方法はありますか?

ところで、私は自分のアプリを 64 ビット アプリとしてコンパイルしたくありません。

いつもお世話になっております。

4

1 に答える 1

0

1. AssocQueryString の無視または間違った使い方はありますか?

1) ASSOCSTR_COMMAND を ASSOCSTR_EXECUTABLE に置き換えます

「C:\Windows\system32\mspaint.exe」だけを取得できます

2) SUCCEEDED は、負でない数値が真であることを示します

(((HRESULT)(時間)) >= 0)

したがって、成功を確認する場合は、結果がゼロであることを確認してください

2. 32 ビット アプリから 64 ビット アプリ情報を取得する別の方法はありますか?

1) Windows x64 の場合、フォルダー C:\Windows\system32\ は 64 ビット ファイル用です。

cf> http://www.samlogic.net/articles/32-64-bit-windows-folder-x86-syswow64.htm C:\Windows\System32 64 ビット ファイル用の Windows システム フォルダ (システム ディレクトリ) C:\ Windows\SysWOW64 32 ビット ファイル用の Windows システム フォルダー (システム ディレクトリ)

2)結果がゼロに等しいことを確認して、それを印刷します。この場合、SUCCEEDED(h) を使用しないでください。

AssocQueryString の戻り値 S_OK(0)、E_POINTER、S_FALSE(1)

于 2016-03-15T05:48:44.433 に答える