LPCWSTR ne anlama geliyor ve nasıl ele alınmalıdır?


91

Her şeyden önce, tam olarak nedir? Sanırım bir işaretçi (LPC, uzun işaretçi sabiti anlamına gelir), ama "W" ne anlama geliyor? Bir dizgeye özel bir işaretçi mi yoksa belirli bir dizgeye işaretçi mi? Örneğin "TestWindow" adlı bir Pencereyi kapatmak istiyorum.

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

Bu kod yasal değil ve çalışmıyor çünkü const char [6] CONST WCHAR'a dönüştürülemiyor. Ben hiç anlamadım. Tüm bu LPCWSTR, LPCSTR, LPSTR hakkında net bir anlayış elde etmek istiyorum. Bir şey bulmaya çalıştım ama kafam daha da karıştı. Msdn sitesinde FindWindowExşu şekilde ilan edilir:

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

Dolayısıyla, son parametre LPCSTR'dir ve derleyici LPCWSTR'yi talep eder. Lütfen yardım et.


59
Microsoft Macar gösterimine hoş geldiniz.
Thomas Matthews

2
aslında çok daha okunabilir bir dokümantasyon sağlıyor, hakkındaki diğer her şeye yazık.
Matt Joiner

1
@Thomas: Bu, Microsoft'un (veya bu konuda Simonyi'nin ) Macar Notasyonu olarak etiketlediği şey değil . Dokümantasyon grubu bazı "okunabilirlik" iyileştirmeleri uygulamaya karar verdiğinde, bu aşağı yukarı bir kazanın sonucudur. Onlar geliştirici değillerdi ve dolayısıyla değişiklikler zarif değildi. Arka plan bilgileri Hugarian notasyonunda mevcuttur - şimdi sıra
bende

@IInspectable: Kırık bağlantı
Nicolas Raoul

Yanıtlar:


137

LPCWSTR"Uzun İşaretçiden Sabit Geniş Dize" anlamına gelir. W Geniş anlamına gelir ve dizenin normal yerine 2 baytlık bir karakterde saklandığı anlamına gelir char. Yalnızca ASCII olmayan dizelerle uğraşması gereken herhangi bir C / C ++ kodu için ortaktır. =

A'ya atanacak normal bir C değişmez dizesi elde etmek için LPCWSTR, onu L önekine eklemeniz gerekir.

LPCWSTR a = L"TestWindow";

8
Sadece genişletmek için - 'UZUN' kısmı 16 bitlik pencerelerden bir akşamdan kalma halidir ve göz ardı edilebilir (isminde ihtiyacınız varsa)
Martin Beckett

14
"16bit Windows'tan akşamdan kalma" - Kesinlikle!
John Dibling

4
Hayır, doğru. 32 bitlik bir işaretçi idi. Artık "kısa" 16 bitlik işaretçiler yok, bu nedenle a bulmayı başarırsanız şikayet edebilirsiniz SPCWSTR.
MSalters

50
Tanrım. L ??? L harfi? Bir fonksiyon bile değil mi, L ()? Sadece düz L mi? Bunu kim buldu?
john ktejik

12
@ user396483 Birçok dilde, anlamlarını bir insan olarak değiştirmeden temsil edilme biçimlerini değiştirmek için sabitlere önek ve sonek eklemek yaygındır. Örneğin, 36ULC # ile aynıdır (ulong)36(işaretsiz 64 bitlik bir tam sayıdır). @dizgelerin önekiyle aynı dilde kullanılabilir ve nasıl ayrıştırıldıklarını biraz değiştirebilir.
Zenexer

12

LPCWSTReşdeğerdir wchar_t const *. İşlev çağrısı tarafından değiştirilmeyecek geniş karakterli bir dizgeye işaretçi.

LPCWSTRBir dizge hazır bilgisinin başına bir L ekleyerek s atayabilirsiniz :LPCWSTR *myStr = L"Hello World";

LPC T STR ve diğer tüm T türleri, projenizin Unicode ayarlarına bağlı olarak bir dize türü alır. Eğer _UNICODEprojeniz için tanımlanan T tiplerinin kullanımı geniş karakter formları, aksi Ansi formları aynıdır. Uygun bir işlev de bu şekilde çağrılır: FindWindowExolarak tanımlanır FindWindowExAveya FindWindowExWbu tanım ile ilgili olarak.


7

Sabit, geniş bir dizgeye (yani bir geniş karakter dizisi) uzun bir göstericidir.

O geniş dize var olduğundan, sevdiği sürekli görünmesi istiyorum: L"TestWindow". Arabayı ada yaratmazdım, sadece L"TestWindow"parametre için geçirdim :

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

Bilgili bir şekilde doğru olmak istiyorsanız, bir "LPCTSTR" bir "metin" dizesidir - Unicode yapısında geniş bir dize ve bir ANSI yapısında dar bir dize, bu nedenle uygun makroyu kullanmalısınız:

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

Çok az insan, hem Unicode hem de ANSI karakter kümeleri için derlenebilen kod üretmeyi önemsiyor ve eğer onu gerçekten doğru bir şekilde çalıştırmazsanız, çok az kazanç için oldukça fazla iş olabilir. Bu özel durumda, fazladan iş yoktur, ancak dizeleri işliyorsanız, doğru işlevlere çözümlenen bir dizi dize işleme makroları vardır.


1
bilgiçlik taslamasına gerek yoktur, _T (MAIN_WINDOW) gibi sabitler kullanıyorsanız _T () kullanın, aksi takdirde LMAIN_WINDOW başarısız olur.
Rodolfo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.