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

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;
}

A 回答 (1件)

WM_CREATEでメッセージループ止めちゃって大丈夫なんでしょうか?


起動したプロセスが終了するまでWM_CREATEから応答返せませんが。

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

クローズしたハンドルで待ち続けて、WaitForSingleObject()はシグナル受けられるのでしょうか?
http://www.expertmg.co.jp/html/cti/vctips/proces …
先にCloseHandle()するのはスレッドハンドルではありませんか?

WM_CREATEで止めない方法としては…外部プロセスを起動する処理をワーカースレッドで行い、外部プロセスが終了したら
ユーザーメッセージをメインスレッドに投げる。という方法があります。
現状の場合、OSから「応答なし」プロセスとして殺されてしまう可能性もあります。
WM_CREATEから返っていないのでウィンドウ表示されていませんからとりあえずは生き残るかもしれませんけど。
    • good
    • 0

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