jugador Posted November 8, 2023 Share Posted November 8, 2023 (edited) 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? Edited November 8, 2023 by jugador Link to comment Share on other sites More sharing options...
Andreik Posted November 8, 2023 Share Posted November 8, 2023 There are many things that are not yet implemented in AutoIt in the form of a UDF or as function. Usually things are implemented when a need arises. Link to comment Share on other sites More sharing options...
mLipok Posted November 9, 2023 Share Posted November 9, 2023 9 hours ago, jugador said: convert to Autoit and yes it work. IDispatchEx look interesting. so why no post on IDispatchEx? 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 Code * for 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 API * ErrorLog.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 TaskScheduler * IE 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 stuff * OnHungApp handler * Avoid "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" , 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 More sharing options...
Andreik Posted November 9, 2023 Share Posted November 9, 2023 Technically there is nothing to be converted, it's as simple as querying the IDispatchEx. Link to comment Share on other sites More sharing options...
jugador Posted November 11, 2023 Author Share Posted November 11, 2023 Setting dynamic property using IDispatchEx is easy. Invoking dynamic function using IDispatchEx not working. I will post after I make it work. Link to comment Share on other sites More sharing options...
jugador Posted November 12, 2023 Author Share Posted November 12, 2023 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? 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 Link to comment Share on other sites More sharing options...
ahmet Posted November 12, 2023 Share Posted November 12, 2023 What happens when you use fdexNameEnsure, as that is what you should use by the documentation. Does your object have cat member? Link to comment Share on other sites More sharing options...
jugador Posted November 12, 2023 Author Share Posted November 12, 2023 (edited) 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 November 12, 2023 by jugador Link to comment Share on other sites More sharing options...
ahmet Posted November 12, 2023 Share Posted November 12, 2023 Can you share your code? Somebody might be able to help more if there is some code. Link to comment Share on other sites More sharing options...
jugador Posted November 13, 2023 Author Share Posted November 13, 2023 (edited) 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 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 November 13, 2023 by jugador Link to comment Share on other sites More sharing options...
ahmet Posted November 13, 2023 Share Posted November 13, 2023 Post all the code you have. There is a better chance that somebody takes a look at it. . Link to comment Share on other sites More sharing options...
jugador Posted November 17, 2023 Author Share Posted November 17, 2023 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 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? Link to comment Share on other sites More sharing options...
jugador Posted November 20, 2023 Author Share Posted November 20, 2023 (edited) I did able to map dynamic function using __ObjectFromTag 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 but using Getref UDF we can make Invoke work with Autoit function https://www.autoitscript.com/forum/topic/210870-getref-vbscript-type/ Edited November 26, 2023 by jugador Link to comment Share on other sites More sharing options...
jugador Posted November 23, 2023 Author Share Posted November 23, 2023 _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 More sharing options...
jugador Posted November 24, 2023 Author Share Posted November 24, 2023 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now