締切済み

CreateProcessでうまくexeファイルの起動ができません。

  • すぐに回答を!
  • 質問No.4596308
  • 閲覧数1202
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 0% (0/1)

Win32APIでファイルを読み込むプログラムとCreateProcessによる別に作った、OpenCVの2値化動画像の特徴点抽出をして得られた特徴点の座標を保存するプログラムを起動させるプログラムなのですが、起動はできても特徴点の座標取得ができません。外部起動せずにOpenCVのプログラムを動かすと座標がテキストファイルに保存されます。原因が分からないので、分かる方どなたかご教授願います。

環境はWindowsXP Visual C++ 2008 Express Editionです。
以下がWindowsプログラミングのソースの一部です。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD dwExCode;
FILE *fp;
errno_t err;
TCHAR buf[10];
TCHAR *temp;
TCHAR cmdstr[] = _T("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\capflow\\Debug\\capflow.exe");

switch(msg){
case WM_CREATE:
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
if(!CreateProcess(NULL, cmdstr, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,NULL, NULL, &si, &pi)){
MessageBox(hWnd, TEXT("Can't open capflow.exe"), TEXT("Error"), MB_OK);
}
while(1){
Sleep(100);
GetExitCodeProcess(pi.hProcess, &dwExCode);
if(dwExCode == STILL_ACTIVE){
continue;
}else{
MessageBox(hWnd, TEXT("Finish"), TEXT("Complete"), MB_OK);
break;
}
}
CloseHandle(pi.hProcess);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
break;

case WM_KEYUP:
switch(LOWORD(wParam)){
case VK_RETURN:
err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\capflow\\Debug\\Corner.txt"), TEXT("r+"));
if(err != 0)
break;
temp = (TCHAR*)malloc(_tcsclen(buf)+1);
if(temp == NULL){
MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK);
break;
}
while(_fgetts(buf, 10, fp) != NULL){
_tcstok(buf, TEXT("\n"));
_tcscpy(temp, buf);
MessageBox(hWnd, temp, TEXT("Indication"), MB_OK);
}
free(temp);
fclose(fp);
break;
}
break;

case WM_CLOSE:
DestroyWindow(hWnd);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}

回答 (全1件)

  • 回答No.1

ベストアンサー率 53% (2177/4070)

WM_CREATEでメッセージループ止めちゃって大丈夫なんでしょうか?
起動したプロセスが終了するまでWM_CREATEから応答返せませんが。

>CloseHandle(pi.hProcess);
>WaitForSingleObject(pi.hProcess, INFINITE);
>CloseHandle(pi.hThread);

クローズしたハンドルで待ち続けて、WaitForSingleObject()はシグナル受けられるのでしょうか?
http://www.expertmg.co.jp/html/cti/vctips/process.htm#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%B5%82%E4%BA%86%E3%82%92%E5%BE%85%E3%81%A4
先にCloseHandle()するのはスレッドハンドルではありませんか?

WM_CREATEで止めない方法としては…外部プロセスを起動する処理をワーカースレッドで行い、外部プロセスが終了したら
ユーザーメッセージをメインスレッドに投げる。という方法があります。
現状の場合、OSから「応答なし」プロセスとして殺されてしまう可能性もあります。
WM_CREATEから返っていないのでウィンドウ表示されていませんからとりあえずは生き残るかもしれませんけど。
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