2010-11-22 2 views
1

Ich versuche verzweifelt zu erraten, wie der lokalisierte Dateiname für Fotos mit dem Pfad zu dieser Datei abgerufen werden kann. Zum Beispiel, mit dem Pfadlokalisierte Version von GetFileTitle?

c: \ images \ qualle.png - Win 7 Explorer und das integrierte Bildbetrachter-Programm beide zeigen das Wort "Méduses" für einen französischen Gewinn 7. Stimmt dies auch für andere Versionen von Fenster?

GetFileTitle entfernt nur die Erweiterung und den Ordnerpfad, der mir "Qualle" gibt, was ich nicht möchte, und nachdem ich MSDN und google gelesen habe, scheint die Windows Media Format http://msdn.microsoft.com/en-us/library/dd798508(v=VS.85).aspx Schnittstelle hier nicht zu helfen. Entweder habe ich meine googling Fähigkeiten verloren oder das ist sehr schlecht dokumentiert. Hilfe bitte ?

danke

+0

Wenn Sie sich die erweiterten Eigenschaften eines Jpg (F-Stop, Kamerahersteller usw.) ansehen (mit Windows Explorer in Windows 7), enthalten sie eine Title-Eigenschaft. Ich denke, das sehen Sie im Bildbetrachter. Ich würde mich sicherer darüber fühlen, wenn der Titel für das Quallenbild in Sample Pictures für meine Installation nicht leer wäre. –

Antwort

3

ich diesen Fall nicht sicher bin, speziell aber die einzige offiziell unterstützt, wie ich von (ich habe noch nie lokalisierte Dateinamen in dieser Form auftreten) kennen die lokalisierte Dateinamen für Systemverzeichnisse zu erhalten und die Standard-Windows-Applets usw. verwenden IShellFolder :: GetDisplayNameOf.

So kurz, müssen Sie eine PIDL für die Datei (SHParseDisplayName) abrufen, an den übergeordneten Ordner (SHBindToParent) binden und dann für den Anzeigenamen mit dem Flag SHGDN_INFOLDER abfragen.

Addendum: Ein noch einfacherer Weg (den ich völlig vergessen habe) ist die Verwendung von SHGetFileInfo, um den Anzeigenamen mit dem Flag SHGFI_DISPLAYNAME zu erhalten. Das heißt, Sie müssen nicht mit PIDLs herumspielen. SHGetFileInfo ist im Wesentlichen ein Wrapper um die verschiedenen Shell-COM-Klassen wie IShellFolder. Wie auch immer, der Schlüssel besteht darin, die Shell zu verwenden, um den Anzeigenamen anstelle der zugrunde liegenden API-Funktionen zu erhalten.

+0

Hey, das war aufschlussreichste! Obwohl ich es nicht genau wie beschrieben versucht habe, hast du mich auf den richtigen Weg gebracht :) Bitte ändere es so, dass es HRESULT verwendet hr = SHGetFileInfo (tcFilename, -1, & sfi, sizeof (sfi), SHGFI_DISPLAYNAME); was den Namen verrät, nach dem ich gesucht habe. Ich habe deine genauen Schritte nicht versucht, weil sie mir überflüssig erschienen. Ich meine, SHParseDisplayName, gefolgt von einem GetDisplayNameOf, scheinen sich auf dasselbe zu beziehen - der 'Anzeigename', der a priori der ersten Funktion zugeführt werden muss (muss also bereits bekannt sein - nicht mein Fall). Vielen Dank! – kellogs

+0

Sie haben Recht, dass SHGetFileInfo das gleiche tun kann, ich benutze normalerweise die zugrunde liegenden COM-Schnittstellen und habe das vergessen. Die SHParseDisplayName-Funktion ist ein bisschen falsch, denn was sie analysiert, ist ein "Parsing-Name" - siehe die Dokumentation zu IShellFolder :: GetDisplayNameOf für die Unterscheidung (speziell das SHGDN_FORPARSING-Flag). –