2009-03-20 15 views
6

मैं एक (बहुत) सरल Win32 जीयूआई कार्यक्रम बनाने के लिए कोशिश कर रहा हूँ, लेकिन किसी कारण संकलक के लिए (मैं कुलपति ++ 2008 एक्सप्रेस का उपयोग कर रहा) चाहता है मुझे मैन्युअल LPCWSTR के लिए हर स्ट्रिंग या चार * टाइपकास्ट करने के लिए:एलपीसीडब्ल्यूस्ट्रेट को कास्ट करें?

मैं हर बार जब मैं ऐसा करता हूं तो इस कंपाइलर त्रुटि को प्राप्त करें, उदाहरण के लिए मुझे "हैलो" और "नोट" के लिए यह त्रुटि मिलती है:

त्रुटि C2664: 'MessageBoxW': 'const char [22]' से पैरामीटर 2 को परिवर्तित नहीं कर सकता 'LPCWSTR'

कृपया मुझे बताओ कि मैं हर बार जब मैं यह कर डाली की जरूरत नहीं है ....

कोड यह रहा:

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, "Hello", "Note", MB_OK); 
    return 0; 
} 
+1

या, बस संदेशबॉक्स (NULL, "हैलो", "नोट", MB_OK) का आह्वान करें; – deemok

उत्तर

14

वीएस -2008 में नई परियोजनाओं के लिए डिफ़ॉल्ट यूनिकोड जागरूक अनुप्रयोगों का निर्माण करना है। आप या तो उस डिफ़ॉल्ट को बदल सकते हैं और एएनएसआई या MBCS क्षुधा (गुण> विन्यास गुण> जनरल> वर्ण सेट) का उपयोग करने के लिए वापस जाने के लिए, या इस तरह यूनिकोड स्ट्रिंग्स का उपयोग करें:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, L"Hello", L"Note", MB_OK); 
    return 0; 
} 

करो डाली नहीं अपने एलपीसीडब्लूस्ट्रेट के लिए तार क्योंकि इससे अपरिभाषित व्यवहार होगा! एक char wchar_t के समान नहीं है!

1

समस्या यह है कि आप यूनिकोड के लिए निर्माण कर रहे हैं और गैर-यूनिकोड तारों को पार कर रहे हैं।

प्रयास करें:

MessageBox(NULL, L"Hello", L"Note", MB_OK); 

या एएनएसआई/MBCS के लिए अपने निर्माण की स्थापना की या TCHARs (जो एक दर्द कर रहे हैं) का उपयोग करते हुए इस पर गौर।

1

Win32 सी प्रोग्रामिंग की मेरी यादें धुंधला कर रहे हैं, लेकिन जैसा कि मुझे याद है, तो आप इस मैक्रो में अपने स्ट्रिंग शाब्दिक लपेटकर द्वारा शुरू करने की आवश्यकता:

_T ("mystring")

जब आप यूनिकोड का निर्माण, यह एक यूनिकोड स्ट्रिंग में परिवर्तित हो जाएगा।

यदि आप केवल यूनिकोड बनाते हैं, या आप सुनिश्चित हैं कि आप केवल यूनिकोड में एक विशेष स्ट्रिंग को संभालने वाले हैं, तो आप एल "मार्कर का उपयोग कर सकते हैं, जो _T मैक्रो कवर के तहत करता है।

आपको tchar.h शीर्षलेख शामिल करने की आवश्यकता हो सकती है।

Win32 प्रोग्रामिंग करते समय, मैं आम तौर पर तारों को टीसीएचएआर * एसजे के रूप में घोषित करता हूं ताकि चीजें Win9x के साथ-साथ एनटी/विन 2 के/एक्सपी पर काम कर सकें। (वहां अन्य सुविधा मैक्रोज़ भी हैं जैसे कि एलपीटीस्ट्र और इसी तरह, और एमएफसी में मामलों के लिए कुछ आसान रूपांतरण मैक्रोज़ होते हैं जब आपको वास्तव में एएसआई और यूनिकोड के बीच विशिष्ट एपीआई कॉल करने की आवश्यकता होती है)।

0

जैसा कि अन्य पोस्टों ने कहा है, आप एक यूनिकोड एप्लिकेशन बना रहे हैं। आप प्रोजेक्ट सेटिंग्स में यूनिकोड प्रोजेक्ट पर और से स्विच कर सकते हैं (इसे "डीबग" और "रिलीज" कॉन्फ़िगरेशन दोनों के लिए सेट करना न भूलें।

L"Some static string" 

चार [] तार के लिए है वहाँ एक विधि mbstowcs_s, जो मोटे तौर इस तरह प्रयोग किया जाता है:

आप इसका उपयोग करना चाहते हैं, तो आप एल के साथ अपने सभी स्थिर तार पहले जोड़ें करना होगा

std::string str; // the string you want to convert 

WCHAR wstr[128]; 
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR); 
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE); 

इस तरह मैंने इसे अपनी परियोजनाओं में से एक में उपयोग किया। सटीक उपयोग के लिए MSDN देखें।

संबंधित मुद्दे