2009-03-20 53 views
6

Tôi đang cố gắng tạo một chương trình Win32 GUI (rất đơn giản), nhưng vì một số lý do trình biên dịch (tôi đang sử dụng VC++ 2008 Express) muốn tôi tự định kiểu mỗi chuỗi hoặc char * cho LPCWSTR:Truyền tới LPCWSTR?

I nhận được lỗi biên dịch này mỗi khi tôi làm điều này, ví dụ tôi nhận được lỗi này cho "Hello" và "Note":

lỗi C2664: 'MessageBoxW': không thể chuyển đổi tham số 2 từ 'const char [22]' thành 'LPCWSTR'

Xin vui lòng cho tôi biết tôi không phải bỏ mỗi khi tôi làm điều này ....

Đây là mã:

#include <windows.h> 

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

hoặc, chỉ cần gọi MessageBoxA (NULL, "Hello", "Note", MB_OK); – deemok

Trả lời

14

Mặc định cho các dự án mới trong VS2008 là xây dựng các ứng dụng nhận thức UNICODE. Bạn có thể thay đổi mặc định đó và quay trở lại sử dụng ANSI hoặc MBCS ứng dụng (Properties-> Cấu hình Properties-> General-> Character Set), hoặc sử dụng Unicode Strings như thế này:

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

Do không đúc của bạn chuỗi đến LPCWSTR vì điều đó sẽ dẫn đến hành vi không xác định! Một char không giống như một wchar_t!

1

Vấn đề là bạn đang xây dựng cho UNICODE và đang chuyển các chuỗi không phải Unicode.

Hãy thử:

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

hoặc thiết lập xây dựng của bạn cho ANSI/MBCS hoặc nhìn vào sử dụng TCHARs (mà là một nỗi đau).

1

ký ức của tôi về lập trình Win32 C là mơ hồ, nhưng khi tôi gọi lại, bạn cần phải bắt đầu bằng cách gói xâu của bạn trong macro này:

_T ("mystring")

Khi bạn xây dựng unicode, điều này sẽ được chuyển thành chuỗi unicode.

Nếu bạn chỉ xây dựng unicode, hoặc bạn chắc chắn rằng bạn chỉ xử lý một chuỗi cụ thể trong unicode, bạn có thể sử dụng điểm đánh dấu L "", đó là những gì macro _T thực hiện dưới trang bìa.

Bạn có thể cần bao gồm tiêu đề tchar.h.

Khi thực hiện lập trình win32, tôi thường khai báo chuỗi là TCHAR * szWhatever sao cho mọi thứ hoạt động trên Win9x cũng như NT/Win2k/XP. (Có các macro tiện lợi khác trong đó cũng như LPTSTR và vân vân, và MFC chứa một số macro chuyển đổi dễ dàng cho các trường hợp khi bạn thực sự cần chuyển đổi giữa ansi và unicode để gọi các API cụ thể).

0

Như các bài đăng khác đã nói, bạn đang xây dựng một ứng dụng Unicode. Bạn có thể chuyển sang và từ dự án Unicode trong cài đặt dự án (đừng quên đặt nó cho cả cấu hình "Gỡ lỗi" và "Phát hành".

Nếu bạn muốn sử dụng nó, bạn sẽ phải thêm vào trước tất cả các chuỗi tĩnh của bạn với L:

L"Some static string" 

Đối với char [] strings có một phương pháp mbstowcs_s, được sử dụng gần như thế này:

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); 

Đây là cách tôi đã sử dụng nó trong một trong các dự án của mình. Để sử dụng chính xác, hãy tham khảo MSDN.

Các vấn đề liên quan