ファイル名に Unicode 文字を使用して TagLib でファイルを開く
質問
私は C++ の「分野」についてはまったくの初心者なので、これが単なる「C++ 文字列」の愚かな質問にならないことを願っています。
ここが私の問題です。統合したい タグリブ (Windows 用にビルドできたらすぐに 1.5、1.6) を既存の Windows MFC VS2005 プロジェクトに追加します。オーディオファイルのメタデータを読み取るために必要です(書き込みではありません)。
問題は、プログラムが CString() を使用して入力ファイル名を保存し、Unicode オプションがオンになっている (つまり、デフォルトの文字が「wchar_t」である) ことです。この理由は (プロジェクトは他の誰かによって開始されたと思います)、「入力」ファイル名の一部に Unicode 文字 (日本語やアラビア文字など) が含まれている可能性があるためです。
たとえば、ファイルパスは「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 アドレス:http://developer.kde.org/~wheeler/taglib.html
ありがとう、
アレックス
解決
最初にあなたの投稿を読んだときに重要なことを見逃していたので、新しく改善された別の答えをここに示します。
エラーはコンパイラではなくリンカから発生します。したがって、TagLib::FileName は する 俳優に撮影してもらう wchar_t const*
, しかし問題は、それを実装するライブラリとリンクしていないか、それが含まれていないバージョンのライブラリとリンクしていることです。
IIUC、このライブラリは Linux の世界から来ています (ファイル名は次のように表現されます)。 char
配列)、後に Windows に移植されました (ファイル名は次のように表現されます)。 wchar_t
配列)。FileName クターは、 wchar_t
したがって、配列はおそらく Windows 上で条件付きでコンパイルされます (つまり、 #ifdef _WIN32
または同様のもの)、リンクしているライブラリ (ライブラリをリンクしている場合) が同じプリプロセッサ定義でコンパイルされていませんでした。
他のヒント
問題は説明されている問題によって引き起こされている可能性があります ここ. 。基本的に MSVC には、 wchar_t
タイプが異なるため、コンパイルされたライブラリは、そのオプションを使用せずにコンパイルされたアプリケーションとバイナリ互換性がなくなります。残念ながら、 CMakeLists.txt
ビルドファイルにより有効になります /Zc:wchar_t-
デフォルトではオプションです。ファイルを編集してオプションを削除し、TagLib を再コンパイルしてみます。多くのバグ修正が含まれているため、バージョン 1.6 が理想的です。