2009-05-01 10 views
0

これはかなり複雑な問題ですが、すでにautoit IE.au3プロジェクトでは難しい作業が行われているようです。今ではルビとwin32apiで熟練した人がいて、IE.au3で書かれた関数をルビに変換する方法を理解するためにオートチェンジャーを使うだけです。最終的には、埋め込まれたIEブラウザ(IEは別のアプリケーションに組み込まれています)でWatirを使用したいと考えています。私はautoit関数がうまく動作していることをテストしましたが、私は使用しているアプリケーションでうまく動作しますが、htmlをテストするためにautoitではなくwatir(ルビ)を使用したいと考えています。ruby​​ win32apiを使った埋め込みIEブラウザのCOMオブジェクトを取得

私は組み込みブラウザのhwndを得ることができます(autoitとのインタフェースと、ControlitHandle関数を使用しています--noteはIE.au3とインターフェースできません。定義された関数ライブラリー - UDF)。以下は、私が翻訳する必要がある関数です(私はこの関数が呼び出す2つの他の短い関数も含んでいますが、実際にそれらを必要としません。ここで

;=============================================================================== 
; 
; Function Name: __IEControlGetObjFromHWND() 
; Description:  Returns a COM Object Window reference to an embebedded Webbrowser control 
; Parameter(s):  $hWin  - HWND of a Internet Explorer_Server1 control obtained for example: 
;     $hwnd = ControlGetHandle("MyApp","","Internet Explorer_Server1") 
; Requirement(s): Windows XP, Windows 2003 or higher. 
;     Windows 2000; Windows 98; Windows ME; Windows NT may install the 
;     Microsoft Active Accessibility 2.0 Redistributable: 
;     http://www.microsoft.com/downloads/details.aspx?FamilyId=9B14F6E1-888A-4F1D-B1A1-DA08EE4077DF&displaylang=en 
; Return Value(s): On Success - Returns DOM Window object 
;     On Failure - 0 and sets @ERROR = 1 
; Author(s):  Larry with thanks to Valik 
; 
;=============================================================================== 

Func __IEControlGetObjFromHWND(ByRef $hWin) 
    DllCall("ole32.dll", "int", "CoInitialize", "ptr", 0) 
    Local Const $WM_HTML_GETOBJECT = __IERegisterWindowMessage("WM_HTML_GETOBJECT") 
    Local Const $SMTO_ABORTIFHUNG = 0x0002 
    Local $lResult, $typUUID, $aRet, $oIE 
MsgBox(0, "msg", $WM_HTML_GETOBJECT) 


    __IESendMessageTimeout($hWin, $WM_HTML_GETOBJECT, 0, 0, $SMTO_ABORTIFHUNG, 1000, $lResult) 

    $typUUID = DllStructCreate("int;short;short;byte[8]") 
    DllStructSetData($typUUID, 1, 0x626FC520) 
    DllStructSetData($typUUID, 2, 0xA41E) 
    DllStructSetData($typUUID, 3, 0x11CF) 
    DllStructSetData($typUUID, 4, 0xA7, 1) 
    DllStructSetData($typUUID, 4, 0x31, 2) 
    DllStructSetData($typUUID, 4, 0x0, 3) 
    DllStructSetData($typUUID, 4, 0xA0, 4) 
    DllStructSetData($typUUID, 4, 0xC9, 5) 
    DllStructSetData($typUUID, 4, 0x8, 6) 
    DllStructSetData($typUUID, 4, 0x26, 7) 
    DllStructSetData($typUUID, 4, 0x37, 8) 


    MsgBox(0, "lResult", $lResult) 


    $aRet = DllCall("oleacc.dll", "long", "ObjectFromLresult", "lresult", $lResult, "ptr", DllStructGetPtr($typUUID), _ 
      "wparam", 0, "idispatch*", 0) 
MsgBox(0, "aRet4", $aRet[4]) 
    If IsObj($aRet[4]) Then 
     $oIE = $aRet[4] .Script() 
     ; $oIE is now a valid IDispatch object 
     Return $oIE.Document.parentwindow 
    Else 
     SetError(1) 
     Return 0 
    EndIf 
EndFunc ;==>__IEControlGetObjFromHWND 
;=============================================================================== 
; Function Name: __IERegisterWindowMessage() 
; Description:  Required by __IEControlGetObjFromHWND() 
; Author(s):  Larry with thanks to Valik 
;=============================================================================== 
Func __IERegisterWindowMessage($sMsg) 
    Local $aRet = DllCall("user32.dll", "int", "RegisterWindowMessage", "str", $sMsg) 
    If @error Then Return SetError(@error, @extended, 0) 
    Return $aRet[0] 
EndFunc ;==>__IERegisterWindowMessage 

;=============================================================================== 
; Function Name: __IESendMessageTimeout() 
; Description:  Required by __IEControlGetObjFromHWND() 
; Author(s):  Larry with thanks to Valik 
;=============================================================================== 
Func __IESendMessageTimeout($hWnd, $msg, $wParam, $lParam, $nFlags, $nTimeout, ByRef $vOut, $r = 0, $t1 = "int", $t2 = "int") 
    Local $aRet 
    $aRet = DllCall("user32.dll", "long", "SendMessageTimeout", "hwnd", $hWnd, "int", $msg, $t1, $wParam, _ 
      $t2, $lParam, "int", $nFlags, "int", $nTimeout, "int*", "") 
    If @error Then 
     $vOut = 0 
     Return SetError(@error, @extended, 0) 
    EndIf 
    $vOut = $aRet[7]  
    If $r >= 0 And $r <= 4 Then Return $aRet[$r] 
    Return $aRet 
EndFunc ;==>__IESendMessageTimeout 

は私が持っているもので、これまでに(ほとんど同じ問題を解決しようとしていたネット上の別のポスターから来て、正しい軌道上にあるように見えたもの):

def get_control_from_hwnd(hnd) 
    Win32API.new("ole32", "CoInitialize", ['P'] , 'I').call(0) 

    reg_msg = Win32API.new("user32", "RegisterWindowMessage", ['P'] ,'I').call("WM_HTML_GETOBJECT") 
    puts "msg: " + reg_msg.to_s 
    result=" "*16 
    aInt = [0xA7, 0x31, 0x0, 0xA0, 0xC9, 0x8, 0x26, 0x37].pack 'I*' 
    a = [0x626FC520, 0xA41E, 0x11CF, aInt].pack 'IIIP' 

    sendMessagetimeout = Win32API.new("user32", "SendMessageTimeout", ['L','I','I','I','I','I','P'] , 'L') 
    sendMessagetimeout.call(hnd.hex, reg_msg, 0, 0, SMTO_ABORTIFHUNG, 1000, result) 

    puts "result unpacked: " + result.unpack("L").to_s #i can confirm this is the same as the lResult from the autoit functioin 

    idisp=0 
    #the problem is likely either here or the next line afterwards 
    oIE = Win32API.new("oleacc", "ObjectFromLresult", ['P','P','I','P'] , 'L') 


    oIE.call(result, a, 0, idisp) 
    puts "idisp: " + idisp.to_s 
    # returning zero 
    puts idisp.unpack("L") 

end 

よし私はそれがここで誰かよりも多くの仕事が喜んでいることを知っていますが、おそらくあなたが私の翻訳とオリジナルを見れば、何かが間違っているとしてあなたに飛び出すことがあります。私は確かに解決策を思い付く人に恩恵を与えるでしょう

答えて

0

私はPerlでやろうとしていますが、同じことをやっているとは信じられません。私はRubyを使いませんが、スクリプトを見るとPerlに似ています。 autoItでこのスレッドを見てください。ここで私はまだ問題を解決しようとしていますhttp://www.autoitscript.com/forum/index.php?showtopic=104894。しかし、私はidispを得たかもしれないと思う。 2つの変更:

1)構造体をパッキングする方法は少し異なります。 My $ iidは パック( 'LSSC8'、0x626FC520,0xA41E、0x11CF、0xA7,0x31,0x00,0xA0,0xC9,0x08,0x26,0x37)のようになります。ですから、Rubyでは、[LS6]、[0x6CFC、0x11CF、0xA7,0x31,0x00,0xA0,0xC9,0x08,0x26,0x37]のようになります。私は正しい構文を知らないが、あなたはその考えを得る。 2)SendMessageTimeout &から "result"をアンパックし、ObjectFromLresultに渡します。私が結果を直接渡すと、あなたはそれを得ていたように私は0になります。

しかし、それは私が行った限りです。

関連する問題