क्या है LPCTSTR
और LPCTSTR
(उदाहरण के लिए की तरह HDC
) और क्या इसके लिए खड़े करता है?
LPCSTR p, q;
और आप चाहते थे const char *p, *q;
। क्या आप उन्हें इस्तेमाल करने से मना कर सकते हैं?
क्या है LPCTSTR
और LPCTSTR
(उदाहरण के लिए की तरह HDC
) और क्या इसके लिए खड़े करता है?
LPCSTR p, q;
और आप चाहते थे const char *p, *q;
। क्या आप उन्हें इस्तेमाल करने से मना कर सकते हैं?
जवाबों:
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
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 पर अपनी परियोजना को चलाने की योजना नहीं बनाते हैं, तब तक यह वास्तव में मायने नहीं रखता है।
ये प्रकार 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;
मुझे पता है कि यह सवाल कुछ समय पहले पूछा गया था और मैं सीधे सटीक मूल प्रश्न का उत्तर देने की कोशिश नहीं कर रहा हूं, लेकिन जैसा कि इस विशेष क्यू / ए की एक अच्छी रेटिंग है, मैं भविष्य के पाठकों के लिए यहां थोड़ा जोड़ना चाहूंगा। यह विशेष रूप से 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
मैक्रो को सक्रिय करते हैं तो हैंडल के कई प्रकार केवल उपनाम होने की तुलना में अधिक दृढ़ता से टाइप किए जाते हैं । मुझे लगता है कि नए प्रोजेक्ट्स में डिफॉल्ट है।