VB6.0を使って、OSはMe、98でプログラミングをしています。API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしているのですが、実行していると頻繁に「~.exeによりkarnell32.dllに不正な処理が発生しました。問題が解決しなければコンピュータを再起動してください」というようなメッセージが出てしまいます。リソースが足りない時に出ているようでもあるのですが、原因が良くわかりません。どなたか同じような症状がでて「治したぞ!!」という方がいたらよろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
こんにちは。
itohhといいます。todo36さんの参考URLに載っているサンプルが良いと思います。
少し解説をしますと、
> ' 実行可能ファイルを起動(コマンドライン引数付き)
>lngProcessId = Shell(strExeFileName, vbNormalFocus)
>
>' プロセスオブジェクトのハンドルを取得
>lngProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngProcessId)
の代わりにCreateProcess関数を使用します。
この関数は、成功すると(子プロセスが起動できた場合)プロセスのハンドルを返します。
> ' ポーリング
>Do
>' プロセスの終了状態を取得し、モジュールレベル変数に格納
>lngWin32apiResultCode = GetExitCodeProcess(lngProcessHandle, lngProcessExitCode)
>
>' オペレーティングシステムに制御を渡す
>DoEvents
の代わりにWaitForSingleObject関数を使用します。
この関数は、設定されたタイムアウト時間か設定されたハンドルに変化があるまで待機します。
今回の場合、子プロセスのハンドルを指定することによって子プロセスが終了するまで、
関数から帰ってこなくなります。
そのため、親プロセスは固まったように見えます。
固まったように見えるのがイヤなときは、タイムアウト時間を1秒くらいにして
DoEventsで回すようにしてください。
それでは、頑張ってください。
アドバイスありがとうございます。参考にもう一度やってみようと思います。
最近どうもエラーの原因がこの部分では無い気がする今日この頃です…。(^^ゞ
No.2
- 回答日時:
> 使用しているAPI関数は
> ・OpenProcess
> ・GetExitCodeProcess
> ・CloseHandle
> の3つです。
CreateProcess
WaitForSingleObject
CloseHandle
の方がよい
参考URL:http://www.vbvbvb.com/board/Forum5/HTML/000013.h …
No.1
- 回答日時:
こんにちは。
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
-------------------------------------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- 婦人科の病気・生理 膣カンジダの再発 2 2023/04/06 18:11
- その他(パソコン・スマホ・電化製品) PCに詳しい方に、質問です。 使用しているのは、TOSHIBAのPCで、多分なんですけど、アップデー 4 2023/01/28 03:30
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- デスクトップパソコン 問題が発生したため、PCを再起動する必要があります。エラー情報を収集しています。自動的に再起動します 5 2022/06/02 11:15
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
Process.Startの戻り値を後で取得
-
sleep関数の精度について
-
VB6.0 SHELLで起動...
-
タスクマネージャーのプロセス...
-
共有メモリの同時アクセスにつ...
-
プロセスのアタッチ・デタッチ...
-
C#でのbatファイル実行結果取得
-
C++のプログラムをバックグラウ...
-
ShellExecuteが起動したプロセ...
-
プロセスIDからウィンドウハ...
-
バッチファイルでPINGログ取得
-
プロセスIDの取得方法について
-
別のプロセスの関数を呼び出す...
-
Windowsのユーザログイン/ログ...
-
怪しいプロセス教えてください。
-
ウィンドウのタイトルからプロ...
-
win10でpythonのプロセス名を変...
-
プロセスが実行中かどうか調べ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
なぜ女性は男性が忘れたことを...
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
C#でのbatファイル実行結果取得
-
プロセスIDからウィンドウハ...
-
c言語でプロセスIDを調べたい
-
Linuxでのスレッド間メッセージ...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
vb.netでEXCEL起動がうまくでき...
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Visual C++からpingを実行して...
-
VBS(WSH)で開いたIEのウィンド...
-
IISがフリーズ
おすすめ情報