Icon einer Dateiendung ermitteln

AckiB

Mitglied
Hallo,
ich möchte sowas wie einen Explorer schreiben.
dazu möchte ich die Icons der Dateiendungen anzeigen.
leider ist das Einzige, was ich gefunden habe, in VB geschrieben:
http://www.activevb.de/tipps/vb6tipps/tipp0027.html

also habe ich versucht diesen Code zu portieren und in der MSDN nach den verwendeten Funktionen gesucht, das Ergebnis ist dies:
Code:
// Deklarationen für "size"
static const int icoLarge = 256;
static const int icoSmall = 257;

// in Funktion
  SHFILEINFO sfi;
  SHGetFileInfo(filename, 0, &sfi, sizeof(SHFILEINFO), size);
  PICTDESC pdesc;
  pdesc.cbSizeofstruct = sizeof(PICTDESC);
  pdesc.picType = 3;
  pdesc.icon.hicon = sfi.hIcon;
  REFIID  CLSID;
//    CLSID.id[8] = 192;
//    CLSID.id[15] = 70;
  void** data;
  OleCreatePictureIndirect(&pdesc, CLSID, true, data);
aber das funktioniert irgendwie nicht :confused:
vor allem habe ich da Probleme mit dem REFIID, ich habe keine Ahnung was das sein soll und bekomme einen Fehler damit:
error: `CLSID' declared as reference but not initialized
und das id kein Member dieses Typs ist (darum auskommentiert)...

ich hoffe, dass mir jemand damit helfen kann... :)
danke, Acki
 
Zuletzt bearbeitet:
REFIID ist vermutlich ein struct, was irgendwo in VB definiert ist.
Um das zu verwenden, müsstest du rausfinden, wie das struct aussieht und es entspechend bei dir definieren.
Müsste über Google zu finden sein.
 
REFIID ist vermutlich ein struct, was irgendwo in VB definiert ist.
nicht wirklich...

also, MSDN deklariert die API "OleCreatePictureIndirect" so:
http://msdn.microsoft.com/en-us/library/ms694511.aspx
Code:
STDAPI OleCreatePictureIndirect( 
  PICTDESC* pPictDesc,
                 //Pointer to the structure of parameters for picture
  REFIID  riid,  //Reference to the identifier of the interface
  BOOL fOwn,     //Whether the picture is to be destroyed
  VOID** ppvObj  //Address of output variable that receives the 
                 // interface pointer requested in riid
);

und "REFIID" so:
http://msdn.microsoft.com/en-us/library/cc208571.aspx
Code:
typedef IID* REFIID;

und in dem VB Beispiel wird dieser Typ so deklariert:
Code:
Private Type CLSIdType
    id(16) As Byte
End Type

außerdem verwendet das VB Beispiel das dann so:
http://www.activevb.de/tipps/vb6tipps/tipp0027.html
Code:
Dim CLSID As CLSIdType
.
.
.
    CLSID.id(8) = &HC0
    CLSID.id(15) = &H46
    Result = OleCreatePictureIndirect(Icon, CLSID, 1, Unknown)
 
und wo willst du die icons anzeigen lassen? in nem ListView element?
für n ListView hab ich mir das icon über SHGetFileInfo() geholt, ner ImageList hinzugefügt, un diese ImageList dann dem ListView item übergeben...
 
Ich benutze Irrlicht (3D-Render-Engine) und möchte die Icons als Texturen benutzen...
Texturen werden da nicht nur für die 3D-Modells benutzt, sonder auch z.B. für die GUI...

ich habe es auch so versucht:
Code:
// Definitionen für size in getFileIcon()
static const int icoLarge = 256;
static const int icoSmall = 257;

ITexture* getFileIcon(char* filename, int size, IVideoDriver* driver){
  ITexture* ret = 0;
  SHFILEINFO sfi;
  SHGetFileInfo(filename, 0, &sfi, sizeof(SHFILEINFO), size);
  ICONINFO  icodat;
  if(GetIconInfo(sfi.hIcon, &icodat)){
    IImage* txt = driver->createImageFromData(ECF_A8R8G8B8, dimension2d<s32>(16,16), &icodat.hbmColor);
    ret = driver->addTexture("icon", txt);
    txt->drop();
  }
  return ret;
}
das scheint auch soweit zu funktionieren, aber leider bekome ich damit nur "Pixel-Schrott"...
Das heißt ich habe da probleme mit der Konvertierung...
denn leider gibt die ICONINFO nicht die Größe und das Color-Format an...

aber es sieht momentan so aus als sollte ich doch diesen Ansatz weiter verfolgen...
 
Zuletzt bearbeitet:
Zurück