Benutzer mit den meisten Antworten
Icon aus Programm anzeigen

Frage
-
Hallo,
ich habe ein Programm gemacht bei dem man mehrere programme hinzufügen kann und dann über buttons öffnen kann ( mit ShellExecuteA(...); )
zusätzlich muss man dann noch ein bild/icon angeben was dann auf dem button angezeigt wird, damit man auch weis welches programm mit diesem button geöffnet wird.
ich möchte aber eigentlich direkt das Programm-Icon anzeigen lassen.
kann man das icon des programms auf den button anzeigen lassen (button1->Image....) wenn man den pfad und namen des programms kennt?
Antworten
-
System::Drawing::Icon^ myIcon = System::Drawing::Icon::FromHandle(gcnew IntPtr((void*)shinfo.hIcon));
So müsste es gehen... hab es aber nicht getestet...
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Neuer_user Dienstag, 19. Januar 2010 15:28
-
- Als Antwort markiert Neuer_user Mittwoch, 24. Februar 2010 15:48
- Bearbeitet Neuer_user Samstag, 20. März 2010 16:53 links aktualisieren
Alle Antworten
-
SHGetFileInfo:
http://msdn.microsoft.com/en-us/library/bb762179(VS.85).aspx
Und damit sowas in der Art:
private HICON GetFileIcon(LPCTSTR path) { SHFILEINFO shinfo = {0}; SHGetFileInfo(path, 0, &shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_SMALLICON); return shinfo.hIcon; }
Hier ist ein Beispiel in C# (leider); musst Dir nur das InterOp wegdenken ;)
http://support.microsoft.com/kb/319350/en-us
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Jochen Kalmbach Dienstag, 19. Januar 2010 09:27
-
wenn ich das hier
private HICON GetFileIcon(LPCTSTR path) { SHFILEINFO shinfo = {0}; SHGetFileInfo(path, 0, &shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_SMALLICON); return shinfo.hIcon; }
mache gehts nicht.
in Microsoft::Win32 gibts bei mir auch gar kein SHGetFileInfo- Als Antwort vorgeschlagen Jochen Kalmbach Montag, 18. Januar 2010 20:04
-
Hast Du Dir die Links mal angeschaut??????????????
Ich wiederhol mich ja nur sehr ungern:
http://support.microsoft.com/kb/319350/en-us
=>
System::Drawing::Icon^ myIcon = System::Drawing::Icon::FromHandle(shinfo.hIcon);
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Jochen Kalmbach Dienstag, 19. Januar 2010 13:39
-
ja ich war da mal drauf ( daher hab ich auch dass das ausm .net ist :
hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo,....
)
den eigentlichen code hab ich mir erst garnicht angesehen, ich wollte erstmal den code unter 1. und 2. und so einfügen und dann hats auch schon fehler gehagelt und dann hab ich das mit dem beispiel ganz gelassen ;)
ich bekomme den fehler
error C2664: 'System::Drawing::Icon::FromHandle': Konvertierung des Parameters 1 von 'HICON' in 'System::IntPtr' nicht möglich
-
System::Drawing::Icon^ myIcon = System::Drawing::Icon::FromHandle(gcnew IntPtr((void*)shinfo.hIcon));
So müsste es gehen... hab es aber nicht getestet...
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Neuer_user Dienstag, 19. Januar 2010 15:28
-
ich bräuchte eventuell noch eine funktion die einen String in LPCTSTR konvertiert.
ich hab das mal ungefähr so probiert
GetFileIcon(LPCTSTR((wchar_t)dateiname->ToCharArray()));
beim ausführen bekomme ich aber eine AccessViolationException ( das programm wird nicht beendet, nur das bild wird nicht angezeigt ) -
Hier mal einige Konvertierungen von Strings. Du brauchst die *letzte*!
#include <string> #include <tchar.h> #include <msclr/marshal.h> #include <msclr\marshal_cppstd.h> using namespace System; using namespace msclr::interop; int main(array<String ^> ^args) { // TO String^ String ^s1 = marshal_as<System::String^>("Hello world"); Console::WriteLine(s1); String ^s2 = marshal_as<System::String^>(L"Hello world"); Console::WriteLine(s2); String ^s3 = marshal_as<System::String^>(_T("Hello world")); Console::WriteLine(s3); String ^s = "Hello world"; // FROM String^ std::string us1 = marshal_as<std::string>(s); printf(us1.c_str()); std::wstring us2 = marshal_as<std::wstring>(s); wprintf(us2.c_str()); msclr::interop::marshal_context c; // Context kann wiederverwendet werden! const char *us3 = c.marshal_as<const char*>(s); printf(us3); const wchar_t *us4 = c.marshal_as<const wchar_t*>(s); wprintf(us4); LPCTSTR us5 = c.marshal_as<LPCTSTR>(s); _tprintf(us5); }
Siehe auch:
http://www.c-plusplus.de/forum/viewtopic-var-p-is-1455833.html#1455833
Also auf gut Deutsch:
#include <tchar.h> #include <msclr/marshal.h>
msclr::interop::marshal_context c; LPCTSTR us5 = c.marshal_as<LPCTSTR>(dateiname); SHGetFileIcon(us5, ...);
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Jochen Kalmbach Dienstag, 19. Januar 2010 18:25
-
die msclr/marshal.h scheint es in der Express-Version nicht zu geben.
http://www.c-plusplus.de/forum/viewtopic-var-t-is-231241.html -
Ja stimmt... hatte ich vergessen... dann musst Du halt sdoch die andere Variante aus dem erwähnten Thread verwenden:
http://www.c-plusplus.de/forum/viewtopic-var-t-is-158664.html
Jochen Kalmbach (MVP VC++) -
erstmal der code ohne string:
private: Void GetFileIcon(Button^ _button,LPCTSTR path) { SHFILEINFO shinfo = {0};
SHGetFileInfo(path, 0, &shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_SMALLICON);_button->Image = System::Drawing::Icon::FromHandle(IntPtr((void*)shinfo.hIcon))->ToBitmap();
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
GetFileIcon(this->button1,L"C:\\Programme\\A\\uninstall.exe");
}
jetzt mit string:
LPCTSTR us5;
...
private: Void GetFileIcon(ToolStripButton^ _button,String^ path)
{
us5 = (LPCTSTR) StringConvT(path);
SHFILEINFO shinfo = {0};
SHGetFileInfo(us5, 0, &shinfo, sizeof(shinfo), SHGFI_ICON);
_button->Image = System::Drawing::Icon::FromHandle(IntPtr((void*)shinfo.iIcon))->ToBitmap();
}
Void image()
{
String^ eins;
eins = "D:\Programme\Microsoft Visual Studio 9.0\Common7\IDE\VCExpress.exe";
GetFileIcon(toolStripButton1,eins);
}
Beim Ausführen kommt in der Zeile
_button->Image = System::Drawing::Icon::FromHandle(IntPtr((void*)shinfo.iIcon))->ToBitmap();
folgene Fehlermeldung:
System.Collections.ListDictionaryInternal
Der an Icon übergebene Win32-Handle ist ungültig oder hat den falschen Typ.- Bearbeitet Neuer_user Samstag, 30. Januar 2010 10:18 fehler
-
Diese Zeile geht so nicht:
LPCTSTR us5 = StringConvT(path); SHFILEINFO shinfo = {0}; SHGetFileInfo(us5, 0, &shinfo, sizeof(shinfo), SHGFI_ICON);
da das "us5" schon wieder ungültig ist, wenn diese Zeile verlassen wird!
Mach so so:
SHFILEINFO shinfo = {0}; SHGetFileInfo(StringConvT(path), 0, &shinfo, sizeof(shinfo), SHGFI_ICON);
Auch solltest Du *immmer* die Rückgabewerte prüfen!
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Jochen Kalmbach Samstag, 30. Januar 2010 14:35
-
- Als Antwort markiert Neuer_user Mittwoch, 24. Februar 2010 15:48
- Bearbeitet Neuer_user Samstag, 20. März 2010 16:53 links aktualisieren