- 締切済み
EXE間でデータを受け渡し時のkarnell32エラー
VB6.0を使って、OSはMe、98でプログラミングをしています。API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしているのですが、実行していると頻繁に「~.exeによりkarnell32.dllに不正な処理が発生しました。問題が解決しなければコンピュータを再起動してください」というようなメッセージが出てしまいます。リソースが足りない時に出ているようでもあるのですが、原因が良くわかりません。どなたか同じような症状がでて「治したぞ!!」という方がいたらよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 todo36さんの参考URLに載っているサンプルが良いと思います。 少し解説をしますと、 > ' 実行可能ファイルを起動(コマンドライン引数付き) >lngProcessId = Shell(strExeFileName, vbNormalFocus) > >' プロセスオブジェクトのハンドルを取得 >lngProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngProcessId) の代わりにCreateProcess関数を使用します。 この関数は、成功すると(子プロセスが起動できた場合)プロセスのハンドルを返します。 > ' ポーリング >Do >' プロセスの終了状態を取得し、モジュールレベル変数に格納 >lngWin32apiResultCode = GetExitCodeProcess(lngProcessHandle, lngProcessExitCode) > >' オペレーティングシステムに制御を渡す >DoEvents の代わりにWaitForSingleObject関数を使用します。 この関数は、設定されたタイムアウト時間か設定されたハンドルに変化があるまで待機します。 今回の場合、子プロセスのハンドルを指定することによって子プロセスが終了するまで、 関数から帰ってこなくなります。 そのため、親プロセスは固まったように見えます。 固まったように見えるのがイヤなときは、タイムアウト時間を1秒くらいにして DoEventsで回すようにしてください。 それでは、頑張ってください。
- todo36
- ベストアンサー率58% (728/1234)
> 使用しているAPI関数は > ・OpenProcess > ・GetExitCodeProcess > ・CloseHandle > の3つです。 CreateProcess WaitForSingleObject CloseHandle の方がよい
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしている この関数をどのように使用しているのでしょうか? そもそも、GetProcessなる関数は存在するのでしょうか? 使用しているソースコードを掲載していただければ、お手伝いできることもある かもしれません。 ただ、上記の関数では、exe間のデータの受け渡しは出来ないでしょう。 exe間のデータの受け渡し方法 1.マップドファイル(共有メモリ)を使用する方法。 2.一般ファイル(.datファイルなど)を使用する方法。 3.SendMessageでWM_COPYDATAメッセージで行う方法。 4.クリップボードAPIを使用する方法。 思いつくところでは、こんなところでしょうか? 詳細は、MSDNライブラリーを参照してください。
補足
申し訳ありません。質問を間違えていました。 もう一度、書かせていただくと あるEXE(親)が別EXE(子)を起動させ、その間親EXEは裏で生きたままで、子EXEの終了を監視し、終了したら親EXEをShowしています。 しかし、子EXEが終了して親EXEに遷移するタイミングで「~EXEによりKernel32.dllに不正な処理が発生しました。問題が解決しなければ再起動してください。」というようなメッセージが出ることがあるのです。毎回出るわけではないし、リソースの不足も影響するようなのですが、はっきりした原因がつかめません。 使用しているAPI関数は ・OpenProcess ・GetExitCodeProcess ・CloseHandle の3つです。 以下は実際のソースです。 この方法はマイクロソフトのサポート技術情報にも出ていたんですが、VB4のサンプルとして書かれていたのが気になってます。 よろしくお願いします。 ------------------------------------------------------------- Public Function gfExecChildProcessAndWait(ByRef frmForm As Form, ByVal strExeFileName As String, _ ByVal blnFlgParentFormUnload As Boolean) As Boolean Dim lngProcessId As Long Dim lngProcessHandle As Long Dim lngWin32apiResultCode As Long Dim lngProcessExitCode As Long On Error GoTo SysErr_gfExecChildProcessAndWait: gfExecChildProcessAndWait = True lngProcessExitCode = 0 ' 実行可能ファイルを起動(コマンドライン引数付き) lngProcessId = Shell(strExeFileName, vbNormalFocus) ' プロセスオブジェクトのハンドルを取得 lngProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngProcessId) ' 新しいプロセスを作成できた場合は If lngProcessHandle <> 0 Then '呼び出し元のフォームをアンロード(あるいはHide) If (blnFlgParentFormUnload = True) Then Unload frmForm Else frmForm.Hide End If ' ポーリング Do ' プロセスの終了状態を取得し、モジュールレベル変数に格納 lngWin32apiResultCode = GetExitCodeProcess(lngProcessHandle, lngProcessExitCode) ' オペレーティングシステムに制御を渡す DoEvents Loop While lngProcessExitCode = STILL_ACTIVE ' プロセスが終了していない間ループ Else Call gsLogWrite("gfExecChildProcessAndWait", "プロセスハンドルの取得に失敗しました。") gfExecChildProcessAndWait = False End If ' プロセスオブジェクトのハンドルをクローズ lngWin32apiResultCode = CloseHandle(lngProcessHandle) Exit Function SysErr_gfExecChildProcessAndWait: gfExecChildProcessAndWait = False Exit Function End Function -------------------------------------------------------------
お礼
アドバイスありがとうございます。参考にもう一度やってみようと思います。 最近どうもエラーの原因がこの部分では無い気がする今日この頃です…。(^^ゞ