विंडोज़ प्लेटफ़ॉर्म #defines के कारण MFC संकलन त्रुटियाँ। कारण का निदान करने के लिए संघर्ष करना।

प्रोग्रामिंग


मैं नवीनतम विजुअल स्टूडियो 2022/सी++/एमएफसी, विंडोज एसडीके 10.0, प्लेटफार्म टूलसेट 10.0 (नवीनतम स्थापित संस्करण), सी++ भाषा मानक आईएसओ सी++ 17 मानक और बिल्डिंग 64 बिट का उपयोग कर रहा हूं।

मैंने मानक एमडीआई टेम्पलेट के साथ शुरुआत की, कुछ चीजें जोड़ीं (सिंटिला संपादन नियंत्रण, जिसके लिए >= आईएसओ सी++ 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		

तो, मेरे कोड में नहीं. दोनों ही मामलों में, विंडोज़ संस्करण #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>

.

इसलिए, मैं इस मुद्दे के स्पष्टीकरण या इलाज पर अपना सिर खुजला रहा हूं। मैं निश्चित रूप से विंडोज़ संस्करण को अन्यत्र #परिभाषित नहीं कर रहा हूँ। हालाँकि, मुझे लगता है

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” शामिल करें।
फ्रेमवर्क.एच – #पहली पंक्ति के रूप में “targetver.h” शामिल करें
targetver.h – #पहली पंक्ति के रूप में शामिल करें

मैंने क्या प्रयास किया है:

मैंने pch.h और/याframework.h और/या targetver.h में स्पष्ट रूप से NTDDI_VERSION को #परिभाषित किया है। मैंने NTDDI_VERSION को हार्ड कोडिंग द्वारा #if (NTDDI_VERSION < NTDDI_VISTA) टेस्ट पास करने के लिए मजबूर किया है (जो काम करता है लेकिन एक व्यवहार्य समाधान नहीं है)।

समाधान 1

सी/सी++ उन्नत टैब पर कंपाइलर सेटिंग्स के तहत पहले मुद्दे को समझने के लिए “शो शामिल करें” चुनें और यह निर्माण के दौरान शामिल अनुक्रम प्रदर्शित करता है – इस तरह से आप पा सकते हैं NTDDI_VERSION जिस फ़ाइल में आप रुचि रखते हैं उससे पहले बिल्कुल परिभाषित किया गया है, या शायद यह कहीं अपरिभाषित है। यह भी सुनिश्चित करें कि SDKDDKVer.h पहले शामिल हो – इसे पहले अपनी पूर्व संकलित हेडर फ़ाइल (pch.h) में डालने का प्रयास करें
दूसरी त्रुटि यह आती है कि TCHAR को UNICODE वर्ण के रूप में परिभाषित किया गया है लेकिन फ़ंक्शन CHAR की अपेक्षा करता है। सेटिंग्स को यूनिकोड के बजाय एमबीसीएस में बदलें (गुणों में सामान्य टैब और “कैरेक्टर सेट” मान का चयन करें) – यदि यह आपका कोड नहीं है तो इससे मदद मिल सकती है, अन्यथा आप कोड में पारित पैरामीटर का पता लगा सकते हैं।

उममीद है कि इससे मदद मिलेगी।

सम्मान,
मैक्सिम।

コメント

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