سؤال

أنا جديد جدا في منطقة C ++، لذلك آمل أن يكون هذا لن يكون مجرد سؤال آخر "C ++ سلاسل" سخيفة.

هنا مشكلتي. أريد أندمج 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) العامة: __THISCALL TAGLIB :: اسم الملف :: اسم الملف (wchar_t const *)"

إذا جربت شيئا مثل:

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

أتخلص من أخطاء الترجمة، ولكن "F" هو مؤشر / كائن غير صالح .. وعندما أحاول قراءة علامة، أتلقى تأكاؤ فشل.

لذلك، هل يمكن لأي شخص أن يعطيني بعض المؤشرات حول كيفية تجاوز ذلك CSTRING، في شكل يونيكود، إلى Taglib. ?

تحديث: عنوان العنوان: http://developer.kde.org/~wheler/taglib.html

شكرا لك،

اليكيال

هل كانت مفيدة؟

المحلول

فاتني شيئا أمرا ضروريا عندما قرأت رسالتك لأول مرة، لذلك هنا إجابة أخرى ومحسنة:

يأتي الخطأ من الرابط، وليس المحول البرمجي. وبالتالي يبدو أن Taglib :: اسم الملف هل لديك مطلق النار أخذ wchar_t const*, ، ولكن المشكلة هي أنه لا ترتبط مع المكتبة التي تنفذها، أو رابط مع إصدار من المكتبة التي لا تتضمن ذلك.

IIUC، تأتي هذه المكتبة من عالم Linux (حيث يتم التعبير عن أسماء الملفات char صفائف)، واستقل لاحقا إلى Windows (حيث يتم التعبير عن أسماء الملفات wchar_t صفائف). اسم الملف الذكر أخذ wchar_t وبالتالي، فإن مجموعة مترجمة مشروطة على Windows (أي الداخل #ifdef _WIN32 أو شيء مشابه)، والمكتبة التي تربط بها (إذا كنت ترتبط المكتبة) لم يتم تجميعها مع تحديد نفس Preprocessor.

نصائح أخرى

من الممكن أن تكون المشكلة ناتجة عن المشكلة الموصوفة هنا. وبعد أساسا MSVC لديه خيار لعلاج wchar_t اكتب بشكل مختلف، مما يؤدي إلى أن المكتبة المترجمة غير متوافقة ثنائية متوافقة مع تطبيق مترجم بدون هذا الخيار. لسوء الحظ، ال CMakeLists.txt بناء الملف يتيح /Zc:wchar_t- الخيار افتراضيا. سأحاول تحرير الملف، وإزالة الخيار وإعادة ترجمة Taglib. الإصدار 1،6 من الناحية المثالية، كما أنه يحتوي على الكثير من إصلاحات الأخطاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top