ComObjConnect

COMオブジェクトのイベントソースをスクリプトに接続し、イベントを処理できるようにします。

ComObjConnect ComObj , PrefixOrSink

パラメータ

ComObj

型:ComObject

イベントを発生させるオブジェクトです。

オブジェクトが IConnectionPointContainer インターフェースをサポートしていない場合、またはオブジェクトのクラスに関する型情報を取得できない場合は、エラーメッセージを表示します。これを抑制したり、try/catchで処理することができる。

IProvideClassInfo インターフェースは、オブジェクトがクラスをサポートしている場合、そのクラスに関する型情報を取得するために使用されます。そうでない場合、ComObjConnectはオブジェクトのIDispatchインターフェースを介して型情報を取得しようとしますが、これは信頼性に欠ける可能性があります。

PrefixOrSink

型:文字列またはオブジェクト

省略された場合、オブジェクトは「切断」されます。つまり、スクリプトはそのイベントの通知を受けなくなります。Otherwise, specify a string to prefix to the event name to determine which global function to call when an event occurs, or an event sink object defining a static method for each event to be handled.

注:ネストされた関数は、現在の関数が戻った後に名前が解決される可能性があるため、このモードではサポートされていません。ネストされた関数やクロージャを使用するには、以下のようにオブジェクトにアタッチしてオブジェクトを渡します。

使用方法

ComObjConnectを有効に活用するためには、まずスクリプトに関数を記述し、対象となるイベントを処理する必要があります。このような関数(「イベントハンドラ」)は、次のような構造を持っています:

PrefixEventName([Params..., ComObj])
{
    ...イベント処理コード...
    return ReturnValue
}

Prefixは、文字列の場合はPrefixOrSinkパラメータと同じでなければならず、それ以外の場合は省略します。EventNameは、その関数が処理すべきイベントの名前に置き換える必要があります。

Paramsは、イベントが持つあらゆるパラメータに対応します。イベントにパラメータがない場合、Paramsは完全に省略されるべきです。ComObjは、ComObjConnectに渡されたオリジナルのラッパー・オブジェクトへの参照を含む追加パラメータです。"ComObj"は、スクリプトの文脈でより意味のある名前に置き換えてください。

なお、イベントハンドラには戻り値がある場合があります。COM固有のタイプの値を返すには、ComValueを使用します。例えば、return ComValue(0,0)はVT_EMPTY型のバリアントを返し、これはJavaScriptの関数からundefinedを返す(あるいは返さない)ことと同じです。

ComObjConnect(yourObject, "Prefix")を呼び出し、イベントハンドリングを有効にします。

ComObjConnect(yourObject)を呼び出し、オブジェクトの接続を解除する(イベントの処理を停止する)。

パラメータの数がわからない場合は、変分関数を使用することができます。

イベント同期

PrefixOrSinkがオブジェクトの場合、イベントが発生するたびに、そのオブジェクトの対応するメソッドが呼び出されます。オブジェクトは動的に構築することができますが、PrefixOrSinkはクラスまたはクラスのインスタンスを参照するのが一般的です。その場合、メソッドは上記のように定義されるが、Prefixは含まれない。

メソッドの呼び出しと同様に、メソッドの(通常は非表示の)thisパラメータは、メソッドが呼び出されたオブジェクトへの参照を含んでいます;すなわち、COMオブジェクトではなく、イベントシンクオブジェクトです。イベントハンドラにコンテキストを提供したり、イベントハンドラ間で値を共有するために使用することができます。

イベントごとにメソッドを定義することなく、すべてのイベントをキャッチするには、__Callメタファンクションを定義します。

COMオブジェクトが接続を解放すると、PrefixOrSinkへの参照は自動的に解放されます。例えば、Internet Explorerは終了時にこのような動作をします。スクリプトがPrefixOrSinkへの参照を保持しない場合、__Deleteを使用することでその発生を検出することができます。オブジェクトがリモートプロセスによってホストされており、そのプロセスが予期せず終了した場合、システムが接続を解除するまでに数分かかることがあります。

備考

スクリプトはComObjへの参照を保持する必要があります。そうしないと、自動的に解放され、COMオブジェクトから切断され、それ以降のイベントが検出されなくなるからです。接続が不要になったことを検出する標準的な方法はないため、スクリプトはComObjConnectを呼び出して手動で接続を切断する必要があります。

Persistent関数は、スクリプトがイベントをリッスンしている間、実行し続けるために必要な場合があります。

失敗した場合は例外がスローされます。

ComObjectComObjGetComObjActiveWScript.ConnectObject (Microsoft Docs)

Internet Explorerのインスタンスを起動し、接頭辞 "IE_"を持つ対応するスクリプト関数にイベントを接続します。以下で使用するCOMオブジェクトとDocumentCompleteイベントの詳細は、InternetExplorerオブジェクト (Microsoft Docs)をご覧ください。

ie := ComObject("InternetExplorer.Application")

; イベントと対応するスクリプト関数を "IE_"という接頭辞で接続します。
ComObjConnect(ie, "IE_")

ie.Visible := true  ; IE7では正しく動作しないことが確認されています。
ie.Navigate("https://www.autohotkey.com/")
Persistent

IE_DocumentComplete(ieEventParam, &url, ieFinalParam) {
    ; IEはurlをVARIANTへの参照として渡すため、上記では&urlが使用されています。
    ; 以下のコードで%url%としてではなく、自然に参照できるようにするためです。
    s := ""
    if (ie != ieEventParam)
        s .= "First parameter is a new wrapper object.`n"
    if (ie == ieFinalParam)
        s .= "Final parameter is the original wrapper object.`n"
    if (ComObjValue(ieEventParam) == ComObjValue(ieFinalParam))
        s .= "Both wrapper objects refer to the same IDispatch instance.`n"
    MsgBox s . "Finished loading " ie.Document.title " @ " url
    ie.Quit()
    ExitApp
}