2013-07-25 8 views
12

mam importujące funkcje WinAPI, pisanie zwrotnych itd. (example) w C# i zawsze zastanawiam się:Co oznaczają LRESULT, WPARAM i LPARAM?

  • co one oznaczają? LRESULT jako ostatni wynik? W-PARAM? L-PARAM?
  • jak bezpiecznie "wrap" im
    • WPARAM i LPARAM zawierać konstrukcjom czasami. Muszę więc użyć ich jako IntPtr. Co powiesz na LRESULT? Czy mogę bezpiecznie z int lub lepiej IntPtr?

Jakie mogę używać do LRESULT w C#?int lub IntPtr?

+0

Zobacz to: http://stackoverflow.com/questions/2515261/what-are-the-definitions-for-lparam-and- wparam – Oscar

+1

[Typy danych systemu Windows] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx) – GSerg

+0

Gdy używasz tego polecenia 'WindowProc', musisz wysłać polecenie do obsługi jako 'hwnd' z komunikatem' uMsg' oraz 'LPARAM' &' RPARAM' to dodatkowe informacje/dane, które mogą być używane i zależą od używanego komunikatu. Jeśli potrzebujesz zrozumieć, co musisz wysłać w tej zmiennej, sprawdź typ 'uMsg', który potrzebujesz (na przykład:' WM_NOTIFY' http://msdn.microsoft.com/en-us/library/windows/desktop/bb775583 (v = vs.85) .aspx) – FSou1

Odpowiedz

46

enter image description here

To Charles Simonyi, były szef grupy oprogramowania aplikacyjnego w firmie Microsoft, grupa, która rozwinęła Word i Przewyższać. To on ustanawiał standardy nazewnictwa identyfikatorów. Ponieważ nikt nie wie, jak wymówić swoje nazwisko, wybrał kraj, w którym urodził się i nazwał to węgierską notacją. Grupa Windows również ją przyjęła, ale wybrała "zły", system węgierski. Tam, gdzie pierwsza litera (y) identyfikatora jest wybrana do odnotowania typu zmiennej. W przeciwieństwie do "dobrego", Apps Hungarian, który wybiera przedrostek według logicznej nazwy typu zamiast nazwy typu fizycznego. Wersja Simonyi.

Więc to jest L jak w Długiej, W jak w Słowie. LPCWSTR to taki dozy, Long Pointer to Constant Wide String. Wyraźnym problemem z węgierskim systemem jest to, że nie działa już tak dobrze, gdy architektura się zmienia. Pierwotnie wybrany dla 16-bitowych systemów operacyjnych (L = 32-bitów, W = 16-bitów), migrowany do wersji 32-bitowej bez zmiany nazwy (W = 32-bitów), dziś jesteśmy na 64-bitowym (L = W = 64-bity).

Więc zignoruj ​​te przedrostki, to tylko historyczny wypadek. Naprawdę musisz musi wybrać IntPtr dla typu LRESULT, z pewnością może to być wartość 64-bitowa w 64-bitowej wersji systemu Windows. Bardzo trudne do zdiagnozowania problemy pojawiają się, gdy tego nie robisz, co jest częstym pytaniem tutaj.

Poza tematem, rozmazany obraz widoczny w tle zdjęcia jest interesującą ciekawostką dotyczącą Simonyi. Microsoft podzielił się wielkim sukcesem ze swoimi pracownikami i przekształcił wielu z nich w multimilionerów. To, co widzisz w tle, to strzał z promu kosmicznego zacumowanego do Międzynarodowej Stacji Kosmicznej. Simonyi jest jednym z siedmiu "kosmicznych turystów" i kupił sobie bilet do IIS. Jedynym zrobić tak dwukrotnie, ustaw go z powrotem $ 60 mln :)

+16

świetny opis historyczny, +1 –

+0

