Leaderboard
Popular Content
Showing content with the highest reputation on 09/09/2019 in all areas
-
And assuming that there are no digits in the item names, it could even be done like this $a = stringregexp($s, "(?m)^\D+(\S+)" , 3) ... my 2 cents1 point
-
WebDriver UDF - Help & Support
nooneclose reacted to Danp2 for a topic
@nooneclose No, I believe the issue is that the webdriver app (ChromeDriver in this case) isn't properly handling these commands.1 point -
Creating a "brushed up" Task Scheduler UDF?
seadoggie01 reacted to water for a topic
The wiki will have a section referring to the relevant MS documentation. I understand. That's how you figured out that I'm no native speaker 😂1 point -
Sequential FIle Append
Werty reacted to FrancescoDiMuro for a topic
@Werty Thanks for the information! I was just asking1 point -
Seems to me that inserting ourselves between autoit and GetIDsFromNames would be a better way... monoceres already showed how to patch the vtable here: https://www.autoitscript.com/forum/topic/107678-hooking-into-the-idispatch-interface/ Instead lets just add a fake function Au3_CallByName and intercept that then put our desired function name in its place and pass it on to the real GetIDsFromNames function then we can still use autoit to do all the icky type conversions for us... #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=y #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;Au3CallByName, Bilgus Global $Au3_CallByName = 0 Local $hKernel32 = DllOpen("Kernel32.dll") OnAutoItExitRegister(__CallByNameCleanup) Func __CallByNameCleanup() Au3_CallByName_Init(Default, False) ;Unload DllClose($hKernel32) EndFunc ;==>__CallByNameCleanup ; Takes a pointer to the v-table in a class and replaces specified member Id in it to a new one. Func __HookVTableEntry($pVtable, $iVtableOffset, $pHook, ByRef $pOldRet) ;;https://www.autoitscript.com/forum/topic/107678-hooking-into-the-idispatch-interface/ Local Const $PAGE_READWRITE = 0x04 Local $tpVtable = DllStructCreate("ptr", $pVtable) Local $szPtr = DllStructGetSize($tpVtable) Local $pFirstEntry, $pEntry, $tEntry, $aCall, $flOldProtect, $bStatus ; Dereference the vtable pointer $pFirstEntry = DllStructGetData($tpVtable, 1) $pEntry = $pFirstEntry + ($iVtableOffset * $szPtr) ; Make the memory free for all. Yay! $aCall = DllCall($hKernel32, "int", "VirtualProtect", "ptr", $pEntry, "long", $szPtr, "dword", $PAGE_READWRITE, "dword*", 0) If Not IsArray($aCall) Or Not $aCall[0] Then ConsoleWriteError("Error: Failed To hook vTable" & @CRLF) Return False EndIf $flOldProtect = $aCall[4] $tEntry = DllStructCreate("ptr", $pEntry) $pOldRet = DllStructGetData($tEntry, 1) If $pOldRet <> $pHook Then DllStructSetData($tEntry, 1, $pHook) $bStatus = True Else ;Already Hooked ConsoleWriteError("Error: vTable is already hooked" & @CRLF) $bStatus = False EndIf ;put the memory protect back how we found it DllCall($hKernel32, "int", "VirtualProtect", "ptr", $pEntry, "long", $szPtr, "dword", $flOldProtect, "dword*", 0) Return $bStatus EndFunc ;==>__HookVTableEntry ; Everytime autoit wants to call a method, get or set a property in a object it needs to go to ; IDispatch::GetIDsFromNames. This is our version of that function, note that by defining this ourselves ; we can fool autoit to believe that the object supports a lot of different properties/methods. Func __IDispatch_GetIDsFromNames($pSelf, $riid, $rgszNames, $cNames, $lcid, $rgDispId) Local Const $DISP_E_UNKNOWNNAME = 0x80020006 Local Static $pGIFN = __Pointer_GetIDsFromNames() If $Au3_CallByName Then Local $hRes, $aCall ;autoit only asks for one member $aCall = DllCall($hKernel32, "int", "lstrlenW", "struct*", _ DllStructGetData(DllStructCreate("ptr", $rgszNames), 1)) Local $iSz = IsArray($aCall) ? $aCall[0] + 1 : 256 Local $tMember = DllStructCreate("wchar[" & $iSz & "]", _ DllStructGetData(DllStructCreate("ptr", $rgszNames), 1)) Local Static $tpMember = DllStructCreate("ptr pointer") ;ConsoleWrite("AutoIt wants to look up: " & DllStructGetData($tMember, 1) & @CRLF) If DllStructGetData($tMember, 1) == "Au3_CallByName" Then ;ConsoleWrite("CallByName: " & $Au3_CallByName & @CRLF) $tMember = DllStructCreate("wchar[" & StringLen($Au3_CallByName) + 1 & "]") DllStructSetData($tMember, 1, $Au3_CallByName) DllStructSetData($tpMember, 1, DllStructGetPtr($tMember)) $rgszNames = $tpMember $Au3_CallByName = 0 EndIf EndIf ;Call the original GetIDsFromNames $hRes = DllCallAddress("LRESULT", $pGIFN, "ptr", $pSelf, "ptr", $riid, _ "struct*", $rgszNames, "dword", $cNames, "dword", $lcid, "ptr", $rgDispId) If @error Or Not IsArray($hRes) Then ConsoleWrite("Error: GetIDsFromNames: " & @error & @CRLF) Return $DISP_E_UNKNOWNNAME EndIf Return $hRes[0] EndFunc ;==>__IDispatch_GetIDsFromNames Func __Pointer_GetIDsFromNames($ptr = 0) Local Static $pOldGIFN = $ptr If $ptr <> 0 Then $pOldGIFN = $ptr Return $pOldGIFN EndFunc ;==>__Pointer_GetIDsFromNames Func Au3_CallByName_Init($classname = Default, $bHook = True) If $classname = Default Then $classname = "shell.application" Local $oObject, $pObject, $pHook, $pOldGIFN Local Const $iOffset_GetIDsFromNames = 5 Local Static $IDispatch_GetIDsFromNames_Callback = 0 If $bHook Then If $IDispatch_GetIDsFromNames_Callback = 0 Then $IDispatch_GetIDsFromNames_Callback = DllCallbackRegister("__IDispatch_GetIDsFromNames", "LRESULT", "ptr;ptr;ptr;dword;dword;ptr") EndIf $pHook = DllCallbackGetPtr($IDispatch_GetIDsFromNames_Callback) Else $pHook = __Pointer_GetIDsFromNames() If $pHook <= 0 Then Return ;Already Unloaded EndIf $oObject = ObjCreate($classname) $pObject = DllStructSetData(DllStructCreate("ptr"), 1, $oObject) If __HookVTableEntry($pObject, $iOffset_GetIDsFromNames, $pHook, $pOldGIFN) Then __Pointer_GetIDsFromNames($pOldGIFN) ;Save the original pointer to GetIDsFromNames If Not $bHook Then DllCallbackFree($IDispatch_GetIDsFromNames_Callback) $IDispatch_GetIDsFromNames_Callback = 0 EndIf Else ;Error EndIf $oObject = 0 EndFunc ;==>Au3_CallByName_Init ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;TESTS; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Au3_CallByName_Init() #include <ie.au3> Global $oRegistrationInfo = _IECreate() Global $aRegistrationInfo[] = ['Left=1000', 'Width=450'] Global $oObject = $oRegistrationInfo Local $oDictionary = ObjCreate("Scripting.Dictionary") Local $oDictionary2 = ObjCreate("Scripting.Dictionary") ;Au3_CallByName_Init($oObject) __TS_TaskPropertiesSet($oObject, $aRegistrationInfo) MsgBox(0, "Info", "Press OK to exit") $oRegistrationInfo.quit $oRegistrationInfo = 0 $oObject = 0 Sleep(1000) $Au3_CallByName = "Add" $oDictionary.Au3_CallByName("test", "Dictionary Item: Test") $Au3_CallByName = "Item" ConsoleWrite($oDictionary.Au3_CallByName("test") & @CRLF) Au3_CallByName_Init() $Au3_CallByName = "Add" $oDictionary2.Au3_CallByName("test2", "Dictionary Item: Test2") $Au3_CallByName = "Item" ConsoleWrite($oDictionary2.Au3_CallByName("test2") & @CRLF) ConsoleWrite("NEW IE" & @CRLF & @CRLF) $oRegistrationInfo = _IECreate() __TS_TaskPropertiesSet($oRegistrationInfo, $aRegistrationInfo) Au3_CallByName_Init(Default, False) ;Unload (Not Strictly Needed, Done on Script Close) Func __TS_TaskPropertiesSet(ByRef $oObject, $aProperties) Local $aTemp If IsArray($aProperties) Then For $i = 0 To UBound($aProperties) - 1 $aTemp = StringSplit($aProperties[$i], "=", 2) ; 2 -> $STR_NOCOUNT) If @error Then ContinueLoop ConsoleWrite("Command: $oObject." & $aTemp[0] & " = " & $aTemp[1] & @CRLF) $Au3_CallByName = $aTemp[0] $oObject.Au3_CallByName = $aTemp[1] ConsoleWrite("Result : " & @error & @CRLF) ; If @error Then Return SetError(1, @error, 0) Next EndIf EndFunc ;==>__TS_TaskPropertiesSet That being said this code needs a lot still error checking namely but also a way to store the original pointer for GetIDsFromNames pointer for multiple objects either an array or maybe the dictionary object IDK yet1 point
-
Sequential FIle Append
FrancescoDiMuro reacted to Werty for a topic
Doesnt look like some digital game, but a real game of Golf, also search for the phrase "bigbamboom Golf" on google and a brand of Golf Polo Shirts shows up. Seems legit to me1 point -
Creating a "brushed up" Task Scheduler UDF?
seadoggie01 reacted to water for a topic
Hello All! Wrappers for the TasKScheduler UDF should reduce complexity to create a task. Microsoft offers too many properties of which only a few are needed. The minimum properties needed to successfully define a task are still too many for a single wrapper and depend on the type of task you indend to create. I now think about splitting the task into smaller chunks: _TS_Wrapper_TaskCreate: Create task and set Registrationinfo (Objects: Task, Definition, RegistrationInfo) _TS_Wrapper_PrincipalSet: Security credentials (Objects: Principal) _TS_Wrapper_SettingsSet: settings that the Task Scheduler service uses to perform the task (Objects: Settings, IdleSettings, NetworkSettings) _TS_Wrapper_TriggerCreate: Trigger to start a task and define the repetition frequency (Objects: Trigger, Repetition) _TS_Wrapper_ActionCreate: Action execute when the task gets started (Objects: Action) _TS_TaskRegister: Finish and register the task This functions will only accept the mainly used properties. if you need to add properties you can call _TS_TaskPropertiesSet at any time. What do you think? Comments are welcome1 point -
Methods for ObjCreateInterface()
seadoggie01 reacted to Gianni for a topic
Have a look to this link by @trancexx:1 point -
How to represent a variable with a string
seadoggie01 reacted to jchd for a topic
Yes you can! But then how hard is it to use that instead? debugVariable($myVar, "$myVar")1 point -
[Solved] Regex pattern need help
guner7 reacted to FrancescoDiMuro for a topic
@guner7 You don't need to use lookbehind (even if you could), and since you are trying to extract digit(s) only, plus the character K (which could be replaced as \w* if you have any other engineering unit), you could use a pattern like this one: '(?:FILM|WIREWOUND|OXIDE)\s*(\d+\.?\d*K?)'1 point -
WebDriver UDF - Help & Support
Edgar-Nguyen reacted to Danp2 for a topic
In wd_demo, this is the current desired capacities line for Chrome -- $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true }}}}' To implement the logging, I would try modifying this line to -- $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true }}, {"goog:loggingPrefs": {"browser":"ALL"}}}}' Completely untested, so test away and let us know how it goes.1 point -
Hi all. I have seen a number of requests for something like this in the Help and Support section so I thought I would post it. All the credit goes to SmOke_N - I just touched it up. This script was created when trying to get a ControlHandle that has next to no information displayed in the AutoIT Info Tool. ; =============================================================================== ;~ This script gets the control under the mouse pointer (active or inactive) ;~ The information then can be used with in conjunction with control functions. ;~ Requires AutoIt v3.3.6.0 or later to run and to view apps maximized. ;~ Big thanks to SmOke_N and Valik their help in creating it. ; =============================================================================== #include <WinAPI.au3> #include <Array.au3> #include <WindowsConstants.au3> AutoItSetOption("MustDeclareVars", 1) AutoItSetOption("MouseCoordMode", 1) AdlibRegister("_Mouse_Control_GetInfoAdlib", 10) HotKeySet("^!x", "MyExit") ; Press Ctrl+Alt+x to stop the script ;~ #AutoIt3Wrapper_run_debug_mode=Y Global $pos1 = MouseGetPos() Global $pos2 = MouseGetPos() ; must be initialized Global $appHandle = 0 While 1 Sleep(0xFFFFFFF) WEnd ; =============================================================================== ;~ Retrieves the information of a Control located under the mouse and displayes it in a tool tip next to the mouse. ;~ Function uesd ;~ _Mouse_Control_GetInfo() ;~ GetDlgCtrlID ; =============================================================================== Func _Mouse_Control_GetInfoAdlib() $pos1 = MouseGetPos() If $pos1[0] <> $pos2[0] Or $pos1[1] <> $pos2[1] Then ; has the mouse moved? Local $a_info = _Mouse_Control_GetInfo() Local $aDLL = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $a_info[0]) ; get the ID of the control If @error Then Return ToolTip("Handle = " & $a_info[0] & @CRLF & _ "Class = " & $a_info[1] & @CRLF & _ "ID = " & $aDLL[0] & @CRLF & _ "Mouse X Pos = " & $a_info[2] & @CRLF & _ "Mouse Y Pos = " & $a_info[3] & @CRLF & _ "ClassNN = " & $a_info[4] & @CRLF & _ ; optional "Parent Hwd = " & _WinAPI_GetAncestor($appHandle, $GA_ROOT)) $pos2 = MouseGetPos() EndIf EndFunc ;==>_Mouse_Control_GetInfoAdlib ; =============================================================================== ;~ Retrieves the information of a Control located under the mouse. ;~ Uses Windows functions WindowFromPoint and GetClassName to retrieve the information. ;~ Functions used ;~ _GetHoveredHwnd() ;~ _ControlGetClassnameNN() ;~ Returns ;~ [0] = Control Handle of the control ;~ [1] = The Class Name of the control ;~ [2] = Mouse X Pos (converted to Screen Coord) ;~ [3] = Mouse Y Pos (converted to Screen Coord) ;~ [4] = ClassNN ; =============================================================================== Func _Mouse_Control_GetInfo() Local $client_mpos = $pos1 ; gets client coords because of "MouseCoordMode" = 2 Local $a_mpos ;~ Call to removed due to offset issue $a_mpos = _ClientToScreen($appHandle, $client_mpos[0], $client_mpos[1]) ; $a_mpos now screen coords $a_mpos = $client_mpos $appHandle = GetHoveredHwnd($client_mpos[0], $client_mpos[1]) ; Uses the mouse to do the equivalent of WinGetHandle() If @error Then Return SetError(1, 0, 0) Local $a_wfp = DllCall("user32.dll", "hwnd", "WindowFromPoint", "long", $a_mpos[0], "long", $a_mpos[1]) ; gets the control handle If @error Then Return SetError(2, 0, 0) Local $t_class = DllStructCreate("char[260]") DllCall("User32.dll", "int", "GetClassName", "hwnd", $a_wfp[0], "ptr", DllStructGetPtr($t_class), "int", 260) Local $a_ret[5] = [$a_wfp[0], DllStructGetData($t_class, 1), $a_mpos[0], $a_mpos[1], "none"] Local $sClassNN = _ControlGetClassnameNN($a_ret[0]) ; optional, will run faster without it $a_ret[4] = $sClassNN Return $a_ret EndFunc ;==>_Mouse_Control_GetInfo ; =============================================================================== ; Retrieves the Handle of GUI/Application the mouse is over. ; Similar to WinGetHandle except it used the current mouse position ; Taken from http://www.autoitscript.com/forum/index.php?showtopic=444962 ; Changed to take params to allow only one set of coords to be used. ; Params ;~ $i_xpos - x position of the mouse - usually from MouseGetPos(0) ;~ $i_ypos - x position of the mouse - usually from MouseGetPos(1) ; =============================================================================== Func GetHoveredHwnd($i_xpos, $i_ypos) Local $iRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", $i_xpos, "long", $i_ypos) If IsArray($iRet) Then $appHandle = $iRet[0] Return HWnd($iRet[0]) Else Return SetError(1, 0, 0) EndIf EndFunc ;==>GetHoveredHwnd ; =============================================================================== ;~ Gets the ClassNN of a control (Classname and Instance Count). This is checked with ControlGetHandle ;~ The instance is really a way to uniquely identify classes with the same name ;~ Big thanks to Valik for writing the function, taken from - http://www.autoitscript.com/forum/index.php?showtopic=97662 ;~ Param ;~ $hControl - the control handle from which you want the ClassNN ;~ Returns ;~ the ClassNN of the given control ; =============================================================================== Func _ControlGetClassnameNN($hControl) If Not IsHWnd($hControl) Then Return SetError(1, 0, "") Local Const $hParent = _WinAPI_GetAncestor($appHandle, $GA_ROOT) ; get the Window handle, this is set in GetHoveredHwnd() If Not $hParent Then Return SetError(2, 0, "") Local Const $sList = WinGetClassList($hParent) ; list of every class in the Window Local $aList = StringSplit(StringTrimRight($sList, 1), @LF, 2) _ArraySort($aList) ; improves speed Local $nInstance, $sLastClass, $sComposite For $i = 0 To UBound($aList) - 1 If $sLastClass <> $aList[$i] Then ; set up the first occurrence of a unique classname $sLastClass = $aList[$i] $nInstance = 1 EndIf $sComposite = $sLastClass & $nInstance ;build the ClassNN for testing with ControlGetHandle. ClassNN = Class & ClassCount ;if ControlGetHandle(ClassNN) matches the given control return else look at the next instance of the classname If ControlGetHandle($hParent, "", $sComposite) = $hControl Then Return $sComposite EndIf $nInstance += 1 ; count the number of times the class name appears in the list Next Return SetError(3, 0, "") EndFunc ;==>_ControlGetClassnameNN Func MyExit() ; stops the script ConsoleWrite("Script Stoppted By User" & @CR) Exit EndFunc ;==>MyExit Edit: Sept 09 Enhancement by corgano Added ControlID Added ClassNN and now requires AutoIt v3.3.0.0 or later to run Removed _WinAPI_GetParent and added global $appHandle 06 Apr 10 Removed ClientToScreenCall Made _ControlGetClassnameNN apart of the script General Updates1 point
-
Wait until done typing in input field
guner7 reacted to johnmcloud for a topic
; Johnmcloud - 2016 #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> Global $iBegin, $fFlag = False $hGUI = GUICreate("Test", 325, 100) $cInput = GUICtrlCreateInput("", 10, 20, 300, 20) GuiSetState() GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch If $fFlag And TimerDiff($iBegin) > 3000 Then $fFlag = False MsgBox(64, "Error", "Timed out") EndIf WEnd Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) Local $iIDFrom = BitAND($wParam, 0xFFFF) Local $iCode = BitShift($wParam, 16) If $iIDFrom = $cInput And $iCode = $EN_CHANGE Then $iBegin = TimerInit() $fFlag = True If GUICtrlRead($cInput) = "secretpass" Then Exit MsgBox(64, "Congrats", "Done") EndIf EndIf Return $GUI_RUNDEFMSG EndFunc ;==>_WM_COMMAND1 point -
Simple SOAP Example For those who don't know what SOAP (Simple Object Access Protocol) is. In this SOAP example, you will learn what SOAP is, and how it uses XML to exchange information between applications. The next step will be, how to turn AU3 into a Web Services server. This is the SOAP CLIENT Dim $objHTTP Dim $strEnvelope Dim $strReturn Dim $objReturn Dim $dblTax Dim $strQuery Dim $value $value = InputBox("Testing", "Enter your new value here.", 10) ; Initialize COM error handler $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") $objHTTP = ObjCreate("Microsoft.XMLHTTP") $objReturn = ObjCreate("Msxml2.DOMdocument.3.0") ; Create the SOAP Envelope $strEnvelope = "<soap:envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _ "<soap:header></soap:header>" & _ "<soap:body>" & _ "<m:getsalestax xmlns:m=""urn:myserver/soap:TaxCalculator"">" & _ "<salestotal>"&$value&"</salestotal>" & _ "</m:getsalestax>" & _ "</soap:body>" & _ "</soap:envelope>" ; Set up to post to our local server $objHTTP.open ("post", "http://localhost/soap.asp", False) ; Set a standard SOAP/ XML header for the content-type $objHTTP.setRequestHeader ("Content-Type", "text/xml") ; Set a header for the method to be called $objHTTP.setRequestHeader ("SOAPMethodName", "urn:myserver/soap:TaxCalculator#getsalestax") ConsoleWrite("Content of the Soap envelope : "& @CR & $strEnvelope & @CR & @CR) ; Make the SOAP call $objHTTP.send ($strEnvelope) ; Get the return envelope $strReturn = $objHTTP.responseText ; ConsoleWrite("Debug : "& $strReturn & @CR & @CR) ; Load the return envelope into a DOM $objReturn.loadXML ($strReturn) ConsoleWrite("Return of the SOAP Msg : " & @CR & $objReturn.XML & @CR & @CR) ; Query the return envelope $strQuery = "SOAP:Envelope/SOAP:Body/m:getsalestaxresponse/salestax" $dblTax = $objReturn.selectSingleNode($strQuery) $Soap = $objReturn.Text MsgBox(0,"SOAP Response","The Sales Tax is : " & $Soap) Func MyErrFunc() $HexNumber=hex($oMyError.number,8) Msgbox(0,"COM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $oMyError.description & @CRLF & _ "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _ "err.number is: " & @TAB & $HexNumber & @CRLF & _ "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _ "err.source is: " & @TAB & $oMyError.source & @CRLF & _ "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $oMyError.helpcontext _ ) SetError(1) ; to check for after this function returns Endfunc This is the SOAP SERVER <% Dim oNode Set objReq = Server.CreateObject("Msxml2.DOMdocument.3.0") 'Load the request into XML DOM objReq.Load Request 'Query the DOM for the input parameter ' Remember: xpath is case sensitive. "SalesTotal" is not the same as "salestotal" strQuery = "SOAP:Envelope/SOAP:Body/m:getsalestax/salestotal" 'varSalesTotal = objReq.SelectSingleNode(strQuery).Text Set oNode = Nothing Set oNode = objReq.SelectSingleNode(strQuery) if not oNode is Nothing Then varSalesTotal = oNode.Text else 'handle the error - save the xml to a file so you can look at it varSalesTotal = objReq.Text end if 'Calculate the sales tax varSalesTax = varSalesTotal * 0.04 'Prepare the return envelope strTmp = _ "<soap:envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _ "<soap:header></soap:header>" & _ "<soap:body>" & _ "<m:getsalestaxresponse xmlns:m=""urn:myserver/soap:Taxcalc"">" & _ "<salestax>" & varSalesTax & "</salestax>" & _ "</m:getsalestaxresponse>" & _ "</soap:body>" & _ "</soap:envelope>" 'Write the return envelope Response.Write strTmp %> Save the SOAP SERVER as SOAP.asp and put it in the root of your IIS server. Run the client and see what happenes. Enjoy !! Regards ptrex1 point
-
How do I select a Worksheet in Excel
pubeoutros reacted to Juvigy for a topic
Or you can use : oExcel = ObjCreate("Excel.Application") $oExcel.Visible = 1 $oExcel.WorkBooks.Open ("full path filename") $oExcel.Sheets ("sheet name" ).Select1 point