LPCWSTR का क्या मतलब है और इसे कैसे संभाला जाना चाहिए?


91

सबसे पहले, यह वास्तव में क्या है? मुझे लगता है कि यह एक पॉइंटर है (LPC का अर्थ है लंबे पॉइंटर का निरंतर), लेकिन "W" का क्या अर्थ है? क्या यह स्ट्रिंग के लिए एक विशिष्ट सूचक है या किसी विशिष्ट स्ट्रिंग के लिए सूचक है? उदाहरण के लिए मैं "TestWindow" नामक एक विंडो को बंद करना चाहता हूं।

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

कोड गैरकानूनी है और यह काम नहीं करता है क्योंकि const char [6] को CONST WCHAR में नहीं बदला जा सकता है। मैं यह बिल्कुल नहीं मिलता है। मैं इन सभी LPCWSTR, LPCSTR, LPSTR की स्पष्ट समझ प्राप्त करना चाहता हूं। मैंने कुछ खोजने की कोशिश की, हालाँकि मैं और भी उलझ गया। Msdn साइट FindWindowExपर घोषित किया गया है

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

तो अंतिम पैरामीटर LPCSTR है, और संकलनकर्ता LPCWSTR पर मांग करता है। कृपया मदद करे।


59
Microsoft हंगेरियन अंकन में आपका स्वागत है।
थॉमस मैथ्यू

2
यह वास्तव में कहीं अधिक पठनीय प्रलेखन के लिए बनाता है, इसके बारे में बाकी सब कुछ दया।
मैट जॉइनर

1
@Thomas: यह वह नहीं है जो Microsoft (या उस मामले के लिए सिमोनी) ने शुरू में हंगरी नोटेशन को टैग किया था । यह कमोबेश एक दुर्घटना का परिणाम है, जब प्रलेखन समूह ने कुछ "पठनीयता" में सुधार करने का निर्णय लिया। वे डेवलपर्स नहीं थे और परिणामस्वरूप परिवर्तन सुंदर नहीं थे। पृष्ठभूमि की जानकारी Hugarian अंकन
IInspectable

@IIspectable: टूटी कड़ी
निकोलस राउल

जवाबों:


137

LPCWSTR"लॉन्ग पॉइंटर टू कॉन्स्टेंट वाइड स्ट्रिंग" के लिए खड़ा है। डब्लू वाइड के लिए खड़ा है और इसका मतलब है कि स्ट्रिंग 2 बाइट चरित्र बनाम सामान्य में संग्रहीत है char। किसी भी C / C ++ कोड के लिए सामान्य जिसे गैर-ASCII के साथ केवल तार से निपटना है। =

A को असाइन करने के लिए एक सामान्य C शाब्दिक स्ट्रिंग प्राप्त करने के लिए LPCWSTR, आपको इसे L के साथ उपसर्ग करने की आवश्यकता है

LPCWSTR a = L"TestWindow";

8
बस विस्तार करने के लिए - 'लंबी' भाग 16bit खिड़कियों से एक हैंगओवर है और इसे नजरअंदाज किया जा सकता है (नाम में आपको इसकी आवश्यकता है)
मार्टिन बेकेट 16

14
"16bit विंडोज से हैंगओवर" - यह सुनिश्चित करने के लिए है!
जॉन डिब्लिंग

4
नहीं, यह सही है। यह एक 32 बिट्स पॉइंटर था। अब कोई "शॉर्ट" 16 बिट्स पॉइंटर्स नहीं हैं, इसलिए यदि आप एक खोजने के लिए प्रबंधन करते हैं तो आप शिकायत कर सकते हैं SPCWSTR
एमएसल्टर्स

50
हे भगवान। एल ??? अक्षर L? एक फ़ंक्शन भी नहीं, एल ()? बस सादा L? कौन बिल्ली के साथ आया था ??
जॉन ktejik

12
@ user396483 कई भाषाओं में यह आम है कि स्थिरांक और प्रत्ययों को जोड़ने के लिए स्थिरांक को बदलने के लिए कि वे कैसे प्रतिनिधित्व करते हैं, मानव के लिए उनका अर्थ बदले बिना। उदाहरण के लिए, 36ULC # में ही है (ulong)36(ulong एक अहस्ताक्षरित 64-बिट पूर्णांक है)। @स्ट्रिंग के लिए एक उपसर्ग के रूप में एक ही भाषा में इस्तेमाल किया जा सकता है, यह बदलते हुए कि कैसे उन्हें थोड़ा पार्स किया जाता है।
ज़ेनेक्सर

12

LPCWSTRके बराबर है wchar_t const *। यह एक विस्तृत वर्ण स्ट्रिंग का सूचक है जिसे फ़ंक्शन कॉल द्वारा संशोधित नहीं किया जाएगा।

आप LPCWSTRएक स्ट्रिंग शाब्दिक रूप से L को प्रस्तुत करके एस को असाइन कर सकते हैं :LPCWSTR *myStr = L"Hello World";

LPC T STR और कोई अन्य T प्रकार, अपनी परियोजना के लिए यूनिकोड सेटिंग्स के आधार पर एक स्ट्रिंग प्रकार लें। यदि _UNICODEआपकी परियोजना के लिए परिभाषित किया गया है, तो टी प्रकार का उपयोग व्यापक चरित्र रूपों के समान है, अन्यथा एएनएसआई रूपों। उपयुक्त फ़ंक्शन को इस तरह भी कहा जाएगा: इस परिभाषा के अनुसार या इसके आधार पर FindWindowExपरिभाषित किया गया है ।FindWindowExAFindWindowExW


7

यह एक स्थिर, विस्तृत स्ट्रिंग (यानी विस्तृत वर्णों का एक स्ट्रिंग) के लिए एक लंबा सूचक है।

चूंकि यह एक विस्तृत स्ट्रिंग है, आप अपने निरंतर रूप को बनाना चाहते हैं जैसे L"TestWindow":। मैं aया तो इंटरमीडिएट नहीं बनाऊंगा , मैं सिर्फ L"TestWindow"पैरामीटर के लिए पास करूंगा :

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

यदि आप उचित रूप से सही होना चाहते हैं, तो एक "LPCTSTR" एक "टेक्स्ट" स्ट्रिंग है - एक यूनिकोड बिल्ड में एक विस्तृत स्ट्रिंग और एक ANSI बिल्ड में एक संकीर्ण स्ट्रिंग है, इसलिए आपको उपयुक्त मैक्रो का उपयोग करना चाहिए:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

कुछ लोगों को कोड के उत्पादन के बारे में परवाह है जो यूनिकोड और एएनएसआई चरित्र सेट दोनों के लिए संकलित कर सकते हैं, और अगर आपको इसे वास्तव में सही ढंग से काम करने के लिए नहीं मिल रहा है, तो थोड़ा लाभ के लिए काफी अतिरिक्त काम हो सकता है। इस विशेष मामले में, बहुत अधिक अतिरिक्त काम नहीं है, लेकिन यदि आप स्ट्रिंग्स में हेरफेर कर रहे हैं, तो स्ट्रिंग हेरफेर मैक्रो का एक पूरा सेट है जो सही कार्यों का समाधान करता है।


1
यदि आपको _T (MAIN_WINDOW) जैसे स्थिरांक का उपयोग कर रहे हैं, तो अन्यथा आपको LMAIN_WINDOW विफल हो जाएगी, तो आपको उचित रूप से सही होने की आवश्यकता नहीं है।
रोडोल्फो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.