PDA

View Full Version : [C++] Qualcuno mi spiega queste due istruzioni?


xsatellitex
07-02-2008, 14:15
1) lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,

DWORD, LPDWORD)) GetProcAddress( hInstLib,

"EnumProcessModules" ) ;

2) BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );

Se qualcuno gentilmente puo' spiegarmi per filo e per segno queste due istruzioni che non ci capisco niente sembrano due intestazioni di funzioni... boh.In rete non ho trovato niente.
A cosa servono le DWORD , HANDLE, WINAPI... ?


grazie a tutti.

71104
07-02-2008, 15:15
la prima è una stupidaggine, non nel senso di cosa facile da capire ma nel senso di cosa stupida, ottusa: cerca di ottenere con la GetProcAddress l'indirizzo della funzione EnumProcessModules, che è regolarmente importata dall'header psapi.h (è inutile fare linking esplicito a run-time quando si può fare linking implicito in compile-time); l'indirizzo restituito dalla GetProcAddress viene memorizzato in una variabile lpfEnumProcessModules (e chissà perché invece non l'ha chiamata EnumProcessModules... perché altrimenti collideva con qualcos'altro forse? :rolleyes: ) che può poi essere usata per effettuare una chiamata diretta alla funzione.

la seconda invece altro non è che la dichiarazione di un'altra variabile analoga alla lpfEnumProcessModules; quest'altra variabile si chiama lpfEnumProcesses e lascia intendere che l'autore idiota abbia fatto questo lavoro di linking esplicito per tutte le PSAPI (ma una versione aggiornata del PSDK no? :rolleyes: ).

per ulteriori informazioni circa i tipi Win32:
http://msdn2.microsoft.com/en-us/library/aa383751.aspx

per ulteriori informazioni invece circa le PSAPI (Process Status API):
http://msdn2.microsoft.com/en-us/library/ms684884(VS.85).aspx

xsatellitex
07-02-2008, 17:07
Ciao grazie per l'aiuto finalmente ho trovato un po di documentazione.
Ricapitolando:

1) lpfEnumProcessModules =variabile in cui verra' memorizzato il valore restituito da getprocaddress

2) (BOOL(WINAPI *)(HANDLE, HMODULE *,DWORD, LPDWORD)) = ????

3) GetProcAddress( hInstLib,"EnumProcessModules" ) ; = Funzione GetProcAddress

la 2) che cos'e' ? una specie di supercast ?
psdk non so cos'e'... maro' che ignoranza... dove le imparo queste cose?

71104
07-02-2008, 18:46
2) (BOOL(WINAPI *)(HANDLE, HMODULE *,DWORD, LPDWORD)) = ???? scritta così non è sintatticamente valida; se invece la correggi mettendoci un identificatore dopo l'asterisco allora diventa la dichiarazione di una variabile di tipo "puntatore a funzione con convenzione di chiamata WINAPI (espandi la macro WINAPI e vedi a cosa corrisponde) che ritorna un BOOL e vuole come parametri un HANDLE, un HMODULE, un DWORD, e un LPDWORD".

psdk non so cos'e'... maro' che ignoranza... dove le imparo queste cose? le impari quando impari a programmare su Windows. PSDK sta per Platform SDK (Software Developer's Kit) ed è un pacchetto scaricabile gratuitamente dal sito di Microsoft (le ultime versioni hanno il controllo WGA) singolarmente oppure integrato in Visual C++. esso contiene tutti gli headers, le librerie, i tools, e gli eventuali sorgenti necessari a programmare in Win32, COM, ed MFC/ATL per i nostalgici.

xsatellitex
07-02-2008, 19:07
ah ok grazie :)