Apa kepanjangan dari LPCWSTR dan bagaimana seharusnya penanganannya?

91

Pertama-tama, apa itu sebenarnya? Saya kira ini adalah sebuah pointer (LPC berarti konstanta pointer panjang), tapi apa artinya "W"? Apakah itu penunjuk khusus ke string atau penunjuk ke string tertentu? Misalnya saya ingin menutup Window bernama "TestWindow".

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

Kode ini ilegal dan tidak berfungsi karena const char [6] tidak dapat dikonversi ke CONST WCHAR. Saya tidak mengerti sama sekali. Saya ingin mendapatkan pemahaman yang jelas tentang semua LPCWSTR, LPCSTR, LPSTR ini. Saya mencoba mencari sesuatu, namun saya semakin bingung. Di situs msdn FindWindowExdideklarasikan sebagai

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

Jadi parameter terakhir adalah LPCSTR, dan permintaan compiler pada LPCWSTR. Tolong bantu.

lhj7362
sumber
59
Selamat datang di notasi Microsoft Hungaria.
Thomas Matthews
2
itu sebenarnya membuat dokumentasi jauh lebih mudah dibaca, kasihan segala sesuatu tentang itu sux.
Matt Joiner
1
@ Thomas: Ini bukanlah apa yang awalnya ditandai oleh Microsoft (atau Simonyi) sebagai Notasi Hongaria . Ini kurang lebih merupakan hasil dari kecelakaan, ketika kelompok dokumentasi memutuskan untuk melakukan beberapa perbaikan "keterbacaan". Mereka bukanlah pengembang dan akibatnya perubahan tersebut tidak anggun. Informasi latar belakang tersedia di notasi Hugarian - giliranku sekarang :)
IInspectable
@IInspectable: Tautan rusak
Nicolas Raoul
1
@IInspectable: Tautan kerja adalah blogs.msdn.microsoft.com/larryosterman/2004/06/22/…
Julius Bullinger

Jawaban:

137

LPCWSTRsingkatan dari "Long Pointer to Constant Wide String". W singkatan dari Wide dan berarti bahwa string disimpan dalam karakter 2 byte vs. normalchar . Umum untuk semua kode C / C ++ yang harus berurusan dengan string khusus non-ASCII. =

Untuk mendapatkan string literal C normal untuk ditetapkan ke a LPCWSTR, Anda perlu mengawalnya dengan L.

LPCWSTR a = L"TestWindow";
JaredPar
sumber
8
Hanya untuk memperluas - bagian 'PANJANG' adalah penghilang rasa sakit dari jendela 16bit dan dapat diabaikan (kecuali jika Anda membutuhkannya atas nama)
Martin Beckett
14
"mabuk dari Windows 16bit" - Itu pasti!
John Dibling
4
Tidak, itu benar. Itu dan merupakan penunjuk 32 bit. Tidak ada lagi pointer 16 bit "pendek", jadi Anda bisa mengeluh jika Anda berhasil menemukan file SPCWSTR.
MSalters
50
Tuhanku. L ??? Huruf L? Bahkan bukan sebuah fungsi, L ()? L biasa saja? Siapa yang datang dengan itu ??
john ktejik
12
@ user396483 Sudah umum dalam banyak bahasa untuk menambahkan prefiks dan sufiks ke konstanta untuk mengubah cara mereka direpresentasikan, tanpa mengubah artinya menjadi manusia. Misalnya, 36ULdi C # sama dengan (ulong)36(ulong adalah integer 64-bit unsigned). @dapat digunakan dalam bahasa yang sama sebagai awalan untuk string, mengubah sedikit penguraiannya.
Zenexer
12

LPCWSTR setara dengan wchar_t const * . Ini adalah penunjuk ke string karakter lebar yang tidak akan diubah oleh pemanggilan fungsi.

Anda dapat menetapkan ke LPCWSTRs dengan menambahkan L ke string literal:LPCWSTR *myStr = L"Hello World";

LPC T STR dan tipe T lainnya , gunakan tipe string tergantung pada pengaturan Unicode untuk proyek Anda. Jika _UNICODEditentukan untuk proyek Anda, penggunaan tipe T sama dengan bentuk karakter lebar, sebaliknya bentuk Ansi. Fungsi yang sesuai juga akan disebut dengan cara ini: FindWindowExdidefinisikan sebagai FindWindowExAatau FindWindowExWtergantung pada definisi ini.

Matt Joiner
sumber
7

Ini adalah penunjuk panjang ke string lebar yang konstan (yaitu string karakter lebar).

Karena itu string lebar, Anda ingin membuat tampilan konstan seperti: L"TestWindow". Saya juga tidak akan membuat perantara a, saya hanya akan meneruskan L"TestWindow"parameter:

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

Jika Anda ingin mengoreksi secara pedantis, "LPCTSTR" adalah string "teks" - string lebar dalam build Unicode dan string sempit dalam build ANSI, jadi Anda harus menggunakan makro yang sesuai:

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

Hanya sedikit orang yang peduli tentang memproduksi kode yang dapat dikompilasi untuk set karakter Unicode dan ANSI, dan jika Anda tidak membuatnya benar-benar berfungsi dengan benar dapat menjadi pekerjaan ekstra untuk sedikit keuntungan. Dalam kasus khusus ini, tidak banyak pekerjaan tambahan, tetapi jika Anda memanipulasi string, ada seluruh rangkaian makro manipulasi string yang menyelesaikan fungsi yang benar.

Jerry Coffin
sumber
1
Anda tidak perlu benar secara pedantis, gunakan _T () jika Anda menggunakan konstanta seperti _T (MAIN_WINDOW) jika tidak, LMAIN_WINDOW akan gagal.
Rodolfo