Jump to content

IDispatchEx


jugador
 Share

Recommended Posts

On search about binding function to object got this:
https://www.vbforums.com/showthread.php?876011-Has-anyone-had-any-success-implementing-IDispatch-IDispatchEx
So search forum about IDispatchEx but return 0.

Use Google to search AutoHotkey forum got this link
https://www.autohotkey.com/boards/viewtopic.php?t=5277

convert to Autoit and yes it work.
IDispatchEx look interesting.
so why no post on IDispatchEx? :huh2:

Edited by jugador
Link to comment
Share on other sites

9 hours ago, jugador said:

convert to Autoit and yes it work.
IDispatchEx look interesting.
so why no post on IDispatchEx? :huh2:

Did you convert it ?

Why you did not post it here yet ?

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

I think may be this the reason why i failed to map dynamic function 

https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/windows-scripting/reference/idispatchex-interface

In the above link given example to Obtains the dispatch pointer to the cat function using GetDispID().

hr = pdexScript->GetDispID(bstrName, 0, &dispid);  

Now question is how come fdex flag be 0:ranting:

If i look at DispEx header file, i only see this value:

fdexNameCaseSensitive       0x00000001
fdexNameEnsure              0x00000002
fdexNameImplicit            0x00000004
fdexNameCaseInsensitive     0x00000008
fdexNameInternal            0x00000010
fdexNameNoDynamicProperties 0x00000020

Now when I try to map a function using 0 getting error: 0x80020006

Local $grfdex = 0
Local $iRet = $p_IDispatchEx.GetDispID($BSTR, $grfdex, $Disp)

so how to solve this puzzle?
any help :P

Link to comment
Share on other sites

fdexNameEnsure Creates/map a new element.
so when you try to Invoke the dynamic function using DISPATCH_METHOD you will get crash.

all good if you set/Invoke dynamic element using DISPATCH_PROPERTYPUT.

Edited by jugador
Link to comment
Share on other sites

note: GetDispID -> grfdex -> 0 = fdexNameCaseSensitive  

try this html code

Func __GetHTML()
    Local $sHTML = _
                '<!DOCTYPE html>' & @CRLF & _
                '<html>' & @CRLF & _
                '<meta http-equiv="X-UA-Compatible" content="IE=edge">' & @CRLF & _
                '<body>' & @CRLF & _
                '<h1>Hello World</h1>' & @CRLF & _
                '<script type="text/javascript">' & @CRLF & _
                'var CatNo = 12' & @CRLF & _
                'function CatFun(){' & @CRLF & _
                '   alert("Hello! I am an alert box!!");' & @CRLF & _
                '}' & @CRLF & _
                '</script>' & @CRLF & _
                '</body>' & @CRLF & _
                '</html>'
    Return $sHTML
EndFunc

all worked :D
able to add dynamic element  => CatFood
able to change element            => CatNo 
able to call function                  => CatFun 

except failed to call dynamic function => CatSound 

Volatile Func CatSound()
    MsgBox(0, '', 'CatSound(ok)')
EndFunc

 

Edited by jugador
Link to comment
Share on other sites

Microsoft idispatchex example run smoothly :)

Func __GetHTMA()
    ; https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/windows-scripting/reference/idispatchex-interface
    Local $sHTML = _
                '<!DOCTYPE html>' & @CRLF & _
                '<html>' & @CRLF & _
                '<meta http-equiv="X-UA-Compatible" content="IE=edge">' & @CRLF & _
                '<body>' & @CRLF & _
                '<h1>Hello World</h1>' & @CRLF & _
                '<script type="text/javascript">' & @CRLF & _
                'var CatNo = 12' & @CRLF & _
                'function CatFun(){' & @CRLF & _
                '   alert("Hello! I am an alert box!!");' & @CRLF & _
                '   this.Bar = 10;' & @CRLF & _
                '}' & @CRLF & _
                'function test(){' & @CRLF & _
                '   // Construct new object' & @CRLF & _
                '   Obj = new Object();' & @CRLF & _
                '   // Create new element and assign function pointer' & @CRLF & _
                '   Obj.Elem = cat;' & @CRLF & _
                '   // Call Elem method ("this" == Obj)' & @CRLF & _
                '   Obj.Elem();' & @CRLF & _
                '   // Obj.Bar now exists' & @CRLF & _
                '}' & @CRLF & _
                'test();' & @CRLF & _
                '</script>' & @CRLF & _
                '</body>' & @CRLF & _
                '</html>'
    Return $sHTML
