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件)
- 最新から表示
- 回答順に表示
No.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から返っていないのでウィンドウ表示されていませんからとりあえずは生き残るかもしれませんけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルで多重起動を防ぐ
-
バッチスクリプト処理でエラー...
-
shell関数について
-
MySQLへのDB::connectで、faile...
-
_access関数が EACCES エラーと...
-
仮想メモリ増加
-
コンソールアプリの起動結果待...
-
CreateProcessでうまくexeファ...
-
「応答なし」の状態を監視する方法
-
XDRIVEのログインをSENDKEYで自...
-
".bashrc" E509: バックアップ...
-
PowerShellで自分が書いたコマ...
-
dsmoveコマンドをBATファイルで...
-
誰かにサーバにあるデータを消...
-
ソースコードからインストール...
-
CSHが使えない REDHAT
-
バッチファイルでのスペースの入力
-
メーリングリスト宛てのメール...
-
Macの手書き漢字入力ツールにつ...
-
mac os 10.6の入ったMac mini ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチスクリプト処理でエラー...
-
バッチファイルで多重起動を防ぐ
-
VBでExcelが起動されているか知...
-
Linux環境変数設定(putenv?se...
-
コンソールアプリの起動結果待...
-
「応答なし」の状態を監視する方法
-
_access関数が EACCES エラーと...
-
Open Office Org 急に起動しな...
-
VBを用いてログオフから自動で...
-
起動したIEのウインドウタイ...
-
OLEサーバコンポーネントを作っ...
-
MySQLへのDB::connectで、faile...
-
ASP.NET 2.0(VB)からEXCELオブ...
-
CreateProcessでコンソールアプ...
-
プリンタの状態を知る方法
-
RTOS(TOPPERS)プログラムで、動...
-
VB6 二重起動確実防止について
-
system関数について
-
デーモンプロセスの起動について
-
仮想メモリ増加
おすすめ情報