Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
ExtractIcon or ExtractAssociatedIcon...
Message
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Miscellaneous
Thread ID:
00653833
Message ID:
00656329
Views:
28
>>>What is the proper function to retrieve an icon from an executable or DLL so I can load it into a ImageList with .ADD(,"Drive",LOADPICTURE("Drive.ico"))
>>
>>Actually, neither of these will do what you want. Both return a handle to the icon. The handle can be then used by an API function such as DrawIcon(). Unfortunately, the handle does not produce a physical file and there isn't an API call that can do this directly.
>
>Not quite. It can be done directly in VFP7:
>
>#define PICTYPE_ICON 3
>#define IID_IDispatch Chr(0x00)+Chr(0x04)+Chr(0x02)+Chr(0x00)+ ;
>		Replicate(Chr(0x00), 4)+Chr(0xC0)+Replicate(Chr(0x00), 6)+Chr(0x46)
>
>* Large icons
>Declare long ExtractIconEx in shell32 String @ File, long iconIndex, ;
>	long @ iconLarge, long iconSmall, long nIcons
>* Small icons
>*Declare long ExtractIconEx in shell32 String @ File, long iconIndex, ;
>*	long iconLarge, long @ iconSmall, long nIcons
>
>Declare Long OleCreatePictureIndirect In oleaut32 ;
>	String @ PicDesc, String @ RefIID, Long fPictureOwnsHandle, Object @ IPic
>
>IconFile = "D:\Program Files\Microsoft Visual Studio\VFP98\VFP6.exe"
>IconIndex = 6
>hIcon = 0
>
>* Large icon
>ExtractIconEx(@IconFile, IconIndex, @hIcon, 0, 1)
>* SmallIcon
>*ExtractIconEx(@IconFile, IconIndex, 0, @hIcon, 1)
>
>* Create Picture object according to PICTDESC structure
>PictDesc = DWord(16) ;				&& Size of PICTDESC structure
>		 + DWord(PICTYPE_ICON) ;	&& Type of picture
>		 + DWord(hIcon) ;		&& HICON
>		 + DWord(0)			&& HPALETTE
>IPic = 0
>iid = IID_IDispatch
>OleCreatePictureIndirect(@PictDesc, @iid, 1, @IPic)
>
>ImageList.ListImages.ADD(,"SomePict",IPic)
>
>In VFP6 it's more complex:
>
>#define PICTYPE_ICON 3
>#define IID_IDispatch Chr(0x00)+Chr(0x04)+Chr(0x02)+Chr(0x00)+ ;
>		Replicate(Chr(0x00), 4)+Chr(0xC0)+Replicate(Chr(0x00), 6)+Chr(0x46)
>#define CP_ACP 0		&& default to ANSI code page
>*-- Global Memory Flags
>#define GMEM_MOVEABLE       0x0002
>#define GMEM_ZEROINIT       0x0040
>#define GMEM_SHARE          0x2000
>
>Declare long ExtractIconEx in shell32 String @ File, long iconIndex, ;
>	long @ iconLarge, long iconSmall, long nIcons
>Declare Long OleCreatePictureIndirect In oleaut32 ;
>	String @ PicDesc, String @ RefIID, Long fPictureOwnsHandle, Long @ IPic
>Declare Long GlobalAlloc In kernel32 Long wFlags, Long dwBytes
>Declare Long GlobalFree In kernel32 Long hMem
>Declare Long GlobalLock In kernel32 Long hMem
>Declare Long GlobalUnlock In kernel32 Long hMem
>Declare Long MultiByteToWideChar In kernel32 ;
>	Long iCodePage, Long dwFlags, String @ lpStr, Long iMultiByte, ;
>	Long lpWideStr, Long iWideChar
>Declare Long SysAllocString In oleaut32 Long szString
>
>* This function is not documented in MSDN, but present in Platform SDK .h file
>Declare Long OleSavePictureFile In oleaut32 Long IPic, Long bstrFile
>
>IconFile = "D:\Program Files\Microsoft Visual Studio\VFP98\VFP6.exe"
>IconIndex = 6
>hIcon = 0
>ExtractIconEx(@IconFile, IconIndex, @hIcon, 0, 1)
>
>* Create Picture object according to PICTDESC structure
>PictDesc = DWord(16) ;				&& Size of PICTDESC structure
>		 + DWord(PICTYPE_ICON) ;	&& Type of picture
>		 + DWord(hIcon) ;		&& HICON
>		 + DWord(0)			&& HPALETTE
>IPic = 0
>iid = IID_IDispatch
>OleCreatePictureIndirect(@PictDesc, @iid, 1, @IPic)
>
>tcData = "tmp.ico"
>lnDataLen = 7
>lhMem = GlobalAlloc(GMEM_MOVEABLE+GMEM_ZEROINIT+GMEM_SHARE, 2*(lnDataLen+1))
>lnPtr = GlobalLock(lhMem)
>* Convert file name to wide char
>MultiByteToWideChar(CP_ACP, 0, @tcData, lnDataLen, lnPtr, lnDataLen+1)
>OleSavePictureFile(IPic, SysAllocString(lnPtr))
>GlobalUnlock(lhMem)
>GlobalFree(lhMem)
>* Memory leak here - IPic not released
>* Will be fixed later
>
>ImageList.ListImages.ADD(,"SomePict",LoadPicture("tmp.ico"))
>
>This code is from my Clipboard class. I'm going to post it into download section when I'll have a time.

Alexander,

Thanks very much. This looks cool! (Rubs hands together at the prospect of the goodies to play with).
George

Ubi caritas et amor, deus ibi est
Previous
Reply
Map
View

Click here to load this message in the networking platform