LPCWSTR ย่อมาจากอะไรและควรจัดการอย่างไร?


91

ก่อนอื่นมันคืออะไรกันแน่? ฉันเดาว่ามันเป็นตัวชี้ (LPC หมายถึงค่าคงที่ตัวชี้แบบยาว) แต่ "W" หมายถึงอะไร? เป็นตัวชี้เฉพาะไปยังสตริงหรือตัวชี้ไปยังสตริงเฉพาะหรือไม่? ตัวอย่างเช่นฉันต้องการปิดหน้าต่างชื่อ "TestWindow"

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

รหัสนี้ผิดกฎหมายและใช้ไม่ได้เนื่องจาก const char [6] ไม่สามารถแปลงเป็น CONST WCHAR ได้ ฉันไม่เข้าใจเลย ฉันต้องการทำความเข้าใจที่ชัดเจนเกี่ยวกับ LPCWSTR, LPCSTR, LPSTR เหล่านี้ ฉันพยายามค้นหาบางสิ่ง แต่ฉันก็สับสนมากขึ้น ที่ไซต์ msdn FindWindowExถูกประกาศเป็น

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

ดังนั้นพารามิเตอร์สุดท้ายคือ LPCSTR และคอมไพเลอร์ต้องการ LPCWSTR กรุณาช่วย.


61
ยินดีต้อนรับสู่ Microsoft Hungarian notation
Thomas Matthews

2
มันทำให้เป็นเอกสารที่อ่านได้มากขึ้นจริง ๆ แล้วสงสารทุกสิ่งทุกอย่างเกี่ยวกับมัน sux
Matt Joiner

1
@Thomas: นี่คือไม่ได้สิ่งที่ไมโครซอฟท์ (หรือ Simonyi สำหรับเรื่องที่) ครั้งแรกที่ติดแท็กฮังการีโน้ต เป็นผลมาจากอุบัติเหตุไม่มากก็น้อยเมื่อกลุ่มเอกสารตัดสินใจใช้การปรับปรุง "ความสามารถในการอ่าน" บางประการ พวกเขาไม่ใช่นักพัฒนาดังนั้นการเปลี่ยนแปลงจึงไม่ได้ผล ข้อมูลพื้นฐานมีอยู่ที่สัญลักษณ์ Hugarian - ถึงตาของฉันแล้ว :)
IInspectable

@IInspectable: ลิงค์เสีย
Nicolas Raoul

1
@IInspectable: ลิงค์การทำงานคือblogs.msdn.microsoft.com/larryosterman/2004/06/22/…
Julius Bullinger

คำตอบ:


139

LPCWSTRย่อมาจาก "Long Pointer to Constant Wide String" ใน W ย่อมาไวและหมายความว่าสตริงถูกเก็บไว้ในตัวละคร 2 charไบต์เทียบกับปกติ ทั่วไปสำหรับรหัส C / C ++ ใด ๆ ที่ต้องจัดการกับสตริงที่ไม่ใช่ ASCII เท่านั้น =

ในการรับสตริงตัวอักษร C ปกติเพื่อกำหนดให้กับ a LPCWSTRคุณต้องนำหน้าด้วย L

LPCWSTR a = L"TestWindow";

8
เพียงเพื่อขยายส่วน 'LONG' คืออาการเมาค้างจากหน้าต่าง 16 บิตและสามารถเพิกเฉยได้ (ยกเว้นคุณต้องการมันในชื่อ)
Martin Beckett

14
"อาการเมาค้างจาก Windows 16 บิต" - แน่นอน!
John Dibling

4
ไม่ถูกต้อง มันเป็นและเป็นตัวชี้ 32 บิต ไม่มีพอยน์เตอร์ 16 บิตแบบ "สั้น" อีกต่อไปดังนั้นคุณสามารถบ่นได้หากคุณหาไฟล์SPCWSTR.
MSalters

51
พระเจ้า. แอล ??? ตัวอักษร L? ไม่ใช่ฟังก์ชัน L ()? L ธรรมดา ๆ ? ใครห่าขึ้นมา ??
john ktejik

13
@ user396483 เป็นเรื่องปกติในหลายภาษาที่จะเพิ่มคำนำหน้าและคำต่อท้ายให้กับค่าคงที่เพื่อเปลี่ยนวิธีการแสดงโดยไม่เปลี่ยนความหมายเป็นมนุษย์ ตัวอย่างเช่น36ULใน C # จะเหมือนกับ(ulong)36(ulong เป็นจำนวนเต็ม 64 บิตที่ไม่ได้ลงชื่อ) @สามารถใช้ในภาษาเดียวกับคำนำหน้าสำหรับสตริงโดยเปลี่ยนวิธีการแยกวิเคราะห์เล็กน้อย
Zenexer

12

LPCWSTRเทียบเท่ากับwchar_t const *. เป็นตัวชี้ไปยังสตริงอักขระแบบกว้างซึ่งจะไม่ถูกแก้ไขโดยการเรียกใช้ฟังก์ชัน

คุณสามารถกำหนดให้กับLPCWSTRs ได้โดยการใส่ L ล่วงหน้าเป็นสตริงลิเทอรัล:LPCWSTR *myStr = L"Hello World";

LPC T STR และTประเภทอื่น ๆใช้ประเภทสตริงขึ้นอยู่กับการตั้งค่า Unicode สำหรับโครงการของคุณ หาก_UNICODEกำหนดไว้สำหรับโปรเจ็กต์ของคุณการใช้ประเภท T จะเหมือนกับรูปแบบอักขระแบบกว้างหรือแบบฟอร์ม Ansi ฟังก์ชันที่เหมาะสมจะถูกเรียกด้วยวิธีนี้: FindWindowExถูกกำหนดเป็นFindWindowExAหรือFindWindowExWขึ้นอยู่กับคำจำกัดความนี้


7

เป็นตัวชี้แบบยาวไปยังสตริงที่มีค่าคงที่และกว้าง (เช่นสตริงของอักขระแบบกว้าง)

L"TestWindow"เนื่องจากเป็นสตริงกว้างคุณต้องการที่จะทำให้รูปลักษณ์ของคุณคงชอบ ฉันจะไม่สร้างตัวกลางaเช่นกันฉันแค่ส่งL"TestWindow"พารามิเตอร์:

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

หากคุณต้องการแก้ไขในเชิงอวดอ้าง "LPCTSTR" คือสตริง "ข้อความ" ซึ่งเป็นสตริงแบบกว้างในบิวด์ Unicode และสตริงแคบในโครงสร้าง ANSI ดังนั้นคุณควรใช้มาโครที่เหมาะสม:

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

มีเพียงไม่กี่คนที่สนใจเกี่ยวกับการผลิตโค้ดที่สามารถคอมไพล์สำหรับทั้งชุดอักขระ Unicode และ ANSI และหากคุณไม่ได้รับมันให้ทำงานอย่างถูกต้องอาจเป็นงานพิเศษเล็กน้อยเพื่อให้ได้ผลตอบแทนเพียงเล็กน้อย ในกรณีนี้ไม่มีงานพิเศษมากนัก แต่ถ้าคุณกำลังจัดการกับสตริงจะมีมาโครการจัดการสตริงทั้งชุดที่แก้ไขฟังก์ชันที่ถูกต้อง


1
คุณไม่จำเป็นต้องเป็นคนอวดรู้ใช้ _T () หากคุณใช้ค่าคงที่เช่น _T (MAIN_WINDOW) มิฉะนั้น LMAIN_WINDOW จะล้มเหลว
Rodolfo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.