Winapi - konwencja wywołania funkcji

0

Cześć,
zacząłem uczyć się winapi. Tak, wiem, jest ono przestarzałe etc. ale nie mam zbyt dużej alternatywy (chyba tylko QT?), a WinApi jest stosunkowo dobrze opisane! Poza tym to tylko na początek.
Mam już na wstępie dwa pytania i bardzo proszę o pomoc w ich rozwiązaniu.

  1. Na początek chciałem się zapytać jak powinna nazywać się funkcja w WinApi? W różnych kursach i książce piszą o funkcji WinMain ale po utworzeniu projektu w VSC++ pojawia mi się funkcja _tWinMain. Czym one się między sobą różnią?

  2. Drugie pytanie dot. konwencji wywołania funkcji. W kursach piszą o WINAPI, w kodzie jest APIENTRY ale przecież razem z CALLBACK jest to jedno i to samo - __stdcall. Czy mogę zamiast APIENTRY użyć CALLBACK bez żadnej konsekwencji? Jaki jest cell tworzenia różnych macr dla tej samej zmiennej i używanie ich zamiennie?

  3. Na koniec chciałbym się zapytać kiedy dokładnie powinienem tworzyć funkcje ze wspomnianymi konwencjami - np. CALLBACK? Czy jak utworzyłem projekt Win32 to czy przy każdej funkcji muszę wstawić CALLBACK? Np. jak mam funkcję double add(double a, double b){return a+b;} to muszę dodać słówko CALLBACK? Bo chyba nie, ale w takim razie kiedy jest taka konieczność?

Pytania może nie są zbyt ambitne ale dopiero zaczynam się w to wdrażać więc proszę o wyrozumiałość i o pomoc w nurtujących mnie kwestiach.
Za każdą pomoc z góry bardzo dziękuję!
pozdrawiam

3

pojawia mi się funkcja _tWinMain. Czym one się między sobą różnią?
A wystarczyłoby się przyjrzeć...

WinMain przyjmuje parametr typu LPSTR, _tWinMan parametr typu LPTSTR.

LPSTR to char*, LPTSTR to wchar_t* albo char* w zależności od tego czy jest #define UNICODE czy nie.
Jest jeszcze wWinMain z parametrem PWSTR, czyli wchar_t*.

Czyli _tWinMain to WinMain albo wWinMain.

Czy mogę zamiast APIENTRY użyć CALLBACK bez żadnej konsekwencji?
Nie ma różnicy między makrami WINAPI, CALLBACK i APIENTRY. Nawet Microsoft miesza je w przykładach.

Czy jak utworzyłem projekt Win32 to czy przy każdej funkcji muszę wstawić CALLBACK?
Nie.

Bo chyba nie, ale w takim razie kiedy jest taka konieczność?
Konieczność jest wtedy kiedy jest konieczność, czyli kompilator wrzeszczy jeśli brak.
Kiedy funkcja jest tzw. callbackiem, czyli wskaźnikiem na funkcję który podajesz Windowsowi by uruchamiał funkcję w razie jakiegoś zdarzenia.
Na przykład SetTimer() albo RegisterClass() przyjmują (bezpośrednio lub pośrednio) wskaźnik na funkcję CALLBACK.

Dodatkowo, w kodzie 64-bitowym jest tylko jedna konwencja wywołania, i wszelkie CALLBACK, stdcall czy cdecl są ignorowane.

0

Dziękuję Ci bardzo @Azarien za rozwianie moich wątpliwości!

1 użytkowników online, w tym zalogowanych: 0, gości: 1