Funzione chiama per le chiamate in windows api

1

Durante la programmazione in Windows, come comunica Windows con i programmi che vengono eseguiti su di esso?

Quando incorpori una chiamata di funzione che si trova in un'altra posizione di memoria sul disco o nella memoria (non una funzione che tu stesso hai scritto ed è inclusa nella compilation), specialmente l'API di Windows, come fa il compilatore a sapere dove si trova la funzione quindi quando viene eseguito il programma può chiamare quella funzione?

Ad esempio, un programma molto semplice che mostra una finestra che legge hello world. Dovresti chiamare le funzioni dell'API di Windows per ottenere funzioni come la creazione della finestra, le sue dimensioni, i colori e così via ...

Quindi sostanzialmente quello che sto cercando di capire è come i programmi che scrivo comunicano con la piattaforma, il framework su cui vengono eseguiti (generalmente Windows per Windows API).

    
posta Apeee 29.09.2012 - 17:40
fonte

2 risposte

1

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.

    
risposta data 29.09.2012 - 19:04
fonte
0

Il concetto chiave è che sono tutte le stesse cose, fino in fondo. Proprio come chiamate funzioni per fare cose, quelle funzioni chiamano funzioni di sistema, che chiamano gli altri fino al livello più basso, ci sono bit collegati al mondo esterno, dove hardware come reti, tastiere e schermi fanno accadere le cose.

    
risposta data 29.09.2012 - 20:08
fonte

Leggi altre domande sui tag