0

ifstream::open と CreateProcess の両方で文字列を使用する必要があるコードがあります。

//in another file
const char* FILENAME = "C:\\...blah blah\\filename.bat";

// in main app
std::ifstream is;
is.open(FILENAME);
// ...do some writing
is.close();

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

std::string cmdLine = "/c " + FILENAME;

if( !CreateProcess( "c:\\Windows\\system32\\cmd.exe", 
    cmdLine.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) ) 
{       
    return GetLastError();
}

CreateProcess には LPCWSTR が必要なので、CreateProcess で文字列を使用するには、ファイル名と「cmdLine」を std::wstring として宣言する必要がありますが、ifstream::open はワイド文字列を取りません...方法がわかりませんこれを回避するために。私は常に、ユニコードとマルチバイト文字列の問題に遭遇しているようです。

何か案は?ありがとう。

4

1 に答える 1

1

私はあなたが定義したと仮定していますUNICODE。に変更STARTUPINFOすることができSTARTUPINFOA、正常に動作するはずです(私にとってはうまくいきました)。CreateProcessCreateProcessA

+操作は気に入らないと思います。1つのchar配列を明示的に文字列に変換します。

std::string cmdLine = (std::string)"/c " + FILENAME;

FILENAME最後に、スペースがある場合は、最初と最後の前後に引用符が必要になります。

const char FILENAME = "\"C:\\Program Files\\Company\\Program\\program.exe\"";
                        ^           ^                                     ^

編集:これを文字列宣言の下に置いてみてください:

char charCmdLine [MAX_PATH + 3]; //"/c " is 3 extra chars
strncpy (charCmdLine, cmdLine.c_str(), MAX_PATH + 3);

次に、の代わりにを使用charCmdLineします。CreateProcesscmdLine.c_str()

于 2012-04-19T12:09:39.620 に答える