• 締切済み

CreateProcess error=0

CreateProcessについて教えてください。 「program Files」配下にあるEXEを起動したいのですが、返却値が「0」で返却され、EXEが起動できません。ちなみに、「program Files」以外(スペースがない名称)の場合は、返却値「0以外」が返却され正常にEXEが起動できます。 また、VS2005で作成版では失敗し、VS6.0では成功します。(program Filesの場合) 原因がまったく、分からず困っています。どなたかご教示下さい。 CreateProcess(NULL,c:\program Files\AAA\AAA.exe,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,c:\,c:\program Files\AAA,&si,&pi)

みんなの回答

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.4

既に回答が出ていますが、システム規定のディレクトリはそのスペルを直接書くと後々バグになる可能性があります。 下記の情報のように、環境変数を使う方が良いでしょう。 http://elksimple.web.fc2.com/memo/environment.htm http://www.itmedia.co.jp/help/tips/windows/w0538.html

  • kekyo0
  • ベストアンサー率62% (5/8)
回答No.3

CreateProcess APIの引数の扱いは複雑で、良く問題が発生します。 以下のKBで示されていますが、applicationNameとcommandLine(第一引数・第二引数)に指定する文字列によって、実行ファイルのパスの検索とコマンドラインとして渡されるパラメータが変わります。 http://support.microsoft.com/kb/175986/en-us SEN_GOKUさんの例は、Case2に該当します。この場合、第二引数に指定した文字列から、実行ファイルとコマンドラインパラメータを抽出しますが、これらの区切りをスペースで認識します。 そのため、カーネルは"c:\program"という実行ファイルを探し、見つからないためエラーが発生します。 解決方法は#1さんの通り、実行ファイルのパス文字列をダブルクオートで括るか、あるいはKBのCase3のように、実行ファイルパスとコマンドライン文字列を別々の引数で指定します。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>また、VS2005で作成版では失敗し、VS6.0では成功します。(program Filesの場合) 実行環境(OS)が同じなら、コンパイラの違いで挙動が変わる。 ということはないハズですが。 # デフォルトでコールされているAPIは微妙に違うでしょうけどね。 失敗した原因については既に回答されている通り…でしょう。 「CreateProcess()の戻り値が0なんです。なんででしょう?」 で止まるのではなく、APIの仕様もかくにんするべきでしょう。 >戻り値 >関数が成功すると、0 以外の値が返ります。 >関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。 なっているのですから、とりあえずGetLastError()でなんと言われるか…というのも確認できるハズです。 # 得られた値はErrorLookupで文字列にできますし、ヘッダファイルから定義名探してネットで検索する。という手段も取れるでしょう。 ショートファイル名で指定する。なんて方法も一応あります。 "C:\\PROGRA~1\\AAA\\AAA.exe"とか。

  • drum_KT
  • ベストアンサー率43% (1108/2554)
回答No.1

スペースを含むパスを使用する場合は引用符""で囲むというAPI仕様のようですが? http://msdn.microsoft.com/ja-jp/library/cc429066.aspx

