0

レジストリ キーを読み取り、そこでプログラムのパスを取得し、このパスを 2 番目のパラメーターとして CreateProcessA を呼び出す関数があります。アプリケーションをデバッグすると、ファイルが見つからないと言って失敗します。

a) はい、ファイルは存在します b) はい、ファイルを実行するためのアクセス権があります

質問: 実際に reg キーを読み取り、CreateProcessA へのパスを提供する関数は、パスをエスケープしません。つまり、CreateProcessA は、「C:\」ではなく「C:\Program Files\prog.exe」のような文字列を受け取ります。 \Program Files\\prog.exe". それが問題ですか?すべてのバックスラッシュを自動的にエスケープする Windows 関数はありますか?

4

1 に答える 1

0

一般的なエラーには、実行可能ファイルへのパスをCreateProcessの最初の引数として指定しないこと、および実行可能ファイルへのパスを2番目の引数で引用しないことが含まれます。

CreateProcess( <exe path goes here> , <quoted exe path plus parameters goes here>, ... );

そのようです:

std::wstring executable_string(_T("c:\\program files\\myprogram\\executable.exe"));
std::wstring parameters(_T("-param1 -param2"));

wchar_t path[MAX_PATH+3];
PathCanonicalize(path, executable_string.c_str());
path[sizeof(path)/sizeof(path[0]) - 1] = _T('\0');

// Make sure that the exe is specified without quotes.
PathUnquoteSpaces(path);
const std::wstring exe = path;

// Make sure that the cmdLine specifies the path to the executable using
// quotes if necessary.
PathQuoteSpaces(path);
std::wstring cmdLine = path + std::wstring(_T(" ")) + parameters;

BOOL res = CreateProcess(
                 exe.c_str(),
                 const_cast<wchar_t *>(cmdLine.c_str()),
                 ...);

いくつかをコピーして適合させたばかりなので、上記にいくつかのエラーがあるかもしれませんが、アイデアはそこにあります。最初のパラメーターには引用符のないパスを使用し、2番目のパラメーターには引用符のあるパスを使用してください。問題はありません。

于 2012-06-19T08:15:17.773 に答える