LPCTSTR क्या है?


37

क्या है LPCTSTRऔर LPCTSTR(उदाहरण के लिए की तरह HDC) और क्या इसके लिए खड़े करता है?


5
क्या आपने इसे देखा है: msdn.microsoft.com/en-us/library/aa300569%28v=vs.60%29.aspx ?
FrustratedWithFormsDesigner

3
यही कारण है कि हम सिर्फ Microsoft से प्यार करते हैं।
zxcdw

2
वे "प्रकार" हमेशा आश्चर्य प्रकट करते हैं, जैसे जब आप करते हैं LPCSTR p, q;और आप चाहते थे const char *p, *q;। क्या आप उन्हें इस्तेमाल करने से मना कर सकते हैं?
ott--

9
एक घृणा।
थॉमस ईडिंग

2
32-बिट एप्लिकेशन के 64 बिट पोर्टिंग के लिए इस तरह की शब्दावली का ज्ञान आवश्यक है
ओवरएक्सचेंज

जवाबों:


76

MSDN मंचों पर ब्रायन क्रेमर का उद्धरण

LPCTSTR= एल ओंग पी एक को ointer सी onst टी CHAR एसटीआर ing (चिंता मत करो, एक लंबे सूचक सूचक के रूप में एक ही है। वहाँ 16 बिट खिड़कियों के तहत संकेत के दो जायके थे।)

यहाँ तालिका है:

  • LPSTR = char*
  • LPCSTR = const char*
  • LPWSTR = wchar_t*
  • LPCWSTR = const wchar_t*
  • LPTSTR= char* or wchar_t*पर निर्भर करता है_UNICODE
  • LPCTSTR= const char* or const wchar_t*पर निर्भर करता है_UNICODE

29
हर बार जब मैं उस प्रकार का नाम देखता हूं तो मुझे लगता है कि मैं क्रिंग कर रहा हूं। इसके बारे में बस कुछ है जो मुझे असहज बनाता है। (+1 बीटीडब्ल्यू)
डोनल फैलो

2
मुझे इस तरह के पॉइंटर का उपयोग कब करना चाहिए?
फ्लोरियन मार्गाइन

@FlorianMargaine जब एक एपीआई आपको बताता है। बस तब तक 'उचित' प्रकारों का उपयोग करें
जेम्स

1
चेतावनी दी है, यहाँ के बारे में पता करने के लिए बहुत सारे चेतावनी हैं। wchar_t एक 16 बिट प्रकार है, लेकिन इसका उपयोग ucs2 और utf-16 दोनों इनकोडेड यूनिकोड वर्णों को संग्रहीत करने के लिए किया जा सकता है। utf-16 एकल पत्र को एनकोड करने के लिए कई wchar_t का उपयोग कर सकता है, ucs2 केवल यूनिकोड वर्ण के सबसेट का समर्थन करता है। आपको कौन से API फ़ंक्शन को कॉल करने की आवश्यकता है जो उपयोग किए गए एन्कोडिंग पर भी निर्भर करते हैं।
माइकल शॉ

2
सबसे बुरा DWORD है, जो एक 32 बिट डबल शब्द हुआ करता था, लेकिन आजकल एक 32 बिट आधा शब्द है :-)
gnasher729

6

TCHAR से संबंधित किसी भी प्रकार का उपयोग करने की कोई आवश्यकता नहीं है।

वे प्रकार, सभी संरचना प्रकार जो उनका उपयोग करते हैं, और सभी संबंधित कार्यों को एक ANSI या UNICODE संस्करण के संकलन समय पर मैप किया जाता है (आपकी परियोजना के कॉन्फ़िगरेशन के आधार पर)। एएनएसआई संस्करणों में आमतौर पर नाम के अंत में एक ए जोड़ा जाता है, और यूनिकोड संस्करण एक डब्ल्यू को जोड़ते हैं। यदि आप चाहें तो आप इनका स्पष्ट रूप से उपयोग कर सकते हैं। MSDN आवश्यक होने पर यह नोट करेगा, उदाहरण के लिए यह एक MessageBoxIndirectA और MessageBoxIndirectW फ़ंक्शन को यहाँ सूचीबद्ध करता है: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511/v=vs.85).aspx

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

यदि आप विंडोज 9x के बारे में परवाह नहीं करते हैं, तो मैं आपके प्रोजेक्ट को यूनीकोड ​​के रूप में कॉन्फ़िगर करने और TCHAR को WCHAR के समान मानता हूं। यदि आप चाहें तो आप स्पष्ट रूप से डब्ल्यू फ़ंक्शन और प्रकारों का उपयोग कर सकते हैं, लेकिन जब तक आप विंडोज 9x पर अपनी परियोजना को चलाने की योजना नहीं बनाते हैं, तब तक यह वास्तव में मायने नहीं रखता है।