関連するQ&A

  • CreateProcess関数について

    ■CreateProcess関数で実行フアイル(.exe)を呼ぶプログラムを作成しています。 ■CreateProcess関数はプロセスを作成すると直に呼出側に戻って来るが、起動したプログラムの実行結果ではない。 ■その様な事を踏まえてプログラム下記にコーテイングしました(概要) ■「呼び出し側」も「呼び出される」もCD-ROM内に有ります。 ■問題はCreateProcess関数で呼んでから、実際に画像が表示されるまでに、時間が掛かる事です。、 ■「質 問」「やりたい事」 CreateProcess関数で呼んでから、実行画面が表示される時間の間に 「その旨のなんだかのメッセージを表示したい」 例えば、Webでのダウンロードやインストールの時の様な... この様な事を、実現するのはどの様にしますか、宜しくお願いします。 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(CreateProcess(NULL,(LPTSTR)cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){ CloseHandle(pi.hThread); //CD-ROMから直ぐ表示出来ない場合に備えて //この間で表示に時間を要している事をメッセージ出来ないか? ShowWindow(hWnd,SW_MINIMIZE);//タスクトレイに入れる。 WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); ShowWindow(hWnd,SW_RESTORE););//タスクトレイから出す。 }

  • CreateProcessから制御が戻らない

    環境は Windows2000 Borland C++BuilderXです。 -------------------------------------------------------------------------------- fSuccess = CreateProcess( NULL, cmd_buf, NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi ); -------------------------------------------------------------------------------- 上記のように子プロセスの起動を行っている箇所があるのですが 子プロセスが立ち上がらず、CreateProcessの呼び出しから制御が 戻らないことがあります。 この現象は毎回発生するわけではなく、再現性は低いのですが 同様の現象の前例などご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

  • CreateProcessの制御について

    今回exeから別exe(or bat)を起動させる処理を作成しようとしているのですが、 呼び出した後(今回であればnotepad.exe)5秒程度砂時計マークがでる状態になるのです。(バッチでも同じ) なにか原因があるのでしょうか。また、対処方があれば教えてください。 【前提】 ・本体exeにウィンドウは必要なし ・バッチの場合はcmd.exeは非表示 【環境】 ・XP SP2 でコンパイル。 bcc32 5.5.1 と VB6 ・実行はXP SP2 とWin2000 双方で同様の結果 【ソース】 #include<windows.h> int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , PSTR lpCmdLine ,int nCmdShow ) { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS, NULL,NULL,&si,&pi); CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); return 0; }

  • CreateProcessでのウィンドウサイズの指定方法

    CreateProcessでプログラムを実行するようなプログラムを作成した際に表示されるウィンドウサイズを最大化したり最小化したりするのではなく、ある大きさにしたいのですが、うまくいかないのでご存知の方教えてください。 BOOL testProgram; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si,0,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWDEFAULT; si.dwXSize = 500;  si.dwYSize = 400; // 例えばこんな風にサイズを指定したいのです testProgram = CreateProcess( NULL, "**.exe", // ここには具体的なものが入ります。 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); if(testProgram!=TRUE)return FALSE; WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); このようなプログラムを書いてみたのですがうまくいきません。(プログラムは抜粋です) 何かいい方法ご存知の方教えていただけないでしょうか? よろしくお願いします。

  • CreateProcessでEXEを起動させると残像が残る

    お世話になります。 VC++ 6.0 MFC で開発しております。 A.exeから、B.exeを起動しています。 A.exeの(画面上の)上にB.exeが表示されるのですが、 そのB.exeを動かすと白い残像みたいな跡がでます。 そのB.exeの残像みたいなのを出さないようにしたいのですがどのようにすればよいでしょうか ※B.exeを起動している間は、A.exeを操作できないようにしたいのです。 ***********実際のソースです。******** PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si);   int kekka = CreateProcess(Pass,CommandChar,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); if(kekka==0) { CString str; str.Format("起動することはできません。); AfxMessageBox(str, MB_OK, 0); } else { WaitForSingleObject(pi.hProcess,INFINITE); } PeekMessage()とかを使えばいいとか聞いたのですが、まったくわからない状態です。 大変お手数ですが具体的に教えていただければ大変ありがたいです。 なにとぞよろしくお願いします。

  • CreateProcessでアプリが終了しない

    ちょっとした変換ツールを作ろうと思い、ダイアログベースの MFCアプリケーションを作成しました。 OKボタンが押された時にCreateProcess()で子プロセスを 起動して、終了したら結果表示して親プロセスも終了する 様にしようと思ったのですが、結果表示までは正常に 実行されるのですが、親プロセスが終了しません。 恐らくCreateProcess()に渡す引数が悪いのだと思うのですが、 どなたかわかる方がいらしたらご教示願います。 void CMscGenSelectorDlg::OnBnClickedOk() {   STARTUPINFO si;   PROCESS_INFORMATION pi;   ZeroMemory( &si, sizeof si );   si.cb = sizeof si;   ZeroMemory( &pi, sizeof pi );   // 子プロセス起動   CreateProcess(     NULL,                // モジュール名     _T("mscgen.exe -Tpng hoge.msc"),  // コマンドライン     NULL,                // セキュリティ記述子     NULL,                // セキュリティ記述子     FALSE,               // ハンドルの継承オプション     0,                 // 作成のフラグ     NULL,                // 新しい環境ブロック     NULL,                // カレントディレクトリ名     &si,                // スタートアップ情報     &pi);                // プロセス情報   // 子プロセス終了待ち   WaitForSingleObject( pi.hProcess, INFINITE );   CloseHandle( pi.hProcess );   CloseHandle( pi.hThread );   // シーケンスチャート表示   ShellExecute( NULL, _T("open"), _T("hoge.png"), NULL, NULL, SW_SHOW );   // 終了   OnOK(); }

  • CreateProcessでの環境変数の設定の仕方

    PATHを設定してCommand.comを実行したいのですが、 CreateProcessでの環境変数の設定の仕方がわかりません char* env = "PATH=c:\\data"; CreateProcess(NULL,"command.com /k path ", NULL, NULL, FALSE, 0, env, NULL, &si, &pi); このようにしてみたところDos窓が起動しますが、 表示されるPATHはデフォルトのままです。 環境は VC++6.0 MFC です。 どうか宜しくお願いします。

  • CreateProcessのエラー

    Windows8でキーボードを任意に表示しようとしてCreateProcessでTabTip.exeを起動しようとするとエラーが出ます。 GetLastErrorでエラーコードを取得すると740が帰ってきますが、該当するコードがありません。 起動できるようにするために参考になるような情報がございましたらよろしくお願いいたします。 開発環境はVisual Stidio 2012でC++です。 ちなみにVC6ではエラーが出ずに起動できますが、任意に閉じることができません。

  • CreateProcessについて

    VC++6.0を使用し、NT上で以下のようなプログラムを作成していました。 Prcess_sts = ::CreateProcess(***_FULLPATH, NULL, NULL, NULL, FALSE, 0, NULL, ***_DIR, &pscinfo, &lpProcessInfo ); ***は起動する実行形名称です。作成したプログラムをNT上で動作させるには全く問題なかったのですが、OSがXPに変わった途端、この命令でアプリケーションの起動ができなくなりました。具体的な症状は、 ・カーソルは砂時計を表示し、フリーズしている ・タスクマネージャの『プロセス』を確認すると、99%がアイドル状態で、起動したアプリ及びCallしたアプリがリソースを食い潰している状態ではない。 という変な現象が発生しています。ちなみに、このような状態になるのは、コールしたプログラムの先でシリアル通信を行うものに頻発しているように感じます(気のせいかも?)また、全く問題なく起動することもあります。これはOSのせいなのでしょうか?もちろん、NT上で動作させていたときは全くなかった現象です。VC++がXPに対応していないからなのでしょうか?全く分からずに困っています。その道に明るい方がいましたら、ご教示ください。 PS マイクロソフトが発表している『32ビットプロセスでCreateProcess関数を呼び出しても正しく起動されない』というものとは違うようです。 よろしくお願いします。