2010-02-09 6 views
63

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? Belirli bir dizeye bir dize veya işaretçi için belirli bir işaretçi mi? Örneğin "TestWindow" adlı bir pencereyi kapatmak istiyorum.LPCWSTR ne anlama geliyor ve nasıl ele alınmalıdır?

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

kodu yasadışı ve [6] const char SABİT WCHAR dönüştürülemez çünkü bu çalışmaz. Bunu hiç anlamadım. Tüm bu LPCWSTR, LPCSTR, LPSTR konularını net olarak anlamak istiyorum. Bir şey bulmaya çalıştım, ancak daha çok kafam karıştı.

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

Yani son parametre LPCSTR ve LPCWSTR üzerinde derleyici talepleri olarak msdn sitesinde FindWindowEx bildirildi. Lütfen yardım edin. "Sabit Geniş Dize Uzun İşaretçi" ifadesi "

+35

Microsoft Macarca gösterime hoş geldiniz. –

+0

aslında çok daha okunabilir belgeler için yapar, bu konuda sux her şeyi üzülüyorum. –

+0

@Thomas: Bu ** değil ** hangi Microsoft (veya bu konuda Simonyi) etiketli * Macarca Notasyonu *. Belgelendirme grubu, bazı "okunabilirlik" geliştirmeleri yapmaya karar verdiğinde, bir kazanın sonucu az ya da çoktur. Geliştiriciler değildi ve sonuç olarak değişiklikler zarif değildi. Arka plan bilgileri [Hugarian notasyonu] 'nda şu anda mevcuttur: (http://blogs.msdn.com/b/oldnewthing/archive/2004/06/22/162629.aspx) – IInspectable

cevap

98

LPCWSTR". W, Geniş anlamına gelir ve dizenin normal char'a karşılık 2 baytlık bir karakterde saklandığı anlamına gelir.

normal C değişmez dize bir LPCWSTR atamak almak için = ASCII olmayan sadece dizeleri ile başa çıkmak için. Olan herhangi C/C++ kodu için Ortak, sen L

LPCWSTR a = L"TestWindow"; 
+3

Sadece genişletmek için - 'UZUN' bölümü 16bit pencerelerden bir kalıntıdır ve göz ardı edilebilir (bu adla ihtiyacınız olanı boşaltır) –

+9

"16bit Windows'dan hangover" - Bu kesinlikle! –

+0

Bu yüzden Macar Notasyonu yatıyor. Microsoft, tüm API ve kaynak kodlarını gözden geçirmeli ve tüm isimleri düzeltmelidir. Bu yüzden Macar notasyonu kullanmıyorum! –

5

, öneki gerekiyor Sabit, geniş bir dize (yani geniş karakter dizisi) için uzun bir işaretçidir.

Geniş bir dize olduğundan, sabit görünümünüzü şöyle yapmak istersiniz: L"TestWindow". - Geniş dize

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

sen ukalalıkla doğru olmasını istiyorsanız, bir "LPCTSTR" bir "metin" dizesidir: Ben sadece parametre için L"TestWindow" geçerdi, ya ara a oluşturmak olmaz Unicode yapı ve bir ANSI yapı dar dizesinde, bu nedenle uygun makro kullanmalısınız:

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

az insan ayarlar olsa Unicode ve ANSI karakteri hem de derlemek olabilir kod üreten umurumda ve eğer don Gerçekten doğru şekilde çalışmasını sağlamak, az kazanç için biraz fazladan iş olabilir. Bu özel durumda, fazladan fazla iş yoktur, ancak dizeleri işliyorsanız, doğru işlevlere çözümlenecek bir dizi dize işleme makroları vardır.

+1

pedantically doğru olması gerekmez, _T (MAIN_WINDOW) gibi sabitleri kullanıyorsanız, _T() kullanın aksi takdirde LMAIN_WINDOW başarısız olur. – Rodolfo

5

LPCWSTR, wchar_t const * ürününe eşdeğerdir. İşlev çağrısı tarafından değiştirilmeyecek bir geniş karakter dizgisinin bir işaretçisidir.

Sen değişmez bir dizeye bir L prepending tarafından LPCWSTR s'ye atayabilirsiniz: LPCWSTR *myStr = L"Hello World";

LPC T STR ve diğer T tipleri, projeniz için Unicode ayarlarına bağlı olarak bir dize türü alır. Projeniz için _UNICODE tanımlanmışsa, T türlerinin kullanımı geniş karakter formlarıyla aynıdır, aksi takdirde Ansi formları. Uygun işlev de şu şekilde çağrılacaktır: FindWindowEx, bu tanıma bağlı olarak FindWindowExA veya FindWindowExW olarak tanımlanır.