プロが教える店舗&オフィスのセキュリティ対策術

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)

A 回答 (4件)

既に回答が出ていますが、システム規定のディレクトリはそのスペルを直接書くと後々バグになる可能性があります。


下記の情報のように、環境変数を使う方が良いでしょう。
http://elksimple.web.fc2.com/memo/environment.htm
http://www.itmedia.co.jp/help/tips/windows/w0538 …
    • good
    • 1

CreateProcess APIの引数の扱いは複雑で、良く問題が発生します。


以下のKBで示されていますが、applicationNameとcommandLine(第一引数・第二引数)に指定する文字列によって、実行ファイルのパスの検索とコマンドラインとして渡されるパラメータが変わります。

http://support.microsoft.com/kb/175986/en-us

SEN_GOKUさんの例は、Case2に該当します。この場合、第二引数に指定した文字列から、実行ファイルとコマンドラインパラメータを抽出しますが、これらの区切りをスペースで認識します。
そのため、カーネルは"c:\program"という実行ファイルを探し、見つからないためエラーが発生します。

解決方法は#1さんの通り、実行ファイルのパス文字列をダブルクオートで括るか、あるいはKBのCase3のように、実行ファイルパスとコマンドライン文字列を別々の引数で指定します。
    • good
    • 0

>また、VS2005で作成版では失敗し、VS6.0では成功します。

(program Filesの場合)

実行環境(OS)が同じなら、コンパイラの違いで挙動が変わる。
ということはないハズですが。
# デフォルトでコールされているAPIは微妙に違うでしょうけどね。

失敗した原因については既に回答されている通り…でしょう。

「CreateProcess()の戻り値が0なんです。なんででしょう?」
で止まるのではなく、APIの仕様もかくにんするべきでしょう。

>戻り値
>関数が成功すると、0 以外の値が返ります。
>関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。

なっているのですから、とりあえずGetLastError()でなんと言われるか…というのも確認できるハズです。
# 得られた値はErrorLookupで文字列にできますし、ヘッダファイルから定義名探してネットで検索する。という手段も取れるでしょう。

ショートファイル名で指定する。なんて方法も一応あります。
"C:\\PROGRA~1\\AAA\\AAA.exe"とか。
    • good
    • 0

スペースを含むパスを使用する場合は引用符""で囲むというAPI仕様のようですが?



http://msdn.microsoft.com/ja-jp/library/cc429066 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!