Открыть файл в TagLib с символами Unicode в имени файла - PullRequest
0 голосов
/ 05 октября 2009

Я довольно плохо знаком с "областью" C ++, поэтому надеюсь, что это не будет просто еще один глупый вопрос "C ++ strings".

Вот моя проблема. Я хочу интегрировать TagLib (1.5, 1.6, как только мне удастся собрать его для Windows) в существующий проект Windows MFC VS2005. Мне нужно, чтобы читать метаданные аудио файлов (не писать).

Проблема в том, что программа сохраняет имена входных файлов с помощью CString (), и у нее включена опция Unicode (поэтому символы по умолчанию - "wchar_t"). Причина этого (я думаю, что проект был начат кем-то другим) заключается в том, что некоторые из имен входных файлов могут содержать символы Юникода (например, японские или арабские символы).

Например, путь к файлу похож на «d: \ docs \ audio_test \ stragechar ڝ here.mp3», но я получаю его с помощью:

CString fpath = tmpFile->GetFilePath();

Теперь .. если я попытаюсь сделать:

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

Я получаю что-то вроде:

неразрешенный внешний символ "__declspec (dllimport) public: __thiscall TagLib :: FileName :: FileName (wchar_t const *) "

Если я попробую что-то вроде:

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

Я избавляюсь от ошибок компиляции, но «f» является недопустимым указателем / объектом ... и когда я пытаюсь прочитать тег, я получаю утверждение не удалось.

Итак, кто-нибудь может дать мне несколько советов о том, как я должен передать эту CString в форме Unicode в TagLib ?

Обновление: Адрес TagLib: http://developer.kde.org/~wheeler/taglib.html

Спасибо,

Alex

Ответы [ 2 ]

3 голосов
/ 06 октября 2009

Возможно, проблема вызвана проблемой, описанной здесь . В основном MSVC имеет опцию для обработки типа wchar_t по-разному, что приводит к тому, что скомпилированная библиотека не является двоично-совместимой с приложением, скомпилированным без этой опции. К сожалению, файл сборки CMakeLists.txt включает опцию /Zc:wchar_t- по умолчанию. Я попытался бы отредактировать файл, удалить опцию и перекомпилировать TagLib. В идеале версия 1.6, поскольку она содержит множество исправлений ошибок.

1 голос
/ 06 октября 2009

Я пропустил что-то важное, когда впервые прочитал ваш пост, поэтому вот еще один, новый и улучшенный ответ:

Ошибка исходит от компоновщика, а не от компилятора. Таким образом, кажется, что TagLib :: FileName имеет ctor, принимающий wchar_t const*, но проблема в том, что вы не связываетесь с библиотекой, реализующей его, или не связываетесь с версией библиотеки, которая не включи это.

IIUC, эта библиотека происходит из мира Linux (где имена файлов выражаются как char массивы), а затем была перенесена в Windows (где имена файлов выражены как wchar_t массивы). Таким образом, файл FileName ctor, содержащий массив wchar_t, вероятно, условно скомпилирован в Windows (то есть внутри #ifdef _WIN32 или чего-то подобного), а библиотека, с которой вы ссылаетесь (если вы связываете библиотеку), не была скомпилирована с тем же препроцессором определяет.

...