क्या है 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*पर निर्भर करता है_UNICODELPCTSTR=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
LPCWSTR16-बिट यूनिकोड वर्णों के निरंतर अशक्त-स्ट्रिंग स्ट्रिंग के लिए एक सूचक। अधिक जानकारी के लिए, वर्ण द्वारा उपयोग किए गए वर्ण सेट देखें।
यह प्रकार 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मैक्रो को सक्रिय करते हैं तो हैंडल के कई प्रकार केवल उपनाम होने की तुलना में अधिक दृढ़ता से टाइप किए जाते हैं । मुझे लगता है कि नए प्रोजेक्ट्स में डिफॉल्ट है।