Po pierwsze, co to dokładnie jest? Wydaje mi się, że jest to wskaźnik (LPC oznacza stałą długiego wskaźnika), ale co oznacza „W”? Czy jest to określony wskaźnik do ciągu, czy wskaźnik do określonego ciągu? Na przykład chcę zamknąć okno o nazwie „TestWindow”.
HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);
Kod jest nielegalny i nie działa, ponieważ const char [6] nie może zostać przekonwertowane na CONST WCHAR. W ogóle tego nie rozumiem. Chcę uzyskać dokładne zrozumienie wszystkich tych LPCWSTR, LPCSTR, LPSTR. Próbowałem coś znaleźć, ale jeszcze bardziej się pogubiłem. W witrynie msdn FindWindowEx
jest zadeklarowana jako
HWND FindWindowEx(
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
Zatem ostatnim parametrem jest LPCSTR, a kompilator wymaga LPCWSTR. Proszę pomóż.
Odpowiedzi:
LPCWSTR
oznacza „Long Pointer to Constant Wide String”. W oznacza Wide i oznacza, że łańcuch jest przechowywany w postaci 2-bajtowej w porównaniu z normalnymchar
. Wspólne dla każdego kodu C / C ++, który ma do czynienia tylko z ciągami znaków spoza ASCII. =Aby otrzymać zwykły ciąg literału C do przypisania do a
LPCWSTR
, musisz poprzedzić go literą LLPCWSTR a = L"TestWindow";
źródło
SPCWSTR
.36UL
w C # to to samo, co(ulong)36
(ulong to 64-bitowa liczba całkowita bez znaku).@
mogą być używane w tym samym języku, co prefiks dla łańcuchów, zmieniając nieznacznie sposób ich przetwarzania.LPCWSTR
jest równoważnewchar_t const *
. Jest to wskaźnik do szerokiego ciągu znaków, który nie zostanie zmodyfikowany przez wywołanie funkcji.Możesz przypisać do
LPCWSTR
s, dołączając L do literału ciągu:LPCWSTR *myStr = L"Hello World";
LPC T STR i wszystkie inne typy T , weź typ ciągu w zależności od ustawień Unicode dla twojego projektu. Jeśli
_UNICODE
zdefiniowano dla twojego projektu, użycie typów T jest takie samo jak szerokich formularzy znaków, w przeciwnym razie formularzy Ansi. Odpowiednia funkcja będzie również nazywana w ten sposób:FindWindowEx
jest definiowana jakoFindWindowExA
lub wFindWindowExW
zależności od tej definicji.źródło
Jest to długi wskaźnik do stałego, szerokiego ciągu (tj. Ciągu szerokich znaków).
Ponieważ jest to szeroki łańcuch, chcesz, aby stałej wyglądać następująco:
L"TestWindow"
. Nie tworzyłbym też pośredniegoa
, po prostu podałbymL"TestWindow"
parametr:ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");
Jeśli chcesz być pedantycznie poprawny, „LPCTSTR” jest ciągiem tekstowym - szerokim ciągiem w kompilacji Unicode i wąskim ciągiem w kompilacji ANSI, więc powinieneś użyć odpowiedniego makra:
ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));
Niewiele osób interesuje się tworzeniem kodu, który można skompilować zarówno dla zestawów znaków Unicode, jak i ANSI, a jeśli nie sprawisz, że będzie działał poprawnie, może to wymagać trochę dodatkowej pracy przy niewielkim zysku. W tym konkretnym przypadku nie ma wiele dodatkowej pracy, ale jeśli manipulujesz ciągami znaków, istnieje cały zestaw makr do manipulacji na ciągach, które są rozwiązywane na prawidłowe funkcje.
źródło