LeeC Posted September 9, 2014 Share Posted September 9, 2014 Hi, I am creating a program which will allow the user to check if a file on the PC is 32bit or 64bit. It asks for the file location, then displays a box showing the result. I'm using the FILE utility from GNU Coreutils for Windows (http://gnuwin32.sourceforge.net/packages/file.htm). Here is my code: . #include <Constants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GuiEdit.au3> #include <WindowsConstants.au3> FileInstall("C:\program files (x86)\gnuwin32\bin\file.exe", @ScriptDir & "\file.exe") FileInstall("C:\program files (x86)\gnuwin32\bin\zlib1.dll", @ScriptDir & "\zlib1.dll") FileInstall("C:\program files (x86)\gnuwin32\bin\regex2.dll", @ScriptDir & "\regex2.dll") FileInstall("C:\program files (x86)\gnuwin32\bin\magic1.dll", @ScriptDir & "\magic1.dll") $selFile = FileOpenDialog("Browse to the file", "C:\", "(*.*)") $selFile = chr(34) & $selFile & chr(34) $hGUI = GUICreate("Test", 700, 100) $idEdit = GUICtrlCreateEdit("", 0, 0, 650, 100, BitOR($ES_AUTOVSCROLL, $WS_HSCROLL, $WS_VSCROLL)) GUICtrlSendMsg($idEdit, $EM_LIMITTEXT, -1, 0) GUISetState() ;$_pid = Run(@ComSpec & " /c FILE.EXE " & chr(34) & "C:\Program Files (x86)\EIZO\ScreenSlicer\ESCSlicer.exe" & chr(34), @SystemDir,@SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) $_pid = Run(@comspec & " /c FILE.EXE " & $selFile,@ScriptDir,@SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) $answer = "" While 1 $line = StdoutRead($_pid) if @error Then ExitLoop _GUICtrlEdit_AppendText($idEdit, $line) $answer &= $line WEnd Do Until GUIGetMsg() = $GUI_EVENT_CLOSE Exit . The line commented out and the line above is used for testing. I have only been scripting in AutoIt for 4 weeks, so please excuse any best practices that I have missed. The issue is that if I use the full filename path the script works great, if I use the variable the results box is blank. I have a feeling that I am doing something wrong with the quotes, but I dont know why the full path works ok. Does anyone have any ideas? (I just want to say thank you to UEZ for the script posted on '?do=embed' frameborder='0' data-embedContent>>. This really helped me with what I'm trying to achieve.) Link to comment Share on other sites More sharing options...
j0kky Posted September 9, 2014 Share Posted September 9, 2014 Delete this line: $selFile = chr(34) & $selFile & chr(34) And change: $_pid = Run(@comspec & " /c FILE.EXE " & $selFile,@ScriptDir,@SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) with: $_pid = Run(@comspec & ' /c FILE.EXE "' & $selFile & '"',@ScriptDir,@SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) Spoiler Some UDFs I created: Winsock UDF STUN UDF WinApi_GetAdaptersAddresses _WinApi_GetLogicalProcessorInformation Bitwise with 64 bit integers An useful collection of zipping file UDFs Link to comment Share on other sites More sharing options...
MHz Posted September 9, 2014 Share Posted September 9, 2014 (edited) The working directory is being changed with use of FileOpenDialog. When you use run cmd then file.exe it is probably not being found in the current directory if it is not @ScriptDir. You can use FileChangeDir to reset the current working directory to @ScriptDir after use of FileOpenDialog. To remove the dependency of file.exe, this code may be useful. It has not done much testing but it gives good results so far. It reads from the bits in the header that determine whether it is X86, X64, I64 or native. expandcollapse popup$sFileOSType = _FileGetOSType(@WindowsDir & "\hh.exe") MsgBox(0x40000, @ScriptName, $sFileOSType) Func _FileGetOSType($sFilePath) Local $bChars, $bHeaderAddress, $hRead ; read the file in binary mode $hRead = FileOpen($sFilePath, 0x10) If $hRead = -1 Then Return SetError(1, 0, '') ; check if the binary is an executable at initial 2 chars If BinaryToString(FileRead($hRead, 2)) <> 'MZ' Then FileClose($hRead) Return SetError(2, 0, '') EndIf ; set position at char 60 FileSetPos($hRead, 60, 0) ; read 4 chars to get header address $bChars = FileRead($hRead, 4) $bHeaderAddress = BitAND($bChars, 0x0000FFFF) ; set position at start of header + 4 chars FileSetPos($hRead, $bHeaderAddress + 4, 0) ; read 2 chars at OS type setting $bChars = FileRead($hRead, 2) FileClose($hRead) ; Compare the result to known settings ; Native = 0, X86 = 0x014c, Itanium = 0x0200, X64 = 0x8664 Switch '0x' & Hex(BitAND($bChars, 0xFFFF), 4) Case '0x0000' Return 'Native' Case '0x014C' Return 'X86' Case '0x0200' Return 'I64' Case '0x8664' Return 'X64' Case Else Return SetError(3, 0, '') EndSwitch EndFunc Edit: You set working directory with run so perhaps the working directory is not the main issue with your code. Edit: Localized some variables on the rather fresh code. Edited September 9, 2014 by MHz 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