Tutte le funzioni API di Windows che hai menzionato, così come molte altre funzioni di API diverse che sono disponibili per te che non hai scritto, sono contenute in file di libreria esterni. Una libreria è una raccolta di codice eseguibile, ma non ha una funzione principale quindi è destinata a essere chiamata solo da altri programmi che iniziano con main ().
Per poter utilizzare una libreria, nel tuo progetto c / c ++, devi andare alle impostazioni del linker e aggiungere un riferimento al file .lib. Ad esempio, molte API di Windows sono definite in OLE32.lib, user32.lib e kernel32.lib.
Le librerie sono disponibili in due versioni: possono essere statiche o dinamiche. Nelle librerie statiche tutto il codice si troverà nel file .lib stesso. Con le librerie dinamiche, avrai una coppia di file .lib e .dll. Le DLL (come in OLE32.dll, user32.dll, kernel32.dll) contengono il codice effettivo ma .lib è ancora necessario per fornire all'eseguibile gli indirizzi di funzione (che verranno caricati in memoria durante l'esecuzione) per chiamare.
Se hai seguito tutto ciò finora, manca ancora un pezzo di informazione. Quando una DLL viene caricata nella memoria del programma, in momenti diversi viene caricata in posizioni diverse, quindi come fa il linker a codificare l'indirizzo della funzione da chiamare? Per ottenere questo, c'è uno strato di presente di riferimento indiretto. Indirizzi hard di linker indirizzati a una tabella Branch (o Jump) , che è una matrice di puntatori di funzioni alle funzioni di libreria effettive. Quando una DLL viene caricata nel processo, Windows aggiornerà quella "tabella di salto" con gli indirizzi effettivi di dove la DLL è stata caricata in quel momento specifico. In questo modo il tuo codice non deve mai cambiare e può sempre usare lo stesso puntatore di funzione, ma in realtà punta a un posto in memoria che è pieno di JMP (istruzioni di montaggio dell'assieme) che poi spostano l'esecuzione nella libreria corretta.
La parte interessante è che almeno il 3/4 degli sviluppatori di c / c ++ non ha mai sentito parlare del jump table e davvero non mi interessa. Questo è materiale di basso livello che viene gestito da Windows e per la maggior parte trasparente per le persone.
Dato che sei ancora un principiante, ti consiglio di attenersi a c (meglio ancora c ++) e di imparare a essere molto comodo nello scrivere applicazioni e utilizzare varie API. Quindi dai un'occhiata a Interni di Windows . Ottimo libro, ma non scoraggiarti se inizi a leggerlo e ci sono troppe cose che non puoi capire. Quando ho preso per la prima volta un libro Inside COM, mi ci sono voluti 3 tentativi di provare a leggerlo prima che potessi effettivamente capire di cosa stesse parlando. Le prime 2 volte semplicemente non avevo abbastanza conoscenze di base per capire quel libro.