こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

OCXからのコールバックを繰り返すとスタック領域が不足する

こんにちは。
いつもお世話になっております。

OCXからのコールバックが繰り返された場合に「実行時エラー28 スタック領域が不足しています。」が発生して困っています。
以下のようにOCXからのコールバックでプロシージャを再帰的に呼び出しています。

<Command1_Clickイベント>
-------------------------------------------------------------------------------------
Private Sub Command1_Click()

'OnTestイベントを発生させる
Test.Test

End Sub
-------------------------------------------------------------------------------------

<OnTestイベント>
-------------------------------------------------------------------------------------
Private Sub Test_OnTest(ByVal sStatus As Long, ByVal FileName As String)

Select Case sStatus
Case 0
'ステータスが0になったら終了
Exit Sub
Case Else
'再帰的にOnTestイベントを発生させる
Test.Test
End Select

End Sub
-------------------------------------------------------------------------------------

すると、294回目でスタック領域不足が発生します。
MSDNによると「イベント連鎖」と呼ばれるものであるようですが、途中までうまくいくので何か他に原因がないかと思っています。
http://msdn2.microsoft.com/ja-JP/library/0ctsw64a.aspx
回避策などありましたらご教示下さい。
ちなみにOCXの処理としては、フォルダ内の該当ファイル名を1つずつ返すというものです。

<環境>
Windows 2000, VB6.0

投稿日時 - 2006-08-07 16:09:55

QNo.2325134

困ってます

質問者が選んだベストアンサー

文字通り、スタック領域を増やすしかありません。

イベント連鎖は関係ありません。

関数から自分自身を再帰的に呼ぶと、
・値渡しされた引数
・関数内で定義したローカル変数
・関数内で確保された動的領域(String型変数などの実体)
・VBが暗黙的に作成する見えない作業変数(String型同士を連結した結果文字列など)
・関数から抜けた時に呼び出し元に戻るべき場所
・イベントが終了して元の地点に戻るべき場所
を、すべてスタック領域に保存し、関数から抜けるまで保持し続けます。

再帰を5段階行う(関数から抜ける事なく、自分自身を5回呼ぶ)と、上記の内容が5つ分、スタックに上積みされます。

もし、スタック領域が全体で512キロバイトで、1段分に4キロバイト消費すると仮定すると、512÷4=128で、128階層まで深くなると破綻し、スタック領域不足が出ます。

投稿日時 - 2006-08-07 16:34:44

お礼

chie65536さん、コメントありがとうございます。
もともとのOCXの設計、もしくは使用方法に問題があったのですね。
スタック領域を増やす事はできないので、別の方法でファイルを取得するようにしました。

投稿日時 - 2006-08-08 09:13:48

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

イベントはマルチスレッドで動作するので、
これが「イベントの連鎖」として異常を起こしている、
と考えられます。
ですから、コード上でイベント実行中にイベントを起動しない、
という動きにするなどの対策が必要です。

投稿日時 - 2006-08-07 16:19:35

お礼

SUPER-NEOさん、コメントありがとうございます。
イベント実行中にイベントを実行しないことで解決しました。

投稿日時 - 2006-08-08 09:11:54

あなたにオススメの質問