क्या अंतर है LPCSTR
, LPCTSTR
और LPTSTR
?
हमें स्ट्रिंग को LV
/ _ITEM
संरचना चर में बदलने के लिए ऐसा करने की आवश्यकता क्यों है pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
क्या अंतर है LPCSTR
, LPCTSTR
और LPTSTR
?
हमें स्ट्रिंग को LV
/ _ITEM
संरचना चर में बदलने के लिए ऐसा करने की आवश्यकता क्यों है pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
जवाबों:
अपने प्रश्न के पहले भाग का उत्तर देने के लिए:
LPCSTR
एक कास्ट स्ट्रिंग के लिए एक सूचक है (एलपी का मतलब है लॉन्ग पॉइंटर )
LPCTSTR
एक const TCHAR
स्ट्रिंग के लिए एक संकेतक है , ( TCHAR
UNICODE को आपकी परियोजना में परिभाषित किया गया है या नहीं, इस आधार पर एक विस्तृत वर्ण या चार्ट है)
LPTSTR
एक (नॉन-कास्ट) TCHAR
स्ट्रिंग के लिए एक संकेतक है
व्यवहार में जब अतीत में इन के बारे में बात करते हैं, तो हमने "पॉइंटर को" सादगी के लिए वाक्यांश के लिए छोड़ दिया है, लेकिन जैसा कि लपट-दौड़-इन-ऑर्बिट द्वारा उल्लेख किया गया है, वे सभी संकेत हैं।
यह C ++ स्ट्रिंग्स का वर्णन करने वाला एक बेहतरीन कोडप्रोजेक्ट लेख है (विभिन्न प्रकारों की तुलना करने वाले चार्ट के लिए नीचे २/३ देखें)
extern "C"
। इसके अलावा, हाँ, यह निश्चित रूप से या तो "पॉइंटर" बिट या सी स्ट्रिंग के रूप में विशिष्ट विवरण की आवश्यकता होनी चाहिए।
जल्दी और गन्दी:
LP
== एल ओंग पी ओइंटर। बस पॉइंटर या चार सोचो *
C
= सी onst, इस मामले में, मुझे लगता है कि उनका मतलब है कि चरित्र स्ट्रिंग एक कास्ट है, न कि पॉइंटर कांस्टेबल।
STR
है स्ट्रिंग
T
एक विस्तृत चरित्र या चार (TCHAR) संकलन विकल्पों के आधार पर के लिए है।
char
: 8-बिट वर्ण - अंतर्निहित C / C ++ डेटा प्रकारCHAR
: alias of char
- विंडोज डेटा प्रकारLPSTR
: ( एल ओंग पी ओइंटर) की अशक्त-समाप्त स्ट्रिंगCHAR
LPCSTR
: ( एल ओंग पी ओइंटर) का निरंतर अशक्त-समाप्त स्ट्रिंगCHAR
wchar_t
: 16-बिट वर्ण - अंतर्निहित C / C ++ डेटा प्रकारWCHAR
: alias of wchar_t
- विंडोज डेटा प्रकारLPWSTR
: ( एल ओंग पी ओइंटर) की अशक्त-समाप्त स्ट्रिंगWCHAR
LPCWSTR
: ( एल ओंग पी ओइंटर) का निरंतर अशक्त-समाप्त स्ट्रिंगWCHAR
UNICODE
परिभाषित पर निर्भर करता हैTCHAR
: WCHAR
यदि उर्फ को परिभाषित किया जाता है, तो अन्य ; अन्यथाCHAR
LPTSTR
: ( एल ओंग पी ओइंटर) की अशक्त-समाप्त स्ट्रिंगTCHAR
LPCTSTR
: ( एल ओंग पी ओइंटर) का निरंतर अशक्त-समाप्त स्ट्रिंगTCHAR
इसलिए
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ टेक्स्ट चार ( संग्रह। )
जॉन और टिम के जवाब में जोड़ना।
जब तक आप Win98 के लिए कोडिंग नहीं कर रहे हैं, आपके आवेदन में उपयोग किए जा रहे 6+ स्ट्रिंग प्रकारों में से केवल दो हैं
LPWSTR
LPCWSTR
बाकी एएनएसआई प्लेटफॉर्म या दोहरे संकलन का समर्थन करने के लिए हैं। वे आज उतने प्रासंगिक नहीं हैं जितने पहले हुआ करते थे।
std::string
क्योंकि यह अभी भी एक ASCII आधारित स्ट्रिंग है और std::wstring
इसके बजाय पसंद करते हैं।
*A
UTAP-8 कोड पृष्ठ के साथ WinAPI के संस्करणों को बनाने पर काम कर रहा है , तो वे अचानक बहुत अधिक प्रासंगिक हो जाते हैं। ; पी
अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए, आपको चीजों को करने की आवश्यकता है
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
क्योंकि MS की LVITEM
संरचना में LPTSTR
a, यानी एक उत्परिवर्ती T- स्ट्रिंग सूचक है, न कि a LPCTSTR
। आप जो कर रहे हैं, वह है
1) कन्वर्ट string
(एक CString
अनुमान पर) एक में LPCTSTR
(जो व्यवहार में इसका मतलब है कि केवल पढ़ने के लिए पॉइंटर के रूप में इसके चरित्र बफर का पता प्राप्त करना)
2) उस रीड-ओनली पॉइंटर को राइट-पॉइंटर में कन्वर्ट करके उसकी const
-नेस को दूर कर दें ।
यह निर्भर करता है कि क्या dispinfo
है या नहीं, इस बात की संभावना है कि आपके है के लिए प्रयोग किया जाता है ListView
कॉल करने की कोशिश कर खत्म हो जाएगा लिखने कि के माध्यम से pszText
। यदि ऐसा होता है, तो यह संभावित रूप से बहुत बुरी बात है: आखिरकार आपको एक रीड-ओनली पॉइंटर दिया गया और फिर इसे राइट करने योग्य माना गया: हो सकता है कि केवल पढ़ने-लिखने का कारण हो!
अगर यह CString
आप के साथ काम कर रहे हैं तो आपके पास उपयोग करने का विकल्प है string.GetBuffer()
- जो जानबूझकर आपको एक लेखन योग्य बनाता है LPTSTR
। आपको तब कॉल करने के लिए याद रखना होगा ReleaseBuffer()
अगर स्ट्रिंग बदल जाती है। या आप एक स्थानीय अस्थायी बफर आवंटित कर सकते हैं और स्ट्रिंग को वहां कॉपी कर सकते हैं।
99% इस समय अनावश्यक होगा और LPCTSTR
एक के रूप में इलाज LPTSTR
करना काम करेगा ... लेकिन एक दिन, जब आप कम से कम इसकी उम्मीद करते हैं ...
xxx_cast<>()
इसके बजाय उपयोग करना चाहिए।
xxx_cast<>
दो अलग-अलग ब्रैकेट-आधारित कास्टिंग शैलियों को मिश्रण करने के बजाय निश्चित रूप से उपयोग किया जाएगा !