Question

Je suis tout à fait nouveau à la «zone C ++ je l'espère ce ne sera pas juste une autre bête « C ++ cordes » question.

Voici mon problème. Je veux intégrer TagLib (1.5, 1.6, dès que je parviens à le construire pour Windows) dans un projet Windows MFC VS2005 existant. J'ai besoin pour lire les métadonnées des fichiers audio (pas écrire).

Le problème est que le programme stocke les noms de fichiers d'entrée en utilisant CString (), et il a l'option Unicode activée (si les caractères par défaut sont « wchar_t »). La raison de cela (je pense, le projet a été lancé par quelqu'un d'autre) est que quelques-uns des noms de fichiers « d'entrée » peut contenir charaters Unicode (par exemple, Japanse ou caractères arabes).

Par exemple, le chemin du fichier est quelque chose comme "d: \ docs \ audio_test \ stragechar ڝ here.mp3", mais je reçois avec:

CString fpath = tmpFile->GetFilePath();

.. si j'essaie de faire:

TagLib::FileRef f(fpath.GetBuffer(0));
fpath.ReleaseBuffer();

Je reçois quelque chose comme:

  

symbole externe non résolu   « __Declspec (dllimport) public:   __thiscall TagLib :: :: FileName FileName (wchar_t   const *) "

Si je tente quelque chose comme:

TagLib::FileRef f(reinterpret_cast<char*>(fpath.GetBuffer(0)));
fpath.ReleaseBuffer();

Je me débarrasser des erreurs de compilation, mais « f » est un pointeur invalide / objet .. et quand j'essayer de lire une étiquette, je reçois une assertion a échoué.

Alors, quelqu'un peut me donner quelques conseils sur comment dois-je passer que CString, dans sa forme Unicode, la TagLib ?

Mise à jour: TagLib Adresse: http://developer.kde.org/~wheeler/ taglib.html

Merci,

Alex

Était-ce utile?

La solution

J'ai raté quelque chose d'essentiel quand j'ai lu votre message, alors voici une autre, nouvelle et améliorée réponse:

L'erreur provient de l'éditeur de liens, et non le compilateur. Il semble donc que TagLib :: FileName fait ont une wchar_t const* de prise de cteur, mais le problème est que vous ne liez pas avec la bibliothèque mise en œuvre ou d'un lien avec une version de la bibliothèque qui ne comprend pas il.

IIUC, cette bibliothèque vient du monde Linux (où les noms de fichiers sont exprimés sous forme de tableaux de char), et a ensuite été porté sur Windows (où les noms de fichiers sont exprimés sous forme de tableaux de wchar_t). Le cteur FileName prendre un tableau de wchar_t est donc probablement conditionnellement compilé sous Windows (c.-à l'intérieur #ifdef _WIN32 ou quelque chose de similaire), et la bibliothèque vous créez un lien avec (si vous liez la bibliothèque) n'a pas été compilé avec le même préprocesseur définit.

Autres conseils

Il est possible que le problème est causé par le problème décrit . Fondamentalement MSVC a une option pour traiter le type de wchar_t différemment, ce qui provoque la bibliothèque compilée n'est pas binaire compatible avec une application compilée sans cette option. Malheureusement, le fichier de construction de CMakeLists.txt permet l'option /Zc:wchar_t- par défaut. Je vais essayer d'éditer le fichier, supprimez l'option et recompiler TagLib. Idéalement version 1.6, car il contient beaucoup de corrections de bugs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top