MISIIM Posted March 27, 2008 Share Posted March 27, 2008 How do I read the return value from CommandLineToArgvW? It is supposed to return an array.http://msdn2.microsoft.com/en-us/library/b...391(VS.85).aspxFunc _CommandLineToArgv($cmd) Local $ret = DllCall("shell32.dll", "wstr", "CommandLineToArgvW", "wstr", $cmd, "int*", 0); If @error Then Return SetError(1, 0, 0); If $ret[0] = 0 Then Return SetError(2, 0, 0); Local $retarr = $ret[0]; ; Copy data to AutoIt array. DllCall("kernel32.dll", "ptr", "LocalFree", "ptr", $retarr); EndFunc Link to comment Share on other sites More sharing options...
DarkMatter Posted March 27, 2008 Share Posted March 27, 2008 (edited) You would have to do something like the following for the call: Local $ret = DllStructCreate("int") DllCall("shell32.dll", "wstr", "CommandLineToArgvW", "wstr", $cmd, "int", DllStructGetPtr($ret)) If you look at the syntax: Syntax LPWSTR *CommandLineToArgvW( LPCWSTR lpCmdLine, int *pNumArgs ); Parameters lpCmdLine [in] Pointer to a null-terminated Unicode string containing the full command line. An application will usually directly pass on the value returned by a call to the GetCommandLineW function. If this parameter is the empty string (""), the function returns the path to the current executable file. pNumArgs [out] Pointer to a variable of type int that receives the number of array elements returned. If you read the "pNumArgs" section its looking for a pointer to a variable of type int. So you will need to create a Dll Structure(DllStructCreate("int")) and then get the pointer (DllStructGetPtr($ret)). Edited March 27, 2008 by DarkMatter [sub]Quantum mechanics: The dreams stuff is made of[/sub] Link to comment Share on other sites More sharing options...
rasim Posted March 27, 2008 Share Posted March 27, 2008 DarkMatter You would have to do something like the following for the call:Well, but your answer don`t give a solution. I trying, but unsuccesfull #include <Array.au3> $GetCmd = DllCall("kernel32.dll", "str", "GetCommandLine") $GetCmd = $GetCmd[0] $Struct = DllStructCreate("int") $ret = DllCall("shell32.dll", "wstr", "CommandLineToArgvW", "wstr", $GetCmd, "ptr", DllStructGetPtr($Struct)) _ArrayDisplay($ret) MsgBox(0, "Numbers of array", DllStructGetData($Struct, 1, 1)) DllCall("kernel32.dll", "ptr", "LocalFree", "ptr", $ret[0]) Link to comment Share on other sites More sharing options...
rasim Posted March 27, 2008 Share Posted March 27, 2008 MISIIMEasy way - it`s use: special array $CmdLine; StringSplit() function; StringRegExp() function Link to comment Share on other sites More sharing options...
Siao Posted March 27, 2008 Share Posted March 27, 2008 There is nothing wrong with "int*" ever since this feature was added to AutoIt. What is wrong, is the return type you all try to use - "wstr" (MSDN clearly says the return type is a pointer. Pointer of a pointer, in fact), and the obvious fact that AutoIt doesn't support C type string arrays right off the bat, so you can't just expect to get the result without moving a pinky So something like this: Func _CommandLineToArgv($cmd) Local $ret = DllCall("shell32.dll", "ptr", "CommandLineToArgvW", "wstr", $cmd, "int*", 0), $iChar, $iCount, $tPtr, $tBuffer, $aRet If @error Then Return SetError(1, 0, 0); If $ret[0] = 0 Then Return SetError(2, 0, 0); $tPtr = DllStructCreate("ptr", $ret[0]) Local $retarr = DllStructGetData($tPtr, 1); ; Copy data to AutoIt array. $tBuffer = DllStructCreate("wchar[4095]", $retarr) While $iCount < $ret[2] $iChar += 1 If DllStructGetData($tBuffer, 1, $iChar) = "" Then $iCount += 1 If DllStructGetData($tBuffer, 1, $iChar+1) = "" Then ExitLoop DllStructSetData($tBuffer, 1, "|", $iChar) EndIf WEnd $aRet = StringSplit(DllStructGetData($tBuffer, 1), "|") DllCall("kernel32.dll", "ptr", "LocalFree", "ptr", $ret[0]); Return $aRet EndFunc Although I wonder why do you need all this in first place, when there is $CmdLine array. "be smart, drink your wine" Link to comment Share on other sites More sharing options...
rasim Posted March 27, 2008 Share Posted March 27, 2008 SiaoPerfect! Thank you guru! Link to comment Share on other sites More sharing options...
MISIIM Posted March 27, 2008 Author Share Posted March 27, 2008 Thank you. It works. I needed this because I am writing a Commmand Prompt simulator so I need to parse the arguments that I am going to pass to another program. 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