2

是否可以修改 COM 事件方法传递的函数参数的内存值?COM 对象中的属性值需要编辑。

Refresh我正在尝试为 ActiveX 控件设置自定义用户代理,如果用户选择或打开链接页面,则使用自定义标题重新导航加载页面不成功。该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 类型的按位或组合来支持 ByRef,例如VT_VARIANT.

某些语言(如 VBScript)VT_BYREF|VT_VARIANT默认提供类型(0x400C)的变体;当参数的类型未知时,也许支持 ByRef。因此,AutoHotkey 会自动取消引用这些变体。因此,您的BeforeNavigate2方法永远不会收到引用,也无法输出到它的任何ByRef Variant参数。

对于更具体类型的任何ByRef参数,例如ByRef Cancel As Boolean,参数(在脚本中)应该接收一个表示引用的对象。例如,ComObjType(Cancel)将返回VT_BYREF|VT_BOOL(0x400B) 并返回可以存储布尔值ComObjValue(Cancel)的变量的地址。以下可用于存储值:VARIANT_BOOL

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

VT_DISPATCH、VT_UNKNOWN 和 VT_BSTR 类型的 ByRef 输入/输出参数有附加要求。如果前一个值非 NULL,则必须先将其释放。对于 VT_BSTR,必须使用SysAllocString(必须通过 DllCall 调用)分配新字符串。

于 2013-03-02T07:43:10.837 回答