OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

EXE間でデータを受け渡し時のkarnell32エラー

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

お礼率 20% (1/5)

VB6.0を使って、OSはMe、98でプログラミングをしています。API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしているのですが、実行していると頻繁に「~.exeによりkarnell32.dllに不正な処理が発生しました。問題が解決しなければコンピュータを再起動してください」というようなメッセージが出てしまいます。リソースが足りない時に出ているようでもあるのですが、原因が良くわかりません。どなたか同じような症状がでて「治したぞ!!」という方がいたらよろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全3件)

  • 回答No.1
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。 >API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしている この関数をどのように使用しているのでしょうか? そもそも、GetProcessなる関数は存在するのでしょうか? 使用しているソースコードを掲載していただければ、お手伝いできることもある かもしれません。 ただ、上記の関数では、exe間のデータの ...続きを読む
こんにちは。itohhといいます。

>API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしている
この関数をどのように使用しているのでしょうか?
そもそも、GetProcessなる関数は存在するのでしょうか?

使用しているソースコードを掲載していただければ、お手伝いできることもある
かもしれません。
ただ、上記の関数では、exe間のデータの受け渡しは出来ないでしょう。

exe間のデータの受け渡し方法
1.マップドファイル(共有メモリ)を使用する方法。
2.一般ファイル(.datファイルなど)を使用する方法。
3.SendMessageでWM_COPYDATAメッセージで行う方法。
4.クリップボードAPIを使用する方法。

思いつくところでは、こんなところでしょうか?
詳細は、MSDNライブラリーを参照してください。
補足コメント
takashi944

お礼率 20% (1/5)

申し訳ありません。質問を間違えていました。
もう一度、書かせていただくと
ある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
-------------------------------------------------------------
投稿日時 - 2001-09-13 10:10:51
  • 回答No.2
レベル13

ベストアンサー率 59% (729/1235)

> 使用しているAPI関数は > ・OpenProcess > ・GetExitCodeProcess > ・CloseHandle > の3つです。 CreateProcess WaitForSingleObject CloseHandle の方がよい ...続きを読む
> 使用しているAPI関数は
> ・OpenProcess
> ・GetExitCodeProcess
> ・CloseHandle
> の3つです。

CreateProcess
WaitForSingleObject
CloseHandle

の方がよい
  • 回答No.3
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。 todo36さんの参考URLに載っているサンプルが良いと思います。 少し解説をしますと、 > ' 実行可能ファイルを起動(コマンドライン引数付き) >lngProcessId = Shell(strExeFileName, vbNormalFocus) > >' プロセスオブジェクトのハンドルを取得 >lngProcessHan ...続きを読む
こんにちは。itohhといいます。

todo36さんの参考URLに載っているサンプルが良いと思います。

少し解説をしますと、
> ' 実行可能ファイルを起動(コマンドライン引数付き)
>lngProcessId = Shell(strExeFileName, vbNormalFocus)

>' プロセスオブジェクトのハンドルを取得
>lngProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngProcessId)

の代わりにCreateProcess関数を使用します。
この関数は、成功すると(子プロセスが起動できた場合)プロセスのハンドルを返します。

> ' ポーリング
>Do
>' プロセスの終了状態を取得し、モジュールレベル変数に格納
>lngWin32apiResultCode = GetExitCodeProcess(lngProcessHandle, lngProcessExitCode)

>' オペレーティングシステムに制御を渡す
>DoEvents

の代わりにWaitForSingleObject関数を使用します。
この関数は、設定されたタイムアウト時間か設定されたハンドルに変化があるまで待機します。
今回の場合、子プロセスのハンドルを指定することによって子プロセスが終了するまで、
関数から帰ってこなくなります。
そのため、親プロセスは固まったように見えます。
固まったように見えるのがイヤなときは、タイムアウト時間を1秒くらいにして
DoEventsで回すようにしてください。

それでは、頑張ってください。
お礼コメント
takashi944

お礼率 20% (1/5)

アドバイスありがとうございます。参考にもう一度やってみようと思います。
最近どうもエラーの原因がこの部分では無い気がする今日この頃です…。(^^ゞ
投稿日時 - 2001-10-02 13:44:28
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