Dateisymbole
-
Also meine Frage ist folgende...
wenn im Explorer eine Datei angezeigt wird hat sie immer dieses typische Icon.
Dlls z.B. diese lustigen Zahnrädchen.
Wie kann man selbst diese Icons "auslesen"?
-
Mit Visual Studio! (Resource Editor)
Aber du solltest nicht zu blind kopieren, auch hier kann man wegen Copyrights auf die Nase fallen.
-
Es geht um das auslesen zur Laufzeit, ohne die Hilfe des Visual-Studios.
Der Explorer muss das ja auch irgendwie machen und ich würde gerne wissen wie das geht.Es geht nicht ums kopieren dieser Icon oder ändern.
Ich will einfach den Dateinamen mit dem entsprechenden Symbol davor in einer Liste anzeigen.
-
Such in HKCR nach einem Schlüssel, der so heißt wie die Dateierweiterung mit Punkt davor. Da drin findest du einen String-Wert, der eine kurze Beschreibung des Dateityps enthält. Dann suchst du (ebenfalls in HKCR) den Schlüssel, der so heißt wie diese Beschreibung. Der hat einen Unterschlüssel "DefaultIcon". Da drin gibt es einen Wert, der einen Dateipfad und eine Nummer enthält. Die Nummer bezeichnet die Nummer des Icons in den Resourcen der angegebenen Datei.
-
Nicht so kompliziert mit Registry !
Suche im Forum WINAPI danach oder warte bis heute abend. Dann gegbe ich dir einen Codeausschnitt da ich die Funktion nicht auswendig weiß.
-
Ich hab das mal so gemacht:
void CMyPropertyPage4::AddFilesToListCtrl() { if(!m_bInitialised) { m_bInitialised=true; SHFILEINFO shFinfo; HIMAGELIST hImgList = NULL; m_imgList.Attach((HIMAGELIST)SHGetFileInfo("C:\\", 0, &shFinfo, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON)); m_pParent->m_ctrlCodecs2.SetImageList(&m_imgList,LVSIL_SMALL); } CFileFind FileFind; m_pParent->m_ctrlCodecs2.DeleteAllItems(); if(FileFind.FindFile(GetProgramPath()+"\\Incoming\\*.*")) { bool bFound = true; while(bFound) { bFound = FileFind.FindNextFile(); if(FileFind.IsDots()||FileFind.IsDirectory()) continue; else { SHFILEINFO shFinfo; int nIcon; SHGetFileInfo(FileFind.GetFilePath(), 0, &shFinfo, sizeof(shFinfo), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON); nIcon = shFinfo.iIcon; DestroyIcon(shFinfo.hIcon); m_pParent->m_ctrlCodecs2.InsertItem(0,FileFind.GetFileName(),nIcon); } } } }Die wichtige Funktion ist SHGetFileInfo.
-
Das ist zugegebenermaßen etwas einfacher als mein Vorschlag.
