アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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で回すようにしてください。

それでは、頑張ってください。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。参考にもう一度やってみようと思います。
最近どうもエラーの原因がこの部分では無い気がする今日この頃です…。(^^ゞ

お礼日時:2001/10/02 13:44

> 使用しているAPI関数は


> ・OpenProcess
> ・GetExitCodeProcess
> ・CloseHandle
> の3つです。

CreateProcess
WaitForSingleObject
CloseHandle

の方がよい

参考URL:http://www.vbvbvb.com/board/Forum5/HTML/000013.h …
    • good
    • 0

こんにちは。

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

補足日時:2001/09/13 10:10
    • good
    • 0

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