|
Awesome, just what I needed, thanks a lot David
|
|
|
|
|
Hey, I tried with extractIcon, but I should still pass as parameter the resource number.
I tried 1 and 0 but still fails to load an icon for a lot of apps, like firefox, winword etc.
Or sometimes the icon is not the one that the .exe uses normally :S
What can I do??
Thanks
Sebastian
|
|
|
|
|
Kharfax wrote: ...but I should still pass as parameter the resource number.
What's wrong with that?
Kharfax wrote: I tried 1 and 0 but still fails to load an icon for a lot of apps, like firefox, winword etc.
Winword.exe does not have an icon 0. It does have an icon 1, however. Have you tried ExtractIconEx() ?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Whats wrong with that is that I should know wich one of all the icons in a file is the default one.
The one showed by windows explorer when you see a file.
Using ExtractIconEx I will get a list of all the icons in the file, but I still need to identify wich one is the default one.
The value I should pass to ExtractIcon is a zero based index array of icons, thats why I tried with 0 and 1.
|
|
|
|
|
FWIW, I believe that the "Default" icon is the first one found in the resources. Barring any more elegant solution, you could always just loop over a few low values to try to find the first icon in the executable. For example, you could always search for values "0" through "100", and stop with the first one found...
You could also try to load the resource information directly from the executable to locate the first one.
I do not suppose that using IDI_APPLICATION with LoadIcon(...) works for you?
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
i think it may also have to deal with the icon windows associates to a type (but i conceed, it doesn't concern the .exes).
|
|
|
|
|
Kharfax wrote: Whats wrong with that is that I should know wich one of all the icons in a file is the default one.
There is no default per se.
Kharfax wrote: The one showed by windows explorer when you see a file.
You can change Windows Explorer to show whatever icon you wish.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Ok granted maybe you can change the icon the explorer choses.
But is choosing and icon, that icon is the same in every machine.
There must be a way to know wich one is the "default" icon of an app.
Maybe ExtractIcon isn't the way. I either dont want to start f***ing around with the PE for something as simple as this...
I'll find it sooner or later...
|
|
|
|
|
ok, the idea is this.
You get the system image list, asociate it with the control, and then call
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(SHFILEINFO));
SHGetFileInfo(sFilename, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
return sfi.iIcon;
The return the index of the icon you should use.
But, doesn't work fine yet, I'm still getting changed icons.
For example...
Firefox.exe gets a folder icon...
|
|
|
|
|
Kharfax wrote: The return the index of the icon...
Are you sure? It should return the handle to an image list that contains the small icon images.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(SHFILEINFO));
SHGetFileInfo(sFilename, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
return sfi.iIcon;
Look at the parameters:
SHGFI_SYSICONINDEX, icon index in system image list
SHGFI_SMALLICON, specifies that is a small icon the one I want
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfileinfo.asp
|
|
|
|
|
if you run this code what happens?
|
|
|
|
|
I told what it does a few post up.
It returns the index of the icon in the system image list.
Anyway, that doesn't work well
and that are just chunks of code.
|
|
|
|
|
Try http://codeproject.com/win32/IconExtraction.asp
|
|
|
|
|
Thanks dude, that makes just what I need, but saving the icon as a file :S
I need to get a resource ID or a HICON so I can add it to the list.
I tried to adapt it, but I cant make it work.
Maybe I just lost my patience and focus
|
|
|
|
|
I use this to extract an icon (from any file, not just EXEs).
This will get the default icon from Windows if none is in the exe.
<br />
HICON hIcon = 0;<br />
<br />
<br />
SHFILEINFO shfi;<br />
memset(&shfi, 0, sizeof(shfi));<br />
if (SHGetFileInfo(pszPathname,<br />
FILE_ATTRIBUTE_NORMAL,<br />
&shfi,<br />
sizeof(shfi),<br />
SHGFI_ICON | SHGFI_SMALLICON))<br />
{<br />
hIcon = shfi.hIcon;<br />
}<br />
<br />
<br />
<br />
if (hIcon == 0)<br />
{<br />
LPTSTR pszExtension = PathFindExtension(pszPathname);<br />
CString DummyFileName;<br />
DummyFileName = _T("dummyfile");<br />
if (pszExtension[0] == _T('.'))<br />
DummyFileName += pszExtension;<br />
else<br />
DummyFileName += _T(".");<br />
<br />
SHFILEINFO shfi;<br />
memset(&shfi, 0, sizeof(shfi));<br />
if (SHGetFileInfo(DummyFileName,<br />
FILE_ATTRIBUTE_NORMAL,<br />
&shfi,<br />
sizeof(shfi),<br />
SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES))<br />
{<br />
hIcon = shfi.hIcon;<br />
*pRetImgFlags |= RECORDIMGDATAFLAG_ICONFROMSHELL;<br />
}<br />
}<br />
<br />
if (hIcon)<br />
{<br />
...<br />
Will that work?
Mark
|
|
|
|
|
I use this to get an icon for any file. This will get the default exe icon if none
found in the exe itself:
<br />
HICON hIcon = 0;<br />
<br />
<br />
SHFILEINFO shfi;<br />
memset(&shfi, 0, sizeof(shfi));<br />
if (SHGetFileInfo(pszPathname,<br />
FILE_ATTRIBUTE_NORMAL,<br />
&shfi,<br />
sizeof(shfi),<br />
SHGFI_ICON | SHGFI_SMALLICON))<br />
{<br />
hIcon = shfi.hIcon;<br />
}<br />
<br />
<br />
<br />
if (hIcon == 0)<br />
{<br />
LPTSTR pszExtension = PathFindExtension(pszPathname);<br />
CString DummyFileName;<br />
DummyFileName = _T("dummyfile");<br />
if (pszExtension[0] == _T('.'))<br />
DummyFileName += pszExtension;<br />
else<br />
DummyFileName += _T(".");<br />
<br />
SHFILEINFO shfi;<br />
memset(&shfi, 0, sizeof(shfi));<br />
if (SHGetFileInfo(DummyFileName,<br />
FILE_ATTRIBUTE_NORMAL,<br />
&shfi,<br />
sizeof(shfi),<br />
SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES))<br />
{<br />
hIcon = shfi.hIcon;<br />
*pRetImgFlags |= RECORDIMGDATAFLAG_ICONFROMSHELL;<br />
}<br />
}<br />
<br />
if (hIcon)<br />
{<br />
...<br />
}<br />
Is that what you're looking for?
Mark
|
|
|
|
|
Sorry about the double post.
I got an error the first time. I should have checked to see if it posted first
Mark
|
|
|
|
|
Thanks mate, and no problem about the double post.
Yeap that works but I don't know why i have a lot of apps wich fail loading the icon
I post my code, maybe someone sees what im doing wrong
do {<br />
<br />
imageIndex = 0;<br />
<br />
keyNameLenght = 256;<br />
<br />
res = RegEnumKeyEx(phkResult,<br />
dwIndex,<br />
keyName,<br />
&keyNameLenght,<br />
NULL,<br />
NULL,<br />
NULL,<br />
NULL);<br />
<br />
if(res == ERROR_SUCCESS) {<br />
<br />
<br />
sprintf(lpSubKey2,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\%s\\", keyName);<br />
<br />
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpSubKey2,NULL,KEY_ALL_ACCESS,&phkResult2);<br />
<br />
if (ERROR_SUCCESS == result)<br />
{<br />
if (ERROR_SUCCESS == RegQueryValue(phkResult2, NULL, path, &largoBuffer)) {<br />
<br />
<br />
CString tup = path;<br />
HICON temp = NULL;<br />
HMODULE hMod = NULL;<br />
int res = 0;<br />
WORD pis = 0;<br />
<br />
tup.Remove('"');<br />
<br />
SHFILEINFO shfi;<br />
memset(&shfi, 0, sizeof(shfi));<br />
if (SHGetFileInfo(tup,FILE_ATTRIBUTE_NORMAL,&shfi,sizeof(shfi),SHGFI_ICON | SHGFI_SMALLICON))<br />
{<br />
temp = shfi.hIcon;<br />
imageIndex = m_imageList.Add(temp);<br />
}<br />
else {<br />
<br />
LPTSTR pszExtension = PathFindExtension(tup);<br />
CString DummyFileName;<br />
DummyFileName = _T("dummyfile");<br />
<br />
if (pszExtension[0] == _T('.'))<br />
DummyFileName += pszExtension;<br />
else<br />
DummyFileName += _T(".");<br />
<br />
<br />
SHFILEINFO shfi;<br />
memset(&shfi, 0, sizeof(shfi));<br />
<br />
if (SHGetFileInfo(keyName,FILE_ATTRIBUTE_NORMAL,&shfi,sizeof(shfi),SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES))<br />
{<br />
temp = shfi.hIcon;<br />
}<br />
<br />
if(temp != NULL) {<br />
<br />
imageIndex = m_imageList.Add(temp);<br />
<br />
}<br />
else {<br />
<br />
imageIndex = 0;<br />
<br />
}<br />
<br />
}<br />
<br />
}<br />
<br />
<br />
lvi.mask = LVIF_TEXT | LVIF_IMAGE;<br />
lvi.iItem = 0;<br />
lvi.iSubItem = 0;<br />
lvi.pszText = keyName;<br />
lvi.iImage = imageIndex;<br />
m_listOrigin.InsertItem(&lvi);<br />
<br />
m_listOrigin.SetItem(&lvi);<br />
<br />
<br />
}<br />
<br />
}<br />
<br />
dwIndex++;<br />
<br />
}while(res != ERROR_NO_MORE_ITEMS);
|
|
|
|
|
>>...but I don't know why i have a lot of apps wich fail loading the icon
What do you mean? EXEs without icons?
Are you just getting the default EXE icon or none at all?
Mark
|
|
|
|
|
>>...but I don't know why i have a lot of apps wich fail loading the icon
What do you mean? EXEs without icons?
Are you just getting the default EXE icon or none at all?
By the way, don't forget to use DestroyIcon() on the returned HICON after you add it to your
image list
Mark
|
|
|
|
|
First thanks to all the people that helped me with that
The problem wasn't the technique used to get the icon, the problem was that when I used RegQueryValue I didn't re initialized the variable with the buffer lenght
So a lot of entries were corrupt and that's why some exe didn't get an icon
|
|
|
|
|
Cool!
And remember, don't forget to use DestroyIcon() on the returned HICON after you add it to your
image list
Mark
|
|
|
|
|
Done
Thanks a lot Mark, you were really helpful
|
|
|
|
|
Hello *,
dialog boxes can have a question mark button in their caption that (when clicked) changes cursor and provides help for selected control.
I'd like to have the same functionality in the main window of the application, triggered for example by a toolbar button.
I guess a specialized message loop is needed to provide all the functionality (changing cursor, sending the WM_HELP, cancelling on ESC, ...) Is this piece of code avaiable or would I need to implement it myself ?
One more thing - no MFC if possible, just pure Win32.
Thanks in advance,
Vlasta
|
|
|
|
|