Drobna korekta na temat pochodzenia węgierskich systemów używanych przez pliki nagłówkowe SDK i dokumentacja: [dokumentaliści] (http://blogs.msdn.com/b/oldnewthing/archive/2004/06/22/162629.aspx#163721) najwyraźniej wprowadzili * "poważne zmiany czytelności" *, a reszta to historia. – IInspectable

+0

Wow, Microsoft nie jest taki zły! –

1

To przykład dla notacji węgierski:

  • L zarówno LPARAM i LRESULT oznacza "długi", wyznaczając 32-bitowy int
  • w w WPARAM pomocą "Słowo" (które były 16 -bit int, ale jest teraz również 32-bitowym int co najmniej w przypadku kierowania na architekturę 32-bitową)

Pozostałe nazwy/aliasy typów mają na celu wskazanie ich znaczenia, tj. LRESULT zawierającego pewnego rodzaju wartość wyniku, LPARAM i WPARAM używane w przypadku zmiennych parametrów.

Rzeczywiste znaczenie zawartości parametrów wParam i lParam zależy od konkretnego wysyłanego komunikatu; są tylko zwykłymi wiadrami dla parametrów wiadomości. Jest więc całkiem prawdopodobne, że nie będziesz w stanie ominąć rzucanych przez nie niebezpiecznych typów.

+2

L oznaczało "long", a W oznaczało "słowo", ale powinieneś wyjaśnić, że obecnie są one 32-bitowe (lub 64-bitowy w zależności od platformy). –

+0

@ JonathanPotter: Dzięki za poprawkę, miałem zamiar sprawdzić. Wierzę, że rozmiary typów były różne w interfejsie API Win16, więc przypuszczam, że węgierskie przedrostki w tych nazwach mają tło historyczne. – stakx

+0

@stakx Tak, [masz rację] (http://blogs.msdn.com/b/oldnewthing/archive/2003/11/25/55850.aspx). – GSerg

2

Te nazwy pochodzą z przyczyn historycznych. W wieku WIndows16 bitów WPARAM oznaczało Word-Parameter i LPARAM Long-Parameter w typie węgierskim. przejście do 32-bitowego zwinięcia obu do tego samego rozmiaru (32-bitowe liczby całkowite), ale pozostawił nazwy bez zmian. LRESULT oznaczało długi wynik, i znowu nazwa jest przechowywana z powodów historycznych. Kolejna zmiana ma miejsce, gdy pojawi się bit systemu Windows64. Aby uzyskać pełną listę, proszę have a look here in MSDN. szczegółowo: zarówno LPARAM i LRESULT są typedef do LONG_PTR, gdzie LONG_PTR jest:

#if defined(_WIN64) 
typedef __int64 LONG_PTR; 
#else 
typedef long LONG_PTR; 
#endif 

WPARAM jest typedef dla UINT_PTR, gdzie UINT_PTR wynosi:

#if defined(_WIN64) 
typedef unsigned __int64 UINT_PTR; 
#else 
typedef unsigned int UINT_PTR; 
#endif 

Widać w zasadzie typy ev wskazujące na to samo bity o tej samej wielkości: jedyną różnicą jest to, że używasz Windows 32 lub 64. Pod pojęciem użycie oznacza, że ​​są to ogólne parametry plasowania, których można używać w zależności od tego, co powinna zrobić procedura okna. Zazwyczaj, ponieważ kilka liczb nie jest wystarczających, używane są poiter do złożonych struktur danych, a ich wartości przekazywane są jako WPARAM lub LPARAM, więc nie można przypisać żadnego konkretnego znaczenia, chyba że skoncentrujesz kontekst.

1

LPARAM jest typedef dla LONG_PTR, który jest długim (podpisany 32-bitowy) na win32 i __int64 (podpisany 64-bitowy) na x86_64.

WPARAM jest typedef dla UINT_PTR, który jest unsigned int (unsigned 32-bit) na win32 i unsigned __int64 (unsigned 64-bit) na x86_64.

typedef UINT_PTR WPARAM;

typedef LONG_PTR LPARAM;

w C# można użyć IntPtr

Zobacz What are the definitions for LPARAM and WPARAM?

Powiązane problemy