LPCWSTR là viết tắt của gì và nó nên được xử lý như thế nào?


91

Trước hết, nó chính xác là gì? Tôi đoán nó là một con trỏ (LPC có nghĩa là hằng số con trỏ dài), nhưng "W" có nghĩa là gì? Nó là một con trỏ cụ thể đến một chuỗi hay một con trỏ tới một chuỗi cụ thể? Ví dụ: tôi muốn đóng một Cửa sổ có tên "TestWindow".

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

Mã không hợp lệ và nó không hoạt động vì const char [6] không thể chuyển đổi thành CONST WCHAR. Tôi không hiểu gì cả. Tôi muốn hiểu rõ về tất cả các LPCWSTR, LPCSTR, LPSTR này. Tôi đã cố gắng tìm kiếm thứ gì đó, tuy nhiên tôi càng bối rối hơn. Tại trang msdn FindWindowExđược khai báo là

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

Vì vậy, tham số cuối cùng là LPCSTR và trình biên dịch yêu cầu LPCWSTR. Xin vui lòng giúp đỡ.


59
Chào mừng bạn đến với ký hiệu tiếng Hungary của Microsoft.
Thomas Matthews,

2
nó thực sự làm cho tài liệu dễ đọc hơn, xin lỗi mọi thứ khác về nó sux.
Matt Joiner

1
@Thomas: Đây không phải là những gì Microsoft (hoặc Simonyi cho vấn đề đó) ban đầu gắn thẻ Hungarian Notation . Nó ít nhiều là kết quả của một tai nạn, khi nhóm tài liệu quyết định thực hiện một số cải tiến "khả năng đọc". Họ không phải là nhà phát triển và do đó, những thay đổi không phải là duyên dáng. Thông tin cơ bản có sẵn tại ký hiệu Hugarian - bây giờ đến lượt tôi :)
IInspectable

@IInspectable: Liên kết bị hỏng
Nicolas Raoul

1
@IInspectable: Liên kết làm việc là blog.msdn.microsoft.com/larryosterman/2004/06/22/…
Julius Bullinger

Câu trả lời:


137

LPCWSTRlà viết tắt của "Long Pointer to Constant Wide String". W là viết tắt của Wide và có nghĩa là chuỗi được lưu trữ trong một ký tự 2 byte so với thông thường char. Phổ biến cho bất kỳ mã C / C ++ nào phải xử lý các chuỗi chỉ không phải ASCII. =

Để có được một chuỗi ký tự C bình thường để gán cho a LPCWSTR, bạn cần thêm tiền tố L

LPCWSTR a = L"TestWindow";

8
Chỉ để mở rộng - phần 'DÀI' là một sự nôn nao từ các cửa sổ 16bit và có thể bị bỏ qua (ngoại trừ bạn cần nó trong tên)
Martin Beckett

14
"nôn nao từ Windows 16bit" - Đó là điều chắc chắn!
John Dibling

4
Không, nó chính xác. Nó đã và là một con trỏ 32 bit. Không còn con trỏ 16 bit "ngắn" nữa, vì vậy bạn có thể phàn nàn nếu bạn quản lý để tìm thấy a SPCWSTR.
MSalters

50
Chúa tôi. L ??? Chữ cái L? Thậm chí không phải là một hàm, L ()? Chỉ đơn giản là L? Ai đã nghĩ ra điều đó ??
john ktejik

12
@ user396483 Thông thường trong nhiều ngôn ngữ, việc thêm tiền tố và hậu tố vào hằng số để thay đổi cách chúng được biểu diễn mà không thay đổi ý nghĩa của chúng đối với con người. Ví dụ, 36ULtrong C # giống như (ulong)36(kéo dài là một số nguyên 64-bit không dấu). @có thể được sử dụng trong cùng một ngôn ngữ làm tiền tố cho chuỗi, thay đổi cách chúng được phân tích cú pháp một chút.
Zenexer

12

LPCWSTRtương đương với wchar_t const *. Nó là một con trỏ đến một chuỗi ký tự rộng sẽ không bị sửa đổi bởi lệnh gọi hàm.

Bạn có thể gán cho LPCWSTRs bằng cách thêm chữ L vào một chuỗi:LPCWSTR *myStr = L"Hello World";

LPC T STR và bất kỳ loại T nào khác, lấy một loại chuỗi tùy thuộc vào cài đặt Unicode cho dự án của bạn. Nếu _UNICODEđược xác định cho dự án của bạn, thì việc sử dụng các kiểu T giống như các dạng ký tự rộng, nếu không thì các dạng Ansi. Hàm thích hợp cũng sẽ được gọi theo cách này: FindWindowExđược định nghĩa theo FindWindowExAhoặc FindWindowExWtùy thuộc vào định nghĩa này.


7

Nó là một con trỏ dài đến một chuỗi rộng, không đổi (tức là một chuỗi các ký tự rộng).

Kể từ đó là một chuỗi rộng, bạn muốn thực hiện cái nhìn liên tục của bạn như: L"TestWindow". Tôi cũng sẽ không tạo trung gian a, tôi chỉ chuyển L"TestWindow"cho tham số:

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

Nếu bạn muốn đúng về mặt cơ bản, "LPCTSTR" là một chuỗi "văn bản" - một chuỗi rộng trong bản dựng Unicode và một chuỗi hẹp trong bản dựng ANSI, vì vậy bạn nên sử dụng macro thích hợp:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

Mặc dù vậy, rất ít người quan tâm đến việc tạo ra mã có thể biên dịch cho cả bộ ký tự Unicode và ANSI, và nếu bạn không làm cho nó thực sự hoạt động chính xác thì có thể tốn rất nhiều công sức để thu được ít lợi nhuận. Trong trường hợp cụ thể này, không có nhiều công việc bổ sung, nhưng nếu bạn đang thao tác chuỗi, có một tập hợp toàn bộ các macro thao tác chuỗi giải quyết các chức năng chính xác.


1
bạn không cần phải chính xác về cơ sở, hãy sử dụng _T () nếu bạn đang sử dụng các hằng số như _T (MAIN_WINDOW) nếu không LMAIN_WINDOW sẽ không thành công.
Rodolfo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.