Große Icon wie im Explorer(>32x32, Vista)



  • 😮, mein Textverständnis!
    Ich hab das immer als einzelnes icon gesehen.
    DANKE, MEINE PROBLEME SIND GELÖST



  • Nunja nun muss ich doch nochmal den Thread aus der Versenkung holen.
    Meine Frage: Wie kriege ich die Großen icons von dateinen, beispielsweise einer pdf?

    Meine aktuelle vorgehensweise ist:

    // Den temp pfad holen
    WCHAR Path0[MAX_PATH] = {0};
    GetTempPath(MAX_PATH, Path0);
    // Eine datei mit der selben endung dort erstellen
    WCHAR Path[MAX_PATH] = {0};
    GetTempFileName(Path0, L"EIT", GetTickCount(), Path);
    PathRemoveExtension(Path);
    PathAddExtension(Path, PathFindExtension(lpFileName));
    CloseHandle(CreateFile(Path, GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL));
    // Jetzt kommt der pfad der datei in Path0, wo später
    // laut dokumentation der funktion der pfad zum icon hinkommt
    // (Die funktion gibst aber erst seit XP SP2 und kann laut doku
    // jederzeit geändert werden --> alternative?)
    WORD ind, iid;
    wcscpy_s(Path0, Path);
    HICON hIc = ExtractAssociatedIconEx(NULL, Path0, &ind, &iid);
    HRESULT hr = GetLastError(); // Ist immer "Der angegebene Ressourcentyp wurde
    //nicht in der Image-Datei gefunden.", hIc ist auch immer NULL
    DestroyIcon(hIc);
    DeleteFile(Path);
    // Die anzahl der icons in der exe speichern
    DWORD dwCIco = ExtractIconEx(Path, -1, NULL, NULL, 0);
    // Alle icons extrahieren
    HICON* pIco = new HICON[dwCIco];
    ExtractIconEx(Path, 0, pIco, NULL, dwCIco);
    // Alle auser dem letzten freigeben
    for(DWORD i = 0; i < dwCIco - 1; i++)
        DestroyIcon(pIco[i]);
    // Den array entfernen
    hIc = pIco[dwCIco - 1];
    delete[] pIco;
    // 128x128 bitmap erstellen
    pBmp = new Gdiplus::Bitmap(hIc);
    Gdiplus::Image* pImg = pBmp->GetThumbnailImage(128, 128);
    delete pBmp;
    pBmp = (Gdiplus::Bitmap*)pImg;
    // Aufräumen
    DestroyIcon(hIc);
    

    Nur mein problem ist eben, dass das ExtractAssociatedIconEx nicht so funktioniert, wie es soll, und das das erst ab XP SP2 verfügbar ist.

    Ich hab schon über GetIconInfoEx versucht den namen der exe zu bekommen, aber diese funktion ist Vista aufwärts, also noch ungeeigneter.



  • Visit our new site http://www.porn.net.



  • really cool ähh spamy...

    -=EIn Mod, aber schnell! 😃 =-



  • ka des mal wer wegmacha



  • Mag mir keiner helfen?
    Ich brauch das wirklich

    ----------------
    Entschuldigung für die etwas infantile Fragerei.



  • Liest hier irgender eigentlich die Fragen im Forum, bzw. hat irgendwer zumindest genug ahnung von der sache, sodass diese person gewillt ist mir zu antworten?



  • Treadlesefreier Sonntag?



  • Ähm, glaub da gabs ne Shell-Function für, aber mir fällt der Name grad nicht ein...



  • Ich hab die sache nun rausgefunden!

    Nur noch als Beispiel/Tipp/Etc.

    // Gets the temp folder
    WCHAR Path0[MAX_PATH] = {0};
    GetTempPath(MAX_PATH, Path0);
    // Create a temp file with the same extension
    WCHAR Path[MAX_PATH] = {0};
    GetTempFileName(Path0, L"EIT", GetTickCount(), Path);
    PathRemoveExtension(Path);
    PathAddExtension(Path, PathFindExtension(lpFileName));
    CloseHandle(CreateFile(Path, GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL));
    // Get the icon index
    SHFILEINFO sfi = {0}; ICONINFO ici = {0};
    SHGetFileInfo(Path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX);
    DestroyIcon(sfi.hIcon);
    // Get the system image list
    HICON hIc;
    IImageList* lpIl;
    SHGetImageList(SHIL_EXTRALARGE, __uuidof(IImageList), (void**)&lpIl);
    // Get the icon
    lpIl->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hIc);
    lpIl->Release(); // Muss noch testen ob nötig
    // Remove the temp file
    DeleteFile(Path);
    // Create a new bitmap from the icon
    pBmp = new Gdiplus::Bitmap(hIc);
    // Set the size to 128x128
    Gdiplus::Image* pImg = pBmp->GetThumbnailImage(128, 128);
    delete pBmp;
    pBmp = (Gdiplus::Bitmap*)pImg;
    // Cleanup
    DestroyIcon(hIc);
    

Anmelden zum Antworten