lod3n Posted January 16, 2007 Posted January 16, 2007 I know from these two threads: http://www.autoitscript.com/forum/index.ph...l=SHGetFileInfoand http://www.autoitscript.com/forum/index.ph...l=SHGetFileInfothat the idea of using SHGetFileInfo has been dismissed as it required structures that AutoIt did not support, but I am wondering whether or not recent development has solved that issue. So I thought I'd give it a try. My results seem to indicate that A) the required structs still are not available for AutoIt, or I don't know squat about DLL calls (true), or C) All of the above. Maybe someone who knows more about this stuff than I do (Holger?) peek at what I've got and let me know if I am doing something insanely stupid:expandcollapse popup; lod3n's translation attempt from: http://support.microsoft.com/kb/319350 ; "How to use the SHGetFileInfo function to get the icons that are ; associated with files in Visual C# .NET" ; this would be cool, because I can get the icon handle of any file, and show it correctly ; in a menu or listview, or just a button (if they're ownerdrawn...) Const $SHGFI_ICON = 0x100 ;Get icon Const $SHGFI_SMALLICON = 0x1 ;Get Small Icon $pszPath = "C:\" ; this will become the sole parameter of a UDF, once this works $dwFileAttributes = 0 ;the first and second struct elements in the above URL are of a type IntPtr ;I do not know how to translates this to AutoIt correctly. $psfi = DllStructCreate("int;int;uint;str;char[260];char[80]") $stIconHandle = DllStructCreate("ptr") $ptIconHandle = DllStructGetPtr($stIconHandle) DllStructSetData($psfi, 1, $ptIconHandle) $stIconIndex = DllStructCreate("ptr") $ptIconIndex = DllStructGetPtr($stIconIndex) DllStructSetData($psfi, 2, $ptIconIndex) $cbSizeFileInfo = DllStructGetSize($psfi) $uFlags = BitOR($SHGFI_ICON, $SHGFI_SMALLICON) $hImgSmall = DllCall('shell32.dll', 'int', 'SHGetFileInfo', _ 'str', $pszPath, _ 'uint', $dwFileAttributes, _ 'ptr', DllStructGetPtr($psfi), _ 'uint', $cbSizeFileInfo, _ 'uint', $uFlags) Switch @error Case 0 Con("+ Success") case 1 Con("! unable to use the DLL file") Case 2 Con('! unknown "return type"') case 3 Con('! "function" not found in the DLL file') EndSwitch if IsArray($hImgSmall) Then Con("+ Returned an array!") ;~ for $i = 0 to ubound($hImgSmall)-1 ;~ Con($i & ": " & $hImgSmall[$i]) ;~ Next Else Con("! Did not return an array!") EndIf $hIcon = DllStructGetData($stIconHandle, 1) Con("Icon Handle: " & $hIcon) ; returns 0, which is incorrect, it should be something like 1367278955 $iIcon = DllStructGetData($stIconIndex, 1) Con("Icon Index: " & $iIcon) ; returns 0, which is incorrect, it should be something like 1 or 2 Func Con($string) ConsoleWrite($string & @crlf) EndFunc [font="Fixedsys"][list][*]All of my AutoIt Example Scripts[*]http://saneasylum.com[/list][/font]
Holger Posted January 16, 2007 Posted January 16, 2007 (edited) 1.) you do not need any pointer to the icon handle and index. Direct use the 1st 2 values from the psfi-structure then you got them. I have no idea why you think that these 1st 2 elements are of type int_ptr? From MSDN: typedef struct _SHFILEINFO { HICON hIcon; int iIcon; DWORD dwAttributes; TCHAR szDisplayName[MAX_PATH]; TCHAR szTypeName[80]; } SHFILEINFO; So you could use the psfi like: $psfi = DllStructCreate("uint;int;dword;char[260];char[80]") Edited January 16, 2007 by Holger Old project:GUI/Tray menu with icons and colors Other old stuff:IconFileScanner, TriState/ThreeState GUI TreeView, GUI ContextMenu created out of a TreeView
lod3n Posted January 16, 2007 Author Posted January 16, 2007 Holy crap! Fantastic. Thanks holger! [font="Fixedsys"][list][*]All of my AutoIt Example Scripts[*]http://saneasylum.com[/list][/font]
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