掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29116

CreateProcessの実行ができない
投稿者---ひか(2006/12/01 14:44:23)


環境OS:  WindowsXP
開発ツール:VisualStudio2005
開発言語: C言語

猫でもわかるプログラミングで紹介されているサンプルプログラムを動かそうとしているのですが、実行をすると
「子プロセスを呼び出します」
が表示された後に
「Process.exe[3312]でハンドルされていないWin32の例外が発生しました。」
というダイアログメッセージがでます。

以下サンプルを少しいじったコードです。

#include <stdio.h>
#include <windows.h>

int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    DWORD dwExCode;
    
    memset(&si, 0, sizeof(STARTUPINFO));
    memset(&pi, 0, sizeof(PROCESS_INFORMATION));

    printf("子プロセスを呼び出します\n");

    CreateProcess(NULL,
        (LPWSTR)"C:\Documents and Settings\hika\My Documents\Visual Studio 2005\Projects\childprocess01\debug\childprocess01.exe",
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi);

    while (1) {
        Sleep(100);
        GetExitCodeProcess(pi.hProcess, &dwExCode);
        if (dwExCode == STILL_ACTIVE) {
            continue;
        } else  {
            printf("子プロセスは終了したようです\n");
            break;
        }
    }
    if(CloseHandle(pi.hProcess))
        printf("プロセスハンドルを閉じました\n");
    if(CloseHandle(pi.hThread))
        printf("スレッドハンドルを閉じました\n");
    printf("親プロセスを終了します\n");

    return 0;
}


ご教授、お願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:CreateProcessの実行ができない 29117 2006/12/01 14:56:36


No.29117

Re:CreateProcessの実行ができない
投稿者--- (2006/12/01 14:56:36)


そのサンプルプログラムと、子プロセスのプログラムとを
同じフォルダに置いてみるとどうなりますか?

CreateProcessの第2引数をそのように修正してから、
サンプルプログラムを実行してみてください。




この投稿にコメントする

削除パスワード

No.29118

Re:CreateProcessの実行ができない
投稿者---ひか(2006/12/01 15:11:55)


>そのサンプルプログラムと、子プロセスのプログラムとを
>同じフォルダに置いてみるとどうなりますか?

>CreateProcessの第2引数をそのように修正してから、
>サンプルプログラムを実行してみてください。

子プロセスのプログラム(child.exe)を親プロセスのプログラム(process.c)と同じディレクトリ内にして実行してみましたが、結果は同じでした。
引数は
(LPWSTR)"childprocess01.exe"
に変更しました。


この投稿にコメントする

削除パスワード

No.29121

Re:CreateProcessの実行ができない
投稿者---Blue(2006/12/01 15:59:31)


コンパイルエラーになったので
>(LPWSTR)"childprocess01.exe"
とムリヤリキャストしたとか。

・TEXTマクロを使う
・コンパイルオプションの文字セットを
「Unicode文字セット」から「マルチバイト文字セット」に変更する
L"childprocess01.exe" とする
・CreateProcessAをつかう

のいずれかの対応になります。


この投稿にコメントする

削除パスワード

No.29122

Re:CreateProcessの実行ができない
投稿者---ひか(2006/12/01 16:12:08)


>コンパイルエラーになったので
>>(LPWSTR)"childprocess01.exe"
>とムリヤリキャストしたとか。
>
まさしくそのとおりです。

>・TEXTマクロを使う
>・コンパイルオプションの文字セットを
> 「Unicode文字セット」から「マルチバイト文字セット」に変更する
>・L"childprocess01.exe" とする
>・CreateProcessAをつかう
>
>のいずれかの対応になります。

文字セットを変更したら、解決しました!!
子プロセスの実行もできました。
ありがとうございます!


この投稿にコメントする

削除パスワード

No.29123

Re:CreateProcessの実行ができない
投稿者---YuO(2006/12/01 16:27:51)


> ・L"childprocess01.exe" とする
はまずいですね。
MSDNによるCreateProcessの説明によると,lpCommandLineのところに,
> The Unicode version of this function, CreateProcessW, can modify the contents of this string.
とあります。つまりは,
wchar_t[] commandLine = L"childprocess01.exe";
としてやらないといけないようです。
# 非常に面倒くさいですが……。

まぁ,だからこそLPCTSTRではなくLPTSTRを引数にとるのでしょうが……。



この投稿にコメントする

削除パスワード

No.29124

Re:CreateProcessの実行ができない
投稿者---Blue(2006/12/01 16:42:14)


>> ・L"childprocess01.exe" とする
>はまずいですね。
あら、、、見落としていました。 orz

>まぁ,だからこそLPCTSTRではなくLPTSTRを引数にとるのでしょうが……。
TEXTマクロを使うだけでもダメだったわけですね。

TCHAR commandLine[] = TEXT("childprocess01.exe");
CreateProcess(NULL, commandLine, 、、、、

ご指摘ありがとうございました。


この投稿にコメントする

削除パスワード

No.29119

Re:CreateProcessの実行ができない
投稿者---ひか(2006/12/01 15:18:30)


すいません、
子プロセスのプログラム(child.exe)
じゃなくて
子プロセスのプログラム(childprocess01.exe)
です。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