أخطاء تجميع MFC بسبب نظام التشغيل Windows #defines. تكافح من أجل تشخيص السبب.

برمجة


أنا أستخدم أحدث إصدار من Visual Studio 2022 / C++ / MFC، وWindows SDK 10.0، ومجموعة أدوات النظام الأساسي 10.0 (أحدث إصدار مثبت)، وC++ Language Standard ISO C++ 17 Standard وبناء 64 بت.

لقد بدأت باستخدام قالب MDI القياسي، وأضفت بعض العناصر (التحكم في تحرير Scintilla، والذي يتطلب >= ISO C++ 17) وتم تجميعه بنجاح.

أقوم الآن بدمج كود المصدر الحالي من التطوير السابق (والذي يتم تجميعه ضمن ISO C++ 14، ولكن قد لا يكون هذا هو التفسير لما أنا على وشك وصفه).

فشل التحويل البرمجي الخاص بي الآن بسبب الأخطاء التالية:

Error	C1189	#error:  CTaskDialog is not supported on Windows versions prior to Vista.	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\afxtaskdialog.h	18		

… و

Error	C2664	'INT getaddrinfo(PCSTR,PCSTR,const ADDRINFOA *,PADDRINFOA *)': cannot convert argument 1 from 'LPCTSTR' to 'PCSTR'	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\atlsocket.h	163		

لذلك، ليس في الكود الخاص بي. في كلتا الحالتين، يوجد تجميع مشروط يعتمد على إصدار Windows #defines. على سبيل المثال، بالنسبة للخطأ الأول، الكود هو:

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

تفسيري لهذا هو أن المترجم يرى أن قيمة NTDDI_VERSION أقل من قيمة NTDDI_VISTA وبالتالي يطلق الخطأ.

ولكن، أنا أستخدم فقط جميع الإعدادات الافتراضية التي أنشأها قالب المشروع لـ pch.h وframework.h وtargetver.h، والتي (إذا كان فهمي صحيحًا) تعادل

#include <SDKDDKVer.h>

.

لذلك، أنا في حيرة من أمري بشأن تفسير أو علاج لهذه المشكلة. أنا بالتأكيد لا أقوم بإعادة تعريف إصدار Windows #defines في مكان آخر. ومع ذلك، أعتقد

NTDDI_VERSION

في الواقع غير محدد عند النقطة الموجودة في ملف الرأس حيث يتم تطبيق اختبار الإصدار، لأن هذا التعديل (تدنيس المقدسات، أعرف) يؤدي إلى نجاح الترجمة:

#undef NTDDI_VERSION
#define NTDDI_VERSION NTDDI_WIN10

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

من الواضح أن تحرير AfxTaskDialog.h ليس حلاً مقبولاً، لذا سأكون ممتنًا للغاية لأي اقتراح حول كيفية تشخيص/حل هذه المشكلة.

يحدد ملخص الإطار/المنصة

pch.h – # تضمين “framework.h” كسطر أول.
Framework.h – # تضمين “targetver.h” كسطر أول
targetver.h – # تضمين كسطر أول

ما حاولت:

لقد قمت بتحديد #NTDDI_VERSION بشكل صريح في pch.h و/أو Framework.h و/أو targetver.h. لقد أجبرت NTDDI_VERSION على اجتياز اختبار #if (NTDDI_VERSION < NTDDI_VISTA) عن طريق الترميز الثابت NTDDI_VERSION (الذي يعمل ولكنه ليس حلاً قابلاً للتطبيق).

الحل 1

لمعرفة المشكلة الأولى ضمن إعدادات المترجم في علامة التبويب C/C++ Advanced، اختر “إظهار التضمينات” وسيتم عرضها أثناء إنشاء تسلسل التضمين – بهذه الطريقة يمكنك العثور على NTDDI_VERSION تم تعريفه على الإطلاق قبل الملف الذي تهتم به، أو ربما يكون غير محدد في مكان ما. تأكد أيضًا من تضمين SDKDDKVer.h أولاً – حاول وضعه أولاً في ملف الرأس المترجم مسبقًا (pch.h)
الخطأ الثاني يأتي من تعريف TCHAR على أنه حرف UNICODE ولكن الوظيفة تتوقع CHAR. قم بتغيير الإعدادات إلى MBCS بدلاً من UNICODE (علامة التبويب عام في الخصائص وحدد قيمة “مجموعة الأحرف”) – قد يساعد هذا إذا لم يكن هذا هو الرمز الخاص بك، وإلا يمكنك معرفة المعلمة التي تم تمريرها في التعليمات البرمجية.

نأمل أن تكون هذه المساعدة.

يعتبر،
حكمة – قول مأثور.

コメント

タイトルとURLをコピーしました