-1

以前ShellExecuteEx()は実行可能ファイルを呼び出していました。そして、以下は私がSHELLEXECUTEINFO構造に設定したパラメータです。

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS|SEE_MASK_UNICODE;// Set Unicode Flag
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpParameters = TEXT ("/s");
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;
ShExecInfo.lpFile = TEXT ( ".\\bin\\x86\\installerx86.exe" ); 

ShExecInfo.fMaskUnicodeに設定されていますが、ShExecInfo.lpFile先頭に。が付いていません"\\?\"。この場合、私のコードはUnicodeと互換性がありますか?

4

1 に答える 1

6

あなたは概念を混同しています。カーネルコードがこれらの文字列を使用するまで、すべてのパス文字列はUnicodeです。非UnicodeバージョンのShellExecuteEx(ShellExecuteExAという名前)は、すべての文字列を変換し、SHELLEXECUTEINFOA構造をSHELLEXECUTEINFOW構造に変換してから、実際のAPI関数ShellExecuteW()を呼び出します。マクロがそれらの間で選択するため、コードにこれらの実際の識別子名は表示されませんが、ShellAPI.hSDK#includeファイルで確実に表示できます。

これSEE_MASK_UNICODEはかなり不思議なオプションであり、正しく設定するのは困難です。CREATE_UNICODE_ENVIRONMENTこれはCreateProcessのオプションに関連していると思います。これは、新しいプロセスの環境にUnicode文字が含まれている可能性があることを示しています。

パス文字列の\\?\プレフィックスは、Win32パス名とネイティブWindowsカーネルパス名のどちらかを選択します。Win32は、ネイティブオペレーティングシステム上のAPIレイヤーです。以前は複数のAPIレイヤーがあり、OS / 2とPosixはかつてサポートされていましたが、使用されなくなりました。ネイティブオペレーティングシステムはWin32とは非常に異なり、VMSオペレーティングシステムに似ています。これは、DavidCutlerがMicrosoftに雇われてNTを設計する前に取り組んだものです。C:ドライブのようなものはありません、それは、例えば、知っているだけ\Device\Harddisk0\Partition0です。

APIレイヤーは、これら2つの世界の間を変換します。パス文字列の前にパス文字列を付けることにより、\\?\Win32にパス文字列をそのまま使用するように指示します。これにより、ネイティブパス文字列の機能を取得し、32726文字までのパスをサポートし、悪名高いWin32MAX_PATHの制限を回避します。これらの文字列はUnicodeであることが暗示されており、カーネルが処理できるのはそれだけです。ShellExecuteAは、それ以外の場合、このプレフィックスを含む8ビットのエンコードされた文字列を適切に変換します。

簡単に言えば、自動ではありません。プレフィックスを自分でプログラミングして、これを明示的に行う必要があります。

于 2012-09-20T10:29:03.190 に答える