• ベストアンサー

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

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

文字通り、スタック領域を増やすしかありません。 イベント連鎖は関係ありません。 関数から自分自身を再帰的に呼ぶと、 ・値渡しされた引数 ・関数内で定義したローカル変数 ・関数内で確保された動的領域(String型変数などの実体) ・VBが暗黙的に作成する見えない作業変数(String型同士を連結した結果文字列など) ・関数から抜けた時に呼び出し元に戻るべき場所 ・イベントが終了して元の地点に戻るべき場所 を、すべてスタック領域に保存し、関数から抜けるまで保持し続けます。 再帰を5段階行う(関数から抜ける事なく、自分自身を5回呼ぶ)と、上記の内容が5つ分、スタックに上積みされます。 もし、スタック領域が全体で512キロバイトで、1段分に4キロバイト消費すると仮定すると、512÷4=128で、128階層まで深くなると破綻し、スタック領域不足が出ます。

sputnik8823
質問者

お礼

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

その他の回答 (1)

  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.1

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

sputnik8823
質問者

お礼

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

関連するQ&A

専門家に質問してみよう