3

CreateProcess子プロセスを開始するために使用しようとしていますが、取得し続けてerror 2います。ドキュメントによると、ファイルが見つかりません。

私のコードは次のようになります。

if (!(CreateProcess(LPCTSTR("test.exe") ,NULL ,NULL,NULL,FALSE ,0  ,NULL ,NULL ,&producer_si
              ,&producer)))
{
    printf("Create process failed!(%d)\n", GetLastError());
}

test.exe以前に作成した実行可能プログラムはどこにありますか。子プロセスは非常に単純で、コードは次のようになります。

void _tmain (int argc, TCHAR* argv[])
{
printf("%s\n", "hello!"); 
} 

test.exe親プロセスと同じフォルダにもあります。エラー コード 2 が常に表示される理由がわかりません。

4

4 に答える 4

3

エラー 2 はERROR_FILE_NOT_FOUNDです。他の人が言ったように、代わりに絶対パスを使用する必要がある場合、相対パスに依存しています。

また、LPCTSTR("test.exe")有効なコードではありません。UNICODEが定義されている場合、 にCreateFile()マップしCreateFileW()、ieにLPCTSTRマップします。aを a に型キャストして、意味のあるデータにすることはできません。-sensitive リテラルを使用したい場合は、代わりにマクロを使用してください。LPCWSTRconst wchar_t*char*wchar_t*TCHARTEXT()

if (!CreateProcess(TEXT("full path to\\test.exe"), ...))

それ以外の場合は、必要に応じて、使用を忘れてTCHAR代わりに Ansi 固有または Unicode 固有のコードを記述します。

if (!CreateProcessA("full path to\\test.exe", ...))

if (!CreateProcessW(L"full path to\\test.exe", ...))
于 2013-11-01T19:54:41.643 に答える
0

test.exe呼び出し元が存在するディレクトリで検索されることはありません。プロセスごとのパス変数である現在のディレクトリexeで検索されます。たぶん、現在のディレクトリはどこに住んでいるかを指していません。また、任意に変更される可能性があるため (たとえば、ファイル ダイアログを使用したり、親プロセスが変更した場合)、これに依存しないでください。test.exe

于 2013-11-01T19:32:01.960 に答える
0

少なくとも私の意見では、ファイル名に関しては、CreateProcess関数は非常にデリケートです。そのようにexeを指定すると、実際には現在のディレクトリに従って指定されますが、これはメインのexeが存在するディレクトリと同じではない可能性があり、ファイルが見つからないことを説明しています。1 つの方法は、 GetModulePathを使用して現在の exe のディレクトリを取得し、そこから exe 名を削除して、同じディレクトリを取得するか、絶対パスを使用することです。

CreateProcessのドキュメントによると、最初のパラメーターは NULL にすることができます。

lpApplicationName パラメータは NULL にすることができます。その場合、モジュール名は、lpCommandLine 文字列内の最初の空白で区切られたトークンでなければなりません。

少なくとも私にとっては、コマンドラインのみを指定すると、アプリケーション名よりもはるかにうまく機能し、アプリケーション名内ではコマンドラインを処理できないように思えました。

于 2013-11-01T19:32:10.583 に答える