Öffnen Sie die Datei in Taglib mit Unicode -Zeichen in Dateiname
Frage
Ich bin ziemlich neu im Bereich C ++ 'Bereich', also hoffe ich, dass dies nicht nur eine weitere alberne Frage der C ++ - Strings 'sein wird.
Hier ist mein Problem. Ich möchte integrieren Taglib (1.5, 1.6, sobald ich es schafft, es für Windows zu erstellen) in ein vorhandenes Windows MFC VS2005 -Projekt. Ich brauche es, um Audio -Dateien -Metadaten zu lesen (nicht schreiben).
Das Problem ist, dass das Programm die Eingabedateinamen mit Cstring () speichert und die Option Unicode eingeschaltet ist (so sind die Standard -Zeichen "wchar_t"). Der Grund dafür (ich glaube, das Projekt wurde von jemand anderem gestartet) ist, dass einige der "Eingabedateinamen" Unicode -Charater (z. B. Japanse oder arabische Zeichen) enthalten könnten.
Der Dateipfad ist beispielsweise so etwas wie "D: docs audio_test stragechar ڝ hier.mp3", aber ich bekomme es mit:
CString fpath = tmpFile->GetFilePath();
Jetzt .. wenn ich versuche zu tun:
TagLib::FileRef f(fpath.GetBuffer(0));
fpath.ReleaseBuffer();
Ich bekomme so etwas wie:
ungelöstes externes Symbol "__declspec (dllimport) public: __thiscall Taglib :: Dateiname :: Dateiname (wchar_t const *)"
Wenn ich so etwas versuche wie:
TagLib::FileRef f(reinterpret_cast<char*>(fpath.GetBuffer(0)));
fpath.ReleaseBuffer();
Ich werde die Kompilierungsfehler los, aber "f" ist ein ungültiger Zeiger/Objekt. Und wenn ich versuche, ein Tag zu lesen, erhalte ich eine Behauptung fehl.
Kann mir also jemand einige Hinweise darauf geben, wie ich diesen Cstring in seiner Unicode -Form an die Taglib ?
Aktualisieren: Taglib Adresse: http://developer.kde.org/~wheeler/taglib.html
Vielen Dank,
Alex
Lösung
Ich habe etwas Wesentliches verpasst, als ich Ihren Beitrag zum ersten Mal gelesen habe. Hier ist eine weitere, neue und verbesserte Antwort:
Der Fehler kommt vom Linker, nicht vom Compiler. Es scheint also, dass Taglib :: Dateiname tut eine CTOR nehmen wchar_t const*
, Aber das Problem ist, dass Sie nicht mit der Bibliothek verknüpfen oder mit einer Version der Bibliothek verknüpfen, die sie nicht enthält.
IIUC stammt diese Bibliothek aus der Linux -Welt (wo Dateinamen als Dateinamen ausgedrückt werden char
Arrays) und später auf Windows portiert (wo Dateinamen als Dateinamen ausgedrückt werden als wchar_t
Arrays). Der Dateiname CTOR nimmt a wchar_t
Array ist daher wahrscheinlich bedingt auf Fenstern kompiliert (dh im Inneren #ifdef _WIN32
oder ähnliches), und die Bibliothek, mit der Sie verknüpfen (wenn Sie die Bibliothek verknüpfen), wurde nicht mit denselben Vorprozessor -Definierungen zusammengestellt.
Andere Tipps
Es ist möglich, dass das Problem durch das beschriebene Problem verursacht wird hier. Grundsätzlich hat MSVC die Möglichkeit, die zu behandeln wchar_t
Typ anders, wodurch die kompilierte Bibliothek nicht binär kompatibel mit einer Anwendung ist, die ohne diese Option zusammengestellt wird. Leider das CMakeLists.txt
Erstellendatei aktivieren die /Zc:wchar_t-
Option standardmäßig. Ich würde versuchen, die Datei zu bearbeiten, die Option zu entfernen und Taglib neu zu kompilieren. Idealerweise enthält Version 1.6, da es viele Fehlerbehebungen enthält.