क्या अंतर है 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स्ट्रिंग के लिए एक संकेतक है , ( TCHARUNICODE को आपकी परियोजना में परिभाषित किया गया है या नहीं, इस आधार पर एक विस्तृत वर्ण या चार्ट है)
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यदि उर्फ को परिभाषित किया जाता है, तो अन्य ; अन्यथाCHARLPTSTR: ( एल ओंग पी ओइंटर) की अशक्त-समाप्त स्ट्रिंग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+ स्ट्रिंग प्रकारों में से केवल दो हैं
LPWSTRLPCWSTRबाकी एएनएसआई प्लेटफॉर्म या दोहरे संकलन का समर्थन करने के लिए हैं। वे आज उतने प्रासंगिक नहीं हैं जितने पहले हुआ करते थे।
std::stringक्योंकि यह अभी भी एक ASCII आधारित स्ट्रिंग है और std::wstringइसके बजाय पसंद करते हैं।
*AUTAP-8 कोड पृष्ठ के साथ WinAPI के संस्करणों को बनाने पर काम कर रहा है , तो वे अचानक बहुत अधिक प्रासंगिक हो जाते हैं। ; पी
अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए, आपको चीजों को करने की आवश्यकता है
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
क्योंकि MS की LVITEMसंरचना में LPTSTRa, यानी एक उत्परिवर्ती T- स्ट्रिंग सूचक है, न कि a LPCTSTR। आप जो कर रहे हैं, वह है
1) कन्वर्ट string(एक CStringअनुमान पर) एक में LPCTSTR(जो व्यवहार में इसका मतलब है कि केवल पढ़ने के लिए पॉइंटर के रूप में इसके चरित्र बफर का पता प्राप्त करना)
2) उस रीड-ओनली पॉइंटर को राइट-पॉइंटर में कन्वर्ट करके उसकी const-नेस को दूर कर दें ।
यह निर्भर करता है कि क्या dispinfoहै या नहीं, इस बात की संभावना है कि आपके है के लिए प्रयोग किया जाता है ListViewकॉल करने की कोशिश कर खत्म हो जाएगा लिखने कि के माध्यम से pszText। यदि ऐसा होता है, तो यह संभावित रूप से बहुत बुरी बात है: आखिरकार आपको एक रीड-ओनली पॉइंटर दिया गया और फिर इसे राइट करने योग्य माना गया: हो सकता है कि केवल पढ़ने-लिखने का कारण हो!
अगर यह CStringआप के साथ काम कर रहे हैं तो आपके पास उपयोग करने का विकल्प है string.GetBuffer()- जो जानबूझकर आपको एक लेखन योग्य बनाता है LPTSTR। आपको तब कॉल करने के लिए याद रखना होगा ReleaseBuffer()अगर स्ट्रिंग बदल जाती है। या आप एक स्थानीय अस्थायी बफर आवंटित कर सकते हैं और स्ट्रिंग को वहां कॉपी कर सकते हैं।
99% इस समय अनावश्यक होगा और LPCTSTRएक के रूप में इलाज LPTSTRकरना काम करेगा ... लेकिन एक दिन, जब आप कम से कम इसकी उम्मीद करते हैं ...
xxx_cast<>()इसके बजाय उपयोग करना चाहिए।
xxx_cast<>दो अलग-अलग ब्रैकेट-आधारित कास्टिंग शैलियों को मिश्रण करने के बजाय निश्चित रूप से उपयोग किया जाएगा !