{"id":1042,"date":"2026-02-19T23:08:43","date_gmt":"2026-02-19T22:08:43","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1042"},"modified":"2026-02-19T23:08:44","modified_gmt":"2026-02-19T22:08:44","slug":"windows-h-jako-zbior-deklaracji-interfejsow-systemowych-wykorzystywanych-przez-kompilator-i-linker","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/02\/19\/windows-h-jako-zbior-deklaracji-interfejsow-systemowych-wykorzystywanych-przez-kompilator-i-linker\/","title":{"rendered":"Windows h jako zbi\u00f3r deklaracji interfejs\u00f3w systemowych wykorzystywanych przez kompilator i linker"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Pliki nag\u0142\u00f3wkowe w \u015brodowisku Win32 API s\u0105 formalnym opisem tego, co aplikacja mo\u017ce wywo\u0142a\u0107 po stronie systemu. <code><strong>windows.h<\/strong><\/code> jest agregatem: do\u0142\u0105cza wiele innych nag\u0142\u00f3wk\u00f3w, kt\u00f3re w rzeczywisto\u015bci zawieraj\u0105 w\u0142a\u015bciwe definicje. Mechanizm jest prosty technicznie, ale konsekwencje projektowe s\u0105 dalekosi\u0119\u017cne.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li class=\"\"><a href=\"#windows-h-jako-mechanizm-kontroli-zakresu-dostepnych-funkcji-i-typow-poprzez-makra-preprocesora\">Windows h jako mechanizm kontroli zakresu dost\u0119pnych funkcji i typ\u00f3w poprzez makra preprocesora<\/a><\/li><li class=\"\"><a href=\"#windows-h-jako-punkt-styku-pomiedzy-kodem-aplikacji-a-binarnymi-bibliotekami-systemu-operacyjnego\">Windows h jako punkt styku pomi\u0119dzy kodem aplikacji a binarnymi bibliotekami systemu operacyjnego<\/a><ol><li class=\"\"><a href=\"#krotkie-uwagi-praktyczne\">Kr\u00f3tkie uwagi praktyczne<\/a><\/li><li class=\"\"><a href=\"#krotkie-zakonczenie\">Windows h: Kr\u00f3tkie zako\u0144czenie<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Nag\u0142\u00f3wek nie zawiera implementacji funkcji systemowych. Zawiera ich sygnatury, typy danych, definicje struktur oraz sta\u0142e symboliczne. Implementacje znajduj\u0105 si\u0119 w bibliotekach dynamicznych \u0142adowanych w czasie uruchomienia. Kompilator potrzebuje nag\u0142\u00f3wka do sprawdzenia poprawno\u015bci wywo\u0142a\u0144 i typ\u00f3w. Linker potrzebuje informacji o nazwach symboli, aby powi\u0105za\u0107 wywo\u0142ania z bibliotekami importu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce do\u0142\u0105czenie <code>windows.h<\/code> powoduje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wprowadzenie setek nazw do globalnej przestrzeni nazw w C,<\/li>\n\n\n\n<li>do\u0142\u0105czenie zale\u017cno\u015bci od okre\u015blonych bibliotek systemowych,<\/li>\n\n\n\n<li>aktywacj\u0119 makr warunkowych zale\u017cnych od wersji platformy.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Znaczenie wersji platformy polega na tym, \u017ce te same nag\u0142\u00f3wki mog\u0105 udost\u0119pnia\u0107 r\u00f3\u017cny zakres funkcji w zale\u017cno\u015bci od zdefiniowanych makr konfiguracyjnych. Kod skompilowany z innym zestawem definicji mo\u017ce mie\u0107 inne zachowanie lub nawet si\u0119 nie kompilowa\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Przyk\u0142ady kodu i wzory w formie tabeli<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad<\/th><th>Opis<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#include &lt;windows.h&gt;\\n#include &lt;stdio.h&gt;\\nint main() {\\n MessageBoxA(NULL, \\\"Test\\\", \\\"Nag\u0142\u00f3wek\\\", MB_OK);\\n return 0;\\n}\\n<\/code><\/td><td>Proste wywo\u0142anie funkcji zdefiniowanej w nag\u0142\u00f3wkach systemowych.<\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#include &lt;windows.h&gt;\\nint main() {\\n MessageBoxW(nullptr, L\\\"Test\\\", L\\\"Nag\u0142\u00f3wek\\\", MB_OK);\\n return 0;\\n}\\n<\/code><\/td><td>Wersja szerokoznakowa funkcji, typowa dla C++.<\/td><\/tr><tr><td>Python<\/td><td><code>python\\nimport ctypes\\nuser32 = ctypes.windll.user32\\nuser32.MessageBoxW(0, \\\"Test\\\", \\\"Nag\u0142\u00f3wek\\\", 0)\\n<\/code><\/td><td>Brak bezpo\u015brednich nag\u0142\u00f3wk\u00f3w, ale r\u0119czne odtworzenie interfejsu binarnego.<\/td><\/tr><tr><td>PHP<\/td><td><code>php\\n&lt;?php\\n$ffi = FFI::cdef(\\\"int MessageBoxA(void*, const char*, const char*, unsigned int);\\\");\\n$ffi-&gt;MessageBoxA(null, \\\"Test\\\", \\\"Nag\u0142\u00f3wek\\\", 0);\\n?&gt;\\n<\/code><\/td><td>R\u0119czne zdefiniowanie sygnatury funkcji w FFI.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"windows-h-jako-mechanizm-kontroli-zakresu-dostepnych-funkcji-i-typow-poprzez-makra-preprocesora\">Windows h jako mechanizm kontroli zakresu dost\u0119pnych funkcji i typ\u00f3w poprzez makra preprocesora<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Preprocesor C dzia\u0142a przed w\u0142a\u015bciw\u0105 kompilacj\u0105. W przypadku nag\u0142\u00f3wk\u00f3w systemowych jest wykorzystywany do selektywnego w\u0142\u0105czania fragment\u00f3w interfejsu. Definiowane s\u0105 makra okre\u015blaj\u0105ce docelow\u0105 wersj\u0119 platformy, np. minimaln\u0105 wersj\u0119 systemu, na kt\u00f3rej kod ma dzia\u0142a\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce oznacza to, \u017ce nag\u0142\u00f3wek zawiera warunkowe bloki kodu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>je\u015bli dana wersja systemu jest wystarczaj\u0105co nowa, deklaracja funkcji jest widoczna,<\/li>\n\n\n\n<li>w przeciwnym wypadku symbol nie istnieje z punktu widzenia kompilatora.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Konsekwencja projektowa: kod, kt\u00f3ry kompiluje si\u0119 poprawnie na jednym zestawie definicji, mo\u017ce przesta\u0107 si\u0119 kompilowa\u0107 na innym. To nie jest problem narz\u0119dziowy, tylko bezpo\u015brednia konsekwencja przyj\u0119cia modelu API zale\u017cnego od wersji systemu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Istnieje te\u017c kwestia konflikt\u00f3w nazw. Nag\u0142\u00f3wek wprowadza definicje makr, kt\u00f3re koliduj\u0105 z nazwami zmiennych lub funkcji w kodzie u\u017cytkownika. Typowym przyk\u0142adem s\u0105 makra o bardzo og\u00f3lnych nazwach, kt\u00f3re wchodz\u0105 w konflikt z kodem aplikacji. W praktyce stosuje si\u0119 lokalne undefiniowanie makr albo odpowiedni\u0105 kolejno\u015b\u0107 do\u0142\u0105czania nag\u0142\u00f3wk\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Przyk\u0142ady kodu i wzory w formie tabeli<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad<\/th><th>Opis<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#define _WIN32_WINNT 0x0601\\n#include &lt;windows.h&gt;\\nint main() {\\n return 0;\\n}\\n<\/code><\/td><td>Okre\u015blenie minimalnej wersji platformy przed do\u0142\u0105czeniem nag\u0142\u00f3wka.<\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#define NOMINMAX\\n#include &lt;windows.h&gt;\\n#include &lt;algorithm&gt;\\nint main() {\\n int a = std::min(1, 2);\\n return 0;\\n}\\n<\/code><\/td><td>Wy\u0142\u0105czenie makr koliduj\u0105cych z funkcjami standardowej biblioteki.<\/td><\/tr><tr><td>Python<\/td><td><code>python\\n# brak preprocesora\\n# wersja API kontrolowana r\u0119cznie przez wyb\u00f3r funkcji w ctypes\\npass\\n<\/code><\/td><td>Brak mechanizmu makr, selekcja funkcji odbywa si\u0119 na poziomie kodu.<\/td><\/tr><tr><td>PHP<\/td><td><code>php\\n&lt;?php\\n\/\/ brak preprocesora\\n\/\/ programista sam decyduje, kt\u00f3re sygnatury udost\u0119pni\u0107\\n?&gt;\\n<\/code><\/td><td>Brak odpowiednika makr preprocesora.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"windows-h-jako-punkt-styku-pomiedzy-kodem-aplikacji-a-binarnymi-bibliotekami-systemu-operacyjnego\">Windows h jako punkt styku pomi\u0119dzy kodem aplikacji a binarnymi bibliotekami systemu operacyjnego<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nag\u0142\u00f3wek nie dzia\u0142a w pr\u00f3\u017cni. Ka\u017cda zadeklarowana funkcja ma odpowiadaj\u0105cy symbol w bibliotece dynamicznej. Podczas linkowania statycznego tworzony jest import do biblioteki, a w czasie uruchomienia loader systemowy mapuje wywo\u0142ania na rzeczywiste adresy funkcji w pami\u0119ci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ten model ma kilka konsekwencji technicznych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>b\u0142\u0119dna sygnatura funkcji w nag\u0142\u00f3wku powoduje b\u0142\u0119dy w czasie dzia\u0142ania, mimo poprawnej kompilacji,<\/li>\n\n\n\n<li>r\u00f3\u017cnice w konwencji wywo\u0142a\u0144 skutkuj\u0105 uszkodzeniem stosu,<\/li>\n\n\n\n<li>niezgodno\u015b\u0107 wersji nag\u0142\u00f3wk\u00f3w i bibliotek mo\u017ce prowadzi\u0107 do subtelnych b\u0142\u0119d\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Model dynamicznego wi\u0105zania pozwala na cz\u0119\u015bciow\u0105 kompatybilno\u015b\u0107 wsteczn\u0105. Starsza aplikacja mo\u017ce dzia\u0142a\u0107 na nowszym systemie, je\u015bli interfejsy s\u0105 zachowane. Z drugiej strony, aplikacja skompilowana z my\u015bl\u0105 o nowszym API nie uruchomi si\u0119 poprawnie na starszym systemie, je\u015bli brakuje wymaganych symboli.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Przyk\u0142ady kodu i wzory w formie tabeli<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad<\/th><th>Opis<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#include &lt;windows.h&gt;\\nint main() {\\n HMODULE h = LoadLibraryA(\\\"user32.dll\\\");\\n if (!h) return 1;\\n return 0;\\n}\\n<\/code><\/td><td>R\u0119czne za\u0142adowanie biblioteki dynamicznej w czasie dzia\u0142ania.<\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#include &lt;windows.h&gt;\\ntypedef int (WINAPI *MsgFn)(HWND, LPCWSTR, LPCWSTR, UINT);\\nint main() {\\n HMODULE h = LoadLibraryW(L\\\"user32.dll\\\");\\n MsgFn f = (MsgFn)GetProcAddress(h, \\\"MessageBoxW\\\");\\n if (f) f(nullptr, L\\\"Test\\\", L\\\"Dynamiczne\\\", MB_OK);\\n return 0;\\n}\\n<\/code><\/td><td>Pobranie adresu funkcji bezpo\u015brednio z biblioteki.<\/td><\/tr><tr><td>Python<\/td><td><code>python\\nimport ctypes\\nu = ctypes.WinDLL(\\\"user32.dll\\\")\\nu.MessageBoxW(0, \\\"Test\\\", \\\"Dynamiczne\\\", 0)\\n<\/code><\/td><td>Dynamiczne wi\u0105zanie przez interfejs FFI j\u0119zyka.<\/td><\/tr><tr><td>PHP<\/td><td><code>php\\n&lt;?php\\n$ffi = FFI::cdef(\\\"int MessageBoxW(void*, const wchar_t*, const wchar_t*, unsigned int);\\\");\\n$ffi-&gt;MessageBoxW(null, \\\"Test\\\", \\\"Dynamiczne\\\", 0);\\n?&gt;\\n<\/code><\/td><td>Wywo\u0142anie funkcji z biblioteki dynamicznej przez FFI.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"krotkie-uwagi-praktyczne\">Kr\u00f3tkie uwagi praktyczne<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kolejno\u015b\u0107 do\u0142\u0105czania nag\u0142\u00f3wk\u00f3w ma znaczenie ze wzgl\u0119du na makra i konflikty nazw.<\/li>\n\n\n\n<li>Definicje makr platformowych nale\u017cy ustawia\u0107 przed do\u0142\u0105czeniem nag\u0142\u00f3wk\u00f3w systemowych, w przeciwnym wypadku s\u0105 ignorowane.<\/li>\n\n\n\n<li>Mieszanie r\u00f3\u017cnych wersji nag\u0142\u00f3wk\u00f3w i bibliotek w jednym \u015brodowisku budowania prowadzi do trudnych do diagnozy b\u0142\u0119d\u00f3w.<\/li>\n\n\n\n<li>Przy dynamicznym wi\u0105zaniu trzeba r\u0119cznie pilnowa\u0107 zgodno\u015bci sygnatur i konwencji wywo\u0142a\u0144.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"krotkie-zakonczenie\">Windows h: Kr\u00f3tkie zako\u0144czenie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nag\u0142\u00f3wki systemowe nie s\u0105 tylko technicznym dodatkiem do kompilatora. Definiuj\u0105 granic\u0119 pomi\u0119dzy kodem u\u017cytkownika a binarn\u0105 warstw\u0105 systemu operacyjnego. B\u0142\u0119dy w rozumieniu tej granicy prowadz\u0105 do problem\u00f3w, kt\u00f3re pojawiaj\u0105 si\u0119 dopiero w czasie dzia\u0142ania programu, cz\u0119sto daleko od miejsca, w kt\u00f3rym powsta\u0142a przyczyna.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pliki nag\u0142\u00f3wkowe w \u015brodowisku Win32 API s\u0105 formalnym opisem tego, co aplikacja mo\u017ce wywo\u0142a\u0107 po stronie systemu. windows.h jest agregatem: do\u0142\u0105cza wiele innych nag\u0142\u00f3wk\u00f3w, kt\u00f3re w rzeczywisto\u015bci zawieraj\u0105 w\u0142a\u015bciwe definicje. Mechanizm jest prosty technicznie, ale konsekwencje projektowe s\u0105 dalekosi\u0119\u017cne. Nag\u0142\u00f3wek nie zawiera implementacji funkcji systemowych. Zawiera ich sygnatury, typy danych, definicje struktur oraz sta\u0142e symboliczne. Implementacje znajduj\u0105 si\u0119 w bibliotekach dynamicznych \u0142adowanych w czasie uruchomienia. Kompilator potrzebuje nag\u0142\u00f3wka do sprawdzenia poprawno\u015bci wywo\u0142a\u0144 i typ\u00f3w. Linker potrzebuje informacji o nazwach symboli, aby powi\u0105za\u0107 wywo\u0142ania z bibliotekami importu. W praktyce do\u0142\u0105czenie windows.h powoduje: Znaczenie wersji platformy polega na tym, \u017ce te same nag\u0142\u00f3wki mog\u0105 udost\u0119pnia\u0107 r\u00f3\u017cny zakres funkcji w zale\u017cno\u015bci od zdefiniowanych makr konfiguracyjnych. Kod skompilowany z innym zestawem definicji mo\u017ce mie\u0107 inne zachowanie lub nawet si\u0119 nie kompilowa\u0107. Przyk\u0142ady kodu i wzory w formie tabeli J\u0119zyk Przyk\u0142ad Opis C c\\n#include &lt;windows.h&gt;\\n#include &lt;stdio.h&gt;\\nint main() {\\n MessageBoxA(NULL, \\&#8221;Test\\&#8221;, \\&#8221;Nag\u0142\u00f3wek\\&#8221;, MB_OK);\\n return 0;\\n}\\n Proste wywo\u0142anie funkcji zdefiniowanej w nag\u0142\u00f3wkach systemowych. C++ cpp\\n#include &lt;windows.h&gt;\\nint main() {\\n MessageBoxW(nullptr, L\\&#8221;Test\\&#8221;, L\\&#8221;Nag\u0142\u00f3wek\\&#8221;, MB_OK);\\n return 0;\\n}\\n Wersja szerokoznakowa funkcji, typowa dla C++. Python python\\nimport ctypes\\nuser32 = ctypes.windll.user32\\nuser32.MessageBoxW(0, \\&#8221;Test\\&#8221;, \\&#8221;Nag\u0142\u00f3wek\\&#8221;, 0)\\n Brak bezpo\u015brednich nag\u0142\u00f3wk\u00f3w, ale r\u0119czne odtworzenie interfejsu binarnego. PHP php\\n&lt;?php\\n$ffi = FFI::cdef(\\&#8221;int MessageBoxA(void*, const char*, const char*, unsigned int);\\&#8221;);\\n$ffi-&gt;MessageBoxA(null, \\&#8221;Test\\&#8221;, \\&#8221;Nag\u0142\u00f3wek\\&#8221;, 0);\\n?&gt;\\n R\u0119czne zdefiniowanie sygnatury funkcji w FFI. Windows h jako mechanizm kontroli zakresu dost\u0119pnych funkcji i typ\u00f3w poprzez makra preprocesora Preprocesor C dzia\u0142a przed w\u0142a\u015bciw\u0105 kompilacj\u0105. W przypadku nag\u0142\u00f3wk\u00f3w systemowych jest wykorzystywany do selektywnego w\u0142\u0105czania fragment\u00f3w interfejsu. Definiowane s\u0105 makra okre\u015blaj\u0105ce docelow\u0105 wersj\u0119 platformy, np. minimaln\u0105 wersj\u0119 systemu, na kt\u00f3rej kod ma dzia\u0142a\u0107. W praktyce oznacza to, \u017ce nag\u0142\u00f3wek zawiera warunkowe bloki kodu: Konsekwencja projektowa: kod, kt\u00f3ry kompiluje si\u0119 poprawnie na jednym zestawie definicji, mo\u017ce przesta\u0107 si\u0119 kompilowa\u0107 na innym. To nie jest problem narz\u0119dziowy, tylko bezpo\u015brednia konsekwencja przyj\u0119cia modelu API zale\u017cnego od wersji systemu. Istnieje te\u017c kwestia konflikt\u00f3w nazw. Nag\u0142\u00f3wek wprowadza definicje makr, kt\u00f3re koliduj\u0105 z nazwami zmiennych lub funkcji w kodzie u\u017cytkownika. Typowym przyk\u0142adem s\u0105 makra o bardzo og\u00f3lnych nazwach, kt\u00f3re wchodz\u0105 w konflikt z kodem aplikacji. W praktyce stosuje si\u0119 lokalne undefiniowanie makr albo odpowiedni\u0105 kolejno\u015b\u0107 do\u0142\u0105czania nag\u0142\u00f3wk\u00f3w. Przyk\u0142ady kodu i wzory w formie tabeli J\u0119zyk Przyk\u0142ad Opis C c\\n#define _WIN32_WINNT 0x0601\\n#include &lt;windows.h&gt;\\nint main() {\\n return 0;\\n}\\n Okre\u015blenie minimalnej wersji platformy przed do\u0142\u0105czeniem nag\u0142\u00f3wka. C++ cpp\\n#define NOMINMAX\\n#include &lt;windows.h&gt;\\n#include &lt;algorithm&gt;\\nint main() {\\n int a = std::min(1, 2);\\n return 0;\\n}\\n Wy\u0142\u0105czenie makr koliduj\u0105cych z funkcjami standardowej biblioteki. Python python\\n# brak preprocesora\\n# wersja API kontrolowana r\u0119cznie przez wyb\u00f3r funkcji w ctypes\\npass\\n Brak mechanizmu makr, selekcja funkcji odbywa si\u0119 na poziomie kodu. PHP php\\n&lt;?php\\n\/\/ brak preprocesora\\n\/\/ programista sam decyduje, kt\u00f3re sygnatury udost\u0119pni\u0107\\n?&gt;\\n Brak odpowiednika makr preprocesora. Windows h jako punkt styku pomi\u0119dzy kodem aplikacji a binarnymi bibliotekami systemu operacyjnego Nag\u0142\u00f3wek nie dzia\u0142a w pr\u00f3\u017cni. Ka\u017cda zadeklarowana funkcja ma odpowiadaj\u0105cy symbol w bibliotece dynamicznej. Podczas linkowania statycznego tworzony jest import do biblioteki, a w czasie uruchomienia loader systemowy mapuje wywo\u0142ania na rzeczywiste adresy funkcji w pami\u0119ci. Ten model ma kilka konsekwencji technicznych: Model dynamicznego wi\u0105zania pozwala na cz\u0119\u015bciow\u0105 kompatybilno\u015b\u0107 wsteczn\u0105. Starsza aplikacja mo\u017ce dzia\u0142a\u0107 na nowszym systemie, je\u015bli interfejsy s\u0105 zachowane. Z drugiej strony, aplikacja skompilowana z my\u015bl\u0105 o nowszym API nie uruchomi si\u0119 poprawnie na starszym systemie, je\u015bli brakuje wymaganych symboli. Przyk\u0142ady kodu i wzory w formie tabeli J\u0119zyk Przyk\u0142ad Opis C c\\n#include &lt;windows.h&gt;\\nint main() {\\n HMODULE h = LoadLibraryA(\\&#8221;user32.dll\\&#8221;);\\n if (!h) return 1;\\n return 0;\\n}\\n R\u0119czne za\u0142adowanie biblioteki dynamicznej w czasie dzia\u0142ania. C++ cpp\\n#include &lt;windows.h&gt;\\ntypedef int (WINAPI *MsgFn)(HWND, LPCWSTR, LPCWSTR, UINT);\\nint main() {\\n HMODULE h = LoadLibraryW(L\\&#8221;user32.dll\\&#8221;);\\n MsgFn f = (MsgFn)GetProcAddress(h, \\&#8221;MessageBoxW\\&#8221;);\\n if (f) f(nullptr, L\\&#8221;Test\\&#8221;, L\\&#8221;Dynamiczne\\&#8221;, MB_OK);\\n return 0;\\n}\\n Pobranie adresu funkcji bezpo\u015brednio z biblioteki. Python python\\nimport ctypes\\nu = ctypes.WinDLL(\\&#8221;user32.dll\\&#8221;)\\nu.MessageBoxW(0, \\&#8221;Test\\&#8221;, \\&#8221;Dynamiczne\\&#8221;, 0)\\n Dynamiczne wi\u0105zanie przez interfejs FFI j\u0119zyka. PHP php\\n&lt;?php\\n$ffi = FFI::cdef(\\&#8221;int MessageBoxW(void*, const wchar_t*, const wchar_t*, unsigned int);\\&#8221;);\\n$ffi-&gt;MessageBoxW(null, \\&#8221;Test\\&#8221;, \\&#8221;Dynamiczne\\&#8221;, 0);\\n?&gt;\\n Wywo\u0142anie funkcji z biblioteki dynamicznej przez FFI. Kr\u00f3tkie uwagi praktyczne Windows h: Kr\u00f3tkie zako\u0144czenie Nag\u0142\u00f3wki systemowe nie s\u0105 tylko technicznym dodatkiem do kompilatora. Definiuj\u0105 granic\u0119 pomi\u0119dzy kodem u\u017cytkownika a binarn\u0105 warstw\u0105 systemu operacyjnego. B\u0142\u0119dy w rozumieniu tej granicy prowadz\u0105 do problem\u00f3w, kt\u00f3re pojawiaj\u0105 si\u0119 dopiero w czasie dzia\u0142ania programu, cz\u0119sto daleko od miejsca, w kt\u00f3rym powsta\u0142a przyczyna.<\/p>\n","protected":false},"author":1,"featured_media":1051,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28],"tags":[],"class_list":["post-1042","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-windows"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1042"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1042\/revisions"}],"predecessor-version":[{"id":1052,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1042\/revisions\/1052"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1051"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}