2

COM イベント メソッドによって渡される関数パラメーターのメモリ値を変更することは可能ですか? COM オブジェクトのプロパティ値を編集する必要があります。

ActiveX コントロールのカスタム ユーザー エージェントを設定しようとしていますが、ユーザーがRefreshリンクされたページを選択または開いた場合、カスタム ヘッダーを使用して読み込みページを再ナビゲートできませんでした。また、メソッドで設定されたヘッダーはNavigate()フレーム付きページには適用されません。

MSDN ( http://msdn.microsoft.com/en-us/library/aa768326%28v=vs.85%29.aspx ) によると、ヘッダー値のパラメーターは ByRef として渡されます。

それで単純に新しい価値を入れてみたのですが、うまくいきませんでした。

ですから、メモリに格納されている値を直接変更すれば実現できるのではないかと考えています。そこで、以下を試してみましたがうまくいきません。

何か案が?

oWB := new WebBrowser("http://sofiablue.net/")

Class WebBrowser
{

    __New(strURL) { 

        static WB
        Gui, New, Resize 
        Gui, Add, ActiveX, vWB w780 h580 , Shell.Explorer  
        Gui, show, w800 h600

        ComObjConnect(WB, this) 

        WB.Navigate(strURL  
            , "_self"
            , null
            , null
            , "User-Agent: tester")
        Loop
           Sleep 10
        Until (WB.readyState=4 && WB.document.readyState="complete" && !WB.busy)    

    }

    BeforeNavigate2(oParams*) {
        ; oParams[6] := "User-Agent: modified" ; this does not work.
        ; StrPut("User-Agent: modified", oParams.GetAddress(6)) ; does not work     
        this.StrPutVar("User-Agent: modified", oParams[6], "utf-16")    ; does not work
    }

    StrPutVar(string, ByRef var, encoding)
    {
        ; Ensure capacity.
        VarSetCapacity( var, StrPut(string, encoding)
            ; StrPut returns char count, but VarSetCapacity needs bytes.
            * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
        ; Copy or convert the string.
        return StrPut(string, &var, encoding)
    }       
}
4

1 に答える 1

1

AutoHotkey では、COM イベントの ByRef パラメータのサポートが非常に制限されています。

COM パラメータは、VARIANTARG 構造体の配列を介して渡されます。VT_BYREF呼び出し元は、変数のアドレスをバリアントに格納し、型を とパラメーターの var-type のビットごとの OR の組み合わせに設定することで、ByRef をサポートしますVT_VARIANT

一部の言語 (VBScript など) では、既定でバリアント型VT_BYREF|VT_VARIANT(0x400C) が提供されます。おそらく、パラメーターの型が不明な場合に ByRef をサポートするためです。このため、AutoHotkey はそのようなバリアントを自動的に逆参照します。その結果、メソッドは参照を受け取ることはなく、そのパラメーターBeforeNavigate2のいずれにも出力できません。ByRef Variant

ByRefなどのより具体的なタイプのパラメータの場合ByRef Cancel As Boolean、(スクリプト内の) パラメータは参照を表すオブジェクトを受け取る必要があります。たとえば、(0x400B) をComObjType(Cancel)返し、ブール値を格納できる変数のアドレスを返します。以下を使用して、真の値を格納できます。VT_BYREF|VT_BOOLComObjValue(Cancel)VARIANT_BOOL

if (ComObjType(Cancel) = 0x400B)  ; Safety check
    NumPut(-1, ComObjValue(Cancel), "short")

タイプ VT_DISPATCH、VT_UNKNOWN、および VT_BSTR の ByRef in/out パラメータには、追加の要件があります。以前の値が NULL でない場合は、最初に解放する必要があります。VT_BSTR の場合、新しい文字列はSysAllocString(DllCall 経由で呼び出す必要がある) を使用して割り当てる必要があります。

于 2013-03-02T07:43:10.837 に答える