Visual Studio 2005を使っています。
VC++にて、
『プロジェクト(P)』
『…のプロパティ(P)』
『構成プロパティ全般の文字セットを"Unicode文字セットを使用する"』
の設定にして、CreateProcessを使用したいのですが、上手く行きません。
ちょっと長いですが、コードを記します。
PROCESS_INFORMATION pi0;
STARTUPINFO si0;
ZeroMemory(&si0, sizeof(si0));
si0.cb = sizeof(si0);
AfxMessageBox( L"CreateProcessW開始", MB_OK ); // ① CreateProcessW( NULL,
L"C:\\WINDOWS\\system32\\test.txt",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si0,
&pi0);
AfxMessageBox( L"CreateProcessW終了", MB_OK ); // ②
①のメッセージボックスは上手く表示されるのですが、②が表示される前に『問題が発生したため、TODO: <ファイルの説明> を終了します。ご不便をおかけして申し訳ありません。』と表示され、アプリが終了してしまいます。
文字セットをUnicodeのままCreateProcessを正常動作させる方法をご存知の方、アドバイス頂けたら幸いです。よろしくお願い致します。
蛇足ですが、このページだと『// ①』の後にCreateProcessWが来てるので、コメントになってしまいますが、実際のプログラムでは、改行していてCreateProcessWがコンパイルされています。
題名もコンパイルエラーとなっていますが、一応、コンパイルは通っています。
正確には、アプリ実行中の異常終了です。説明のミスが多くてすみませんが、何卒、アドバイスよろしくお願い致します。
CreateProcessの第2引数はLPTSTRでLPCTSTRではないです。
ですので
>L"C:\\WINDOWS\\system32\\test.txt",
のような指定は出来ません。
ちゃんと文字列領域を取って渡しましょう。
CreateProcess Function
http://msdn2.microsoft.com/en-us/library/ms682425.aspx
今回なら
TCHAR cmd[] = _T("C:\\WINDOWS\\system32\\test.txt");
としてcmdを引数に指定する。
それと、
>AfxMessageBox( L"CreateProcessW開始", MB_OK );
_TマクロまたはTEXTマクロを使うべきでしょう。
>CreateProcessW( NULL,
は
>PROCESS_INFORMATION pi0;
ですからWのつかないCreateProcess関数にしたほうがよいでしょう。
CreateProcessWを明に使うならSTARTUPINFOWを使ってください。
訂正
>>PROCESS_INFORMATION pi0;
>ですからWのつかないCreateProcess関数にしたほうがよいでしょう。
>
>CreateProcessWを明に使うならSTARTUPINFOWを使ってください。
ではなく
>STARTUPINFO si0;
ですからWのつかないCreateProcess関数にしたほうがよいでしょう。
CreateProcessWを明に使うならSTARTUPINFOWを使ってください。
でした。
Blueさん、とても的確なアドバイス有難うございます。
こんな短時間で解決できるとは思いませんでした。
本当に有難うございます。
ツイート | ![]() |