エラーメッセージの意味は?


hk  2008-11-28 12:31:58  No: 140903  IP: 192.*.*.*

VB6プログラムで、”他のアプリケーションがサーバーを使用している・・”のエラーメッセージに遭遇しました。
1、このエラーメッセージの意味を教えてください。
2、エラーメッセージを出しているモジュールは、windowsですか?VBですか?
3、App.OleRequestPendingTimeout=5000 (ディフォルト)
    App.OleServerBusyTimeout=10000(ディフォルト)
    となっていますが、この値はどのように遣われているのでしょうか?
教えてください。

編集 削除
hk  2008-11-28 12:33:57  No: 140904  IP: 192.*.*.*

VB6プログラムで、”他のアプリケーションがサーバーを使用している・・”のエラーメッセージに遭遇しました。
1、このエラーメッセージの意味を教えてください。
2、エラーメッセージを出しているモジュールは、windowsですか?VBですか?
3、App.OleRequestPendingTimeout=5000 (ディフォルト)
    App.OleServerBusyTimeout=10000(ディフォルト)
    となっていますが、この値はどのように遣われているのでしょうか?
教えてください。

編集 削除
魔界の仮面弁士  2008-11-28 14:03:36  No: 140905  IP: 192.*.*.*

> 1、このエラーメッセージの意味を教えてください。

ActiveX コンポーネントを呼び出す際に、呼び出し先から一定時間応答がない(ビジー状態)と発生します。

たとえば、プログラムから Excel を操作するような場合、起動した Excel で長い計算処理や保存処理を行っていたり、あるいはファイル保存画面などでユーザー応答を待っている最中に、Excel のプロパティやメソッドを呼び出そうとした時などにも発生する事があります。

あるいは、開発環境から F1 キーでヘルプを表示させる際に、ヘルプの起動に長い時間がかかってしまった場合、ヘルプの起動中に VB 開発環境をアクティブにしようとすると、そのメッセージが表示される事があります。


> 2、エラーメッセージを出しているモジュールは、windowsですか?VBですか?
メッセージそのものは、ActiveX コンポーネントの呼び出し元(通常は VB)が発していますが、その原因は呼び出された側(OLE サーバー/オートメーション サーバー)にある可能性があります。


> 3、App.OleRequestPendingTimeout=5000 (ディフォルト)
>     App.OleServerBusyTimeout=10000(ディフォルト)
>     となっていますが、この値はどのように遣われているのでしょうか?

前者は 5 秒、後者は 10 秒に設定されていますね。

たとえば、ActiveX コンポーネントのプロパティやメソッドを呼び出した後、その結果が返ってくるまで、長い時間——たとえば 60 秒かかってしまう場合を想定してみてください。

ActiveX の呼出し後、VB の画面を触る(キーボード入力/マウス入力)と、この場合は 60 秒経過するまで、それらの入力が処理されない事になってしまいます。

そこで VB は、OleRequestPendingTimeout で指定された時間以内に、処理が完了しなかった場合、その事をメッセージボックスで通知します。

そのメッセージの表示後、そこからまた OleRequestPendingTimeout の分だけ同じように待機し、その間にまた VB 側に入力があれば、メッセージで問い合わせるという行為を繰り返します。


そうした待機処理を繰り返し、ついには OleServerBusyTimeout で指定された時間まで待っても処理が終わらない場合、これ以上待ち続けるかどうかを確認するために、ここで「再試行」と「キャンセル」ボタンを持ったメッセージボックスを表示させてきます。

ここで再試行を行えば、そこからまた待機処理が繰り返されます。そしてキャンセルを押せば、そのメソッド呼び出しが拒否された物として扱われ、実行時エラー(Err.Number = &H80010001)として処理されます。


なお、これらのメッセージを変更したい場合には、
  App.OleRequestPendingMsgTitle
  App.OleRequestPendingMsgText
  App.OleServerBusyMsgText
  App.OleServerBusyMsgTitle
  App.OleServerBusyRaiseError
などを使う事ができます。



Option Explicit

Private Excel As Object

Private Sub Command1_Click()
    On Error Resume Next

    App.OleRequestPendingTimeout = 2000
    App.OleRequestPendingMsgText = "まだ終わらんよ"

    App.OleServerBusyTimeout = 10000
    App.OleServerBusyMsgText = "これで終わりにするか、続けるか"
    
    Set Excel = CreateObject("Excel.Application")
    Excel.Visible = True

    MsgBox "Excel で、[ファイルを開く]の画面を開き、その画面を表示させたまま、このメッセージボックスを閉じてみてください。", vbSystemModal Or vbInformation

    On Error Resume Next
    Excel.Quit

    If Err.Number <> 0 Then
        MsgBox Err.Description, vbExclamation, Hex(Err.Number)
    End If
End Sub

編集 削除