none
Icon aus Programm anzeigen RRS feed

  • 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?
    Samstag, 16. Januar 2010 10:01

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
    Dienstag, 19. Januar 2010 15:02
  • Das Programm ist fertig.
    Die Beschreibung
    Das Programm

    könnt ja mal antworten wie ihr das findet ;)
    • Als Antwort markiert Neuer_user Mittwoch, 24. Februar 2010 15:48
    • Bearbeitet Neuer_user Samstag, 20. März 2010 16:53 links aktualisieren
    Mittwoch, 24. Februar 2010 15:46

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
    Sonntag, 17. Januar 2010 10:46
  • 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
    Montag, 18. Januar 2010 13:22
  • Wie kommst Du darauf, dass sich diese Funktion im .NET befindet?
    Du musst <windows.h> includieren und dann kannst Du diese Funktion aufrufen...
    Jochen Kalmbach (MVP VC++)
    Dienstag, 19. Januar 2010 09:28
  • ^^ hab ich glaub irgendwo im web gelesen. ( oder falsch verstanden )

    wie kann ich denn HICON in Drawing::Image und in Drawing::Icon Konvertieren?
    Dienstag, 19. Januar 2010 13:36
  • 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
    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
    Dienstag, 19. Januar 2010 14:31
  • 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
    Dienstag, 19. Januar 2010 15:02
  • danke!
    nicht "gcnew IntPtr..."
    sondern "IntPtr..."
    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 )
    Dienstag, 19. Januar 2010 17:49
  • 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
    Dienstag, 19. Januar 2010 18:21
  • 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
    Dienstag, 19. Januar 2010 18:53
  • 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++)
    Dienstag, 19. Januar 2010 19:37
  • hmmm...
    also wenn ich das mit nem String mache funktionierts irgendwie nicht. also es wird kein bild angezeigt, die umwandlung klappt.
    Donnerstag, 28. Januar 2010 14:41
  • Zeig mal den Code....
    Jochen Kalmbach (MVP VC++)
    Freitag, 29. Januar 2010 20:42
  • 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
    Samstag, 30. Januar 2010 10:11
  • 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++)
    Samstag, 30. Januar 2010 12:21
  • Jetzt funktionierts!!
    danke nochmal ;)

    ich stell dann vielleicht auch mal nen link zu dem programm rein,
    wenns fertig ist.
    Samstag, 30. Januar 2010 13:23
  • Das Programm ist fertig.
    Die Beschreibung
    Das Programm

    könnt ja mal antworten wie ihr das findet ;)
    • Als Antwort markiert Neuer_user Mittwoch, 24. Februar 2010 15:48
    • Bearbeitet Neuer_user Samstag, 20. März 2010 16:53 links aktualisieren
    Mittwoch, 24. Februar 2010 15:46