EndFunc

 

Now I know why this failed :whistle:

Volatile Func CatSound()
    MsgBox(0, '', 'CatSound(ok)')
EndFunc

I have to map the CatSound() function to DispID
option are : DllCallbackRegister & @trancexx  __ObjectFromTag

So question is how DllCallbackRegister work and how I convert DllCallbackGetPtr to idispatch object:unsure:

Link to comment
Share on other sites

I did able to map dynamic function using  __ObjectFromTag :sweating: but I didn't like it.

Local $o_FObj = __ObjectFromTag("", "CatSound hresult()", $t_FObj, True, False, '')
    ;....
    
    Local $oIE_Document = $oIE.Document
    $oIE_Document.open()
    $oIE_Document.write(__GetHTML())
    $oIE_Document.close()
    Local $oIE_window = $oIE_Document.parentWindow
    ;....   

    ;~ create a dummy element cat
    Local $iRet = $p_IDispatchEx.GetDispID('cat', 2, $Disp)     
    ;....
    
    ;~ map the $o_FObj object with cat element using $DISPATCH_PROPERTYPUT
    ;~ call the dynamic function
    $oIE_window.cat.CatSound()

 

Edit: 
there is no method in Autoit to return a function as object :ranting: but using Getref UDF we can make Invoke work with Autoit function :D
https://www.autoitscript.com/forum/topic/210870-getref-vbscript-type/

Edited by jugador
Link to comment
Share on other sites

_IEHeadInsertEventScript($oIE, "document", "onclick", "alert('Someone clicked the document!');")

like the above example (_IEHeadInsertEventScript) able to map FirstHtml onclick with SecondHtml CatFun Function :)

Func __Launch_FirstHtml(ByRef $oIE_Document)
    ConsoleWrite('> __Launch_FirstHtml()' & @CRLF)
    Local $oIE = _IE_Example("basic")
    sleep(1000)
    $oIE_Document = $oIE.document
EndFunc

Func __Launch_SecondHtml(ByRef $oIE_Document)
    ConsoleWrite('> __Launch_SecondHtml()' & @CRLF)
    Local $oIE = _IECreate()
    $oIE_Document = $oIE.Document
    $oIE_Document.open()
    $oIE_Document.write(__GetHTML())
    $oIE_Document.close()
EndFunc

Func __GetHTML()
    Local $sHTML = _
                '<!DOCTYPE html>' & @CRLF & _
                '<html>' & @CRLF & _
                '<meta http-equiv="X-UA-Compatible" content="IE=edge">' & @CRLF & _
                '<body>' & @CRLF & _
                '<h1>Hello World</h1>' & @CRLF & _
                '<script type="text/javascript">' & @CRLF & _
                'function CatFun(){' & @CRLF & _
                '   alert("Hello! I am an alert box of html2!!");' & @CRLF & _
                '}' & @CRLF & _
                '</script>' & @CRLF & _
                '</body>' & @CRLF & _
                '</html>'
    Return $sHTML
EndFunc

 

Link to comment
Share on other sites

To return a function as object we can use ScriptControl :)

__Example_A()
Func __Example_A()
    Local $oVB_Object = Null
    __VbScript_Object($oVB_Object)
    Local $o_CatFun = $oVB_Object.Eval("Obj_A")
    ConsoleWrite('$o_CatFun:  ' & VarGetType($o_CatFun) & @CRLF)
    ;....
    ;....
    $oVB_Object = 0
EndFunc

Func __VbScript_Object(ByRef $oVB_Object)
    $oVB_Object = ObjCreate("ScriptControl")
    Local $oVB_Code = __VbScript_Code()
    $oVB_Object.Language = "vbscript"
    $oVB_Object.AddCode($oVB_Code)
EndFunc

Func __VbScript_Code()
    Local $sVBCode = _
                'Dim msg_A, msg_B, Obj_A' & @CRLF & _
                'msg_A = "How are You?"' & @CRLF & _
                'msg_B = "I am fine."' & @CRLF & _
                'Function CatFun()' & @CRLF & _
                '   msgbox("From VbScript Testing Msg")' & @CRLF & _
                'End Function' & @CRLF & _
                'Set Obj_A = GetRef("CatFun")'
    Return $sVBCode
EndFunc

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...