0

ये प्रकार MSDN पर Windows डेटा प्रकारों में प्रलेखित हैं :

LPCTSTR

एक LPCWSTRअगर UNICODEपरिभाषित किया गया है, LPCSTRअन्यथा। अधिक जानकारी के लिए, स्ट्रिंग्स के लिए Windows डेटा प्रकार देखें।

यह प्रकार WinNT.h में निम्नानुसार घोषित किया गया है:

#ifdef UNICODE
 typedef LPCWSTR LPCTSTR; 
#else
 typedef LPCSTR LPCTSTR;
#endif

LPCWSTR

16-बिट यूनिकोड वर्णों के निरंतर अशक्त-स्ट्रिंग स्ट्रिंग के लिए एक सूचक। अधिक जानकारी के लिए, वर्ण द्वारा उपयोग किए गए वर्ण सेट देखें।

यह प्रकार WinNT.h में निम्नानुसार घोषित किया गया है:

typedef CONST WCHAR *LPCWSTR;

HDC

डिवाइस संदर्भ (DC) के लिए एक हैंडल ।

यह प्रकार WinDef.h में घोषित किया गया है:

typedef HANDLE HDC;

0

मुझे पता है कि यह सवाल कुछ समय पहले पूछा गया था और मैं सीधे सटीक मूल प्रश्न का उत्तर देने की कोशिश नहीं कर रहा हूं, लेकिन जैसा कि इस विशेष क्यू / ए की एक अच्छी रेटिंग है, मैं भविष्य के पाठकों के लिए यहां थोड़ा जोड़ना चाहूंगा। यह विशेष रूप से Win32 API typedefsऔर कैसे उन्हें समझने के साथ करना है।

अगर किसी ने विंडोज 95 के दौरान और विंडोज 7-8 से 32bit मशीनों के युग के दौरान किसी भी विंडोज प्रोग्रामिंग को कभी भी किया है, तो वे समझते हैं और जानते हैं कि Win32 APIयह भरा हुआ है typedefsऔर उनके कार्यों और संरचनाओं के बहुमत से भरा जाना है। उन पर बहुत भरोसा करते थे।


एक प्रदर्शन के रूप में देने के लिए यहां एक बुनियादी विंडोज़ कार्यक्रम है।

#include <Windows.h>

HWND ghMainWnd = 0;

bool InitWindowsApp( HINSTANCE, int show );
LRESULT CALLBACK WindowProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
int run();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int show ) {
    if ( !InitWindowsApp( hInstance, showCmd ) ) {
        return 0;
    }
    return run();
}

LRESULT CALLBACK WindowProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
    switch( msg ) {
        case WM_KEYDOWN: {
            if ( wParam == VK_ESCAPE ) {
                DestroyWindow( ghMainWnd );
            }
            return 0;
         }
         case WM_DESTROY: {
             PostQuitMessage(0);
             return 0;
         }
         default: {
             return DefWindowProc( hWnd, msg, wParam, lParam );
         }
    }
}

bool InitWindowsApp( HINSTANCE hInstance, int nCmdShow ) {

    WNDCLASSEX wc;

    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = WindowProc;
    wc.cbClsExtra       = NULL;
    wc.cbWndExtra       = NULL;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon( NULL, IDI_APPLICATION );
    wc.hIconSm          = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    wc.lpszMenuName     = NULL;
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName    = L"Basic Window";
    wc.cbSize           = sizeof( WNDCLASSEX);

    if ( !RegisterClassEx( &wc ) ) {
        MessageBox( NULL, L"Register Class FAILED", NULL, NULL );
        return false;
    }

    ghMainWnd = CreateWindow( 
        L"Basic Window",
        L"Win32Basic",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL, NULL,
        hInstance,
        NULL );
    if ( ghMainWnd == 0 ) {
        MessageBox( NULL, L"Window failed to create", L"Error", MB_OK );
        return false;
    }

    ShowWindow( ghMainWnd, nCmdShow );
    UpdateWindow( ghMainWnd );

    return true;    
}

int run() {
    MSG msg = {0};
    BOOL bReturn = 1;

    while( (bReturn = GetMessage( &msg, NULL, NULL, NULL)) != 0 ) {
        if ( bReturn == -1 ) {
            MessageBox( NULL, L"GetMessage FAILED", L"Error", MB_OK );
            break;
        } else {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    return (int)msg.wParam;
}

विंडोज़ एप्लिकेशन को रेंडर करने के लिए यह मुश्किल से पर्याप्त कोड है। बेसिक विंडो रेंडर करने के लिए नंगे न्यूनतम गुणों को इनिशियलाइज़ करने के लिए यह सबसे बेसिक सेटअप है और जैसा कि आप देख सकते हैं कि यह पहले से ही लोड typedefsहै Win32 api


चलिए WinMainऔर InitWindowsAppकार्यों को देखते हुए इसे तोड़ते हैं : पहली बात यह है कि फ़ंक्शंस के पैरामीटर HINSTANCEऔर PSTR:

WinMainएक HINSTANCEवस्तु को InitWindowsAppस्वीकार करता है जबकि दो HINSTANCEवस्तुओं को एक पीटीएस वस्तु या कुछ अन्य typedefस्ट्रिंग और एक इंट को स्वीकार करता है ।

मैं InitWindowsAppयहाँ फ़ंक्शन का उपयोग करूँगा क्योंकि यह दोनों फ़ंक्शन में ऑब्जेक्ट का विवरण देगा।

पहले HINSTANCEएक के रूप में परिभाषित किया गया है एच एक को andle उदाहरण और यह एक है कि सबसे अधिक आवेदन के लिए इस्तेमाल किया है। दूसरा एक HANDLEपिछला इंस्टालेशन के लिए एक और है जो अब शायद ही कभी इस्तेमाल किया जाता है। यह WinMain()फ़ंक्शन के हस्ताक्षर के लिए चारों ओर रखा गया था ताकि फ़ंक्शन के हस्ताक्षर को बदलना न पड़े जो प्रक्रिया में पहले से मौजूद कई अनुप्रयोगों को तोड़ देगा। तीसरे पैरामीटर एक है पी एक को ointer एसटीआर आईएनजी।

तो हमें अपने आप से पूछना होगा कि क्या है HANDLE? यदि हम Win32 APIयहां दिए गए डॉक्स में देखें : विंडोज डेटा प्रकार हम आसानी से इसे देख सकते हैं और देख सकते हैं कि इसे इस प्रकार परिभाषित किया गया है:

किसी वस्तु को संभालना। यह प्रकार WinNT.h में निम्नानुसार घोषित किया गया है:

typedef PVOID HANDLE; 

अब हमारे पास एक और है typedef। एक क्या है PVOID? खैर यह स्पष्ट होना चाहिए लेकिन यह देखने के लिए कि एक ही तालिका में ...

किसी प्रकार का एक सूचक। यह WinNT.h में घोषित किया गया है

typedef void *PVOID;

A HANDLEका उपयोग Win32 APIचीजों में कई वस्तुओं को घोषित करने के लिए किया जाता है जैसे:

  • HKEY - एक रजिस्ट्री कुंजी के लिए एक संभाल। WinDef.h में घोषित किया गया
    • typdef HANDLE HKEY;
  • HKL - एक स्थानीय पहचानकर्ता को संभालना। WinDef.h में घोषित किया गया
    • typdef HANDLE HKL;
  • HMENU - एक मेनू के लिए एक संभाल। WinDef.h में घोषित किया गया
    • typdef HANDLE HMENU;
  • HPEN - कलम को संभालना। WinDef.h में घोषित किया गया
    • typedef HANDLE HPEN;
  • HWND - एक खिड़की के लिए एक संभाल। WinDef.h में घोषित किया गया
    • typedef HANDLE HWND;
  • ... और इतने पर जैसे HBRUSH, HCURSOR, HBITMAP, HDC, HDESK, आदि

ये सभी typedefsएक का उपयोग करते हुए घोषित किए गए हैं typedefजो एक है HANDLEऔर HANDLEस्वयं को एक typedefसे घोषित किया गया है PVOIDजो कि एक से एक भी typedefहै void pointer


इसलिए जब बात आती है LPCTSTRतो हम पा सकते हैं कि एक ही डॉक्स में:

यह एक के रूप में परिभाषित किया गया है LPCWSTR, तो UNICODEया परिभाषित किया गया है एक LPCSTRअन्यथा।

#ifdef UNICODE
  typedef LPCWSTR LPCSTR;
#else
  typedef LPCSTR LPCTSTR;
#endif

तो उम्मीद है कि यह एक गाइड के रूप में मदद करेगा कि typedefsविशेष रूप से विंडोज डेटा प्रकारों के उपयोग को कैसे समझा जाए Win32 API


HANDLEयदि आप STRICTमैक्रो को सक्रिय करते हैं तो हैंडल के कई प्रकार केवल उपनाम होने की तुलना में अधिक दृढ़ता से टाइप किए जाते हैं । मुझे लगता है कि नए प्रोजेक्ट्स में डिफॉल्ट है।
सेबेस्टियन रेडल

@ एसबेस्टियनरेडल यह हो सकता है; लेकिन मैं एपीआई की बहुत अधिक गहराई और भाषा के दृढ़ता से टाइप किए गए पहलुओं की कठोरता में जाने की कोशिश नहीं कर रहा था। यह Win32 एपीआई और इसके डेटा प्रकारों के ओवरव्यू के उपयोग से अधिक था ...
फ्रांसिस कुगलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.