Newsgroup: it.comp.programmare.win32
Titolo: GetTickCount() in C...

Ragazzi sono abbastanza a digiuno di C da un po' di tempo.
Vorrei poter richiamare la funzione GetTickCount() della libreria 
kernel32.dll da C (uso Dev-C++) ma non so come si faccia a richiamare la 
funzione di una dll da C.
Chi mi dice, gentilmente, come faccio?
Thx in anticipo!

Darkbyte [Work] wrote:

Devi necessariamente avere le librerie di sviluppo Windows, le librerie 
standard del C non possono bastare.
Se ce l'hai, per la dichiarazione includi <windows.h> e per la 
definizione la libreria kernel32.lib. Questo almeno nel Platform SDK 
Microsoft, altri ambienti la libreria potrebbe cambiare: in ogni modo 
devi preparare il progetto allo sviluppo Windows.

 devi preparare il progetto allo sviluppo Windows.
Allora... Dev-C++ possiede (in /lib/) libkernel32.a che ho linkato al 
progetto :)
Quindi ora riesco ad utilizzare GetTickCount().
Ma se da internet scarico una dll che possiede delle funzioni 
particolari, come posso fare per usarla in C?
Posso fare qualcosa tipo LoadLibrary? Insomma... devo per forza avere il 
file .a o .lib?

 particolari, come posso fare per usarla in C?
Prima di tutto devi avere il file .h, senza il quale sei a piedi...
Con l'utility implib dovresti poter creare il file lib partendo da una dll.
In caso diverso se supponi che la funzione che vuoi usare non abbia
parametri puoi usare la GetProcAddress (come ho fatto io nel programma Asus
Checker per usare una funzione che *speravo* non avesse argomenti, e
funzionņ :-)
Ciao
Stefano "HappyMan" (Lake Maggiore - Italy)
-- 
The Personal Framework for Object Oriented Windows Development (Win32)
http://www.sgr.info
Email happyman69 (at) 
libero.it

 Con l'utility implib dovresti poter creare il file lib partendo da una dll.
Cioè passo a implib la dll che voglio usare (quasi sicuramente 
contornata da qualche parametro della riga di comando) e mi viene 
generato il file .lib?
Ma cos'è di preciso un file .lib? Cioè cosa contiene?
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 file .a o .lib?
No, non è necessario. LoadLibrary e GetProcAddress consentono di 
accedere alle funzioni esposte di una DLL. Nella documentazione MSDN in 
linea di questi due metodi c'è un esempio.
Chiaramente questo non è un metodo conveniente (decisamente) da 
applicare alle API di windows. Basti pensare che le stesse LoadLibrary e 
GetProcAddress sono nella kernel32.dll... <deadlock detected> :-)

 Il file .h ma quale? Windows.h? O cosa?
Scusa sono stato criptico :-)
Voglio dire che per usare le funzioni presenti in una dll devi sapere
1. Il nome
2. Eventuali parametri da passare come argomenti
3. Eventuale valore ritornato
Queste info le devi trovare in un header file (appunto .h) che contiene i
prototipi delle funzioni. Senza questo come sai se la funzione Pippo è da
chiamare Pippo("Ciao") o Pippo(32,64) ?
Il nome delle funzioni presenti in una dll lo puoi anche recuperare con un
tool che si chiama Dependancy Walker, ma non i prototipi.
Con la implib dovresti poter generare il file .lib corrispondente alla dll
che vuoi usare e contiene le informazioni che servono al linker per linkare
le funzioni chiamate.
Detto in termini semplicistici quando usi la funzione Pippo il compilatore
ha bisogno del file .h per capire se la stai chiamando correttamente, il
linker ha bisogno del file .lib per sapere dove sta fisicamente la funzione
Pippo.
Se tu chiami la funzione Pippo con la API GetProcAddress in pratica ne
chiami il puntatore all'interno della dll, senza referenziarla
esplicitamente: in questo modo il linker non vede la chiamata a Pippo ma
l'uso di un pointer ritornato dalla API, che per quanto gli riguarda può
essere qualunque cosa.


Quindi se so cosa fa la dll, se so come sono composte le funzioni che ci 
sono dentro (quindi che cosa passare loro e che cosa ottengo), la dò in 
pasto a implib, linko il file .lib ottenuto e poi richiamo da codice la 
funzione della dll come se nulla fosse, giusto?
Quindi il file .h mi servirebbe ancora a qualcosa?


 Quindi il file .h mi servirebbe ancora a qualcosa?
Ti è servito per sapere come sono composte le funzioni :-)
Stefano "HappyMan" (Lake Maggiore - Italy)
-- 
The Personal Framework for Object Oriented Windows Development (Win32)
http://www.sgr.info
Email happyman69 (at) 
despammed.com