lod3n Posted January 16, 2007 Share 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] Link to comment Share on other sites More sharing options...
Holger Posted January 16, 2007 Share 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 Link to comment Share on other sites More sharing options...
lod3n Posted January 16, 2007 Author Share Posted January 16, 2007 Holy crap! Fantastic. Thanks holger! [font="Fixedsys"][list][*]All of my AutoIt Example Scripts[*]http://saneasylum.com[/list][/font] 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