Newsgroup: it.comp.programmare.win32
Titolo: Creare DLL e __stdcall, __fastcall, __cdecl

Devo creare una DLL ma non conosco la differenza tra queste tre
"direttive".
__stdcall
__fastcall
__cdecl
Fin'ora mi sono sempre limitato a usare __cdecl ma vorrei sapre che
differenza con le altre due e se ci sono dei casi in cui conviene
usare o l'una o l'altra.
Grazie
======================================
| Diego Billi                        |
| e-mail   : 
dbi...@cs.unibo.it
      |
| home-page: 
www.cs.unibo.it/~dbilli
 |
======================================

__cdecl
non so a ke linguaggio / compilatore ti riferici ma cmq 2 di queste ci
sono anke in delphi quindi ti posso ripondere (aspetto smentite) la
diferenza magiore e nel pasagio dei paramentri..
cmq ti copio il testo del help del Delphi ke ne parla:
Calling conventions determine the order in which parameters are passed
to the routine. They also affect the removal of parameters from the
stack, the use of registers for passing parameters, and error and
exception handling.
Directive : cdecl	
Parameter order: Right-to-left	
Clean-up : Caller	
Passes parameters in reg : No
Directive : stdcall
Parameter order: Right-to-left	
Clean-up : Routine	
Passes parameters in reg : No
The cdecl convention is useful when you call functions from DLLs
written in C or C++, while stdcall l are used for Windows API calls.
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
ICQ     : 67552596

 written in C or C++, while stdcall l are used for Windows API calls.
A questi aggiungo che __fastcall passa i primi due DWORD direttamente nei
registri del processore, gli altri nello stack in ordine inverso (da destra
verso sinistra)
--
  Jerle Shannara
Per rispondere in email togli JERLEANTISPAM
homepage 
http://utenti.tripod.it/jerleshannara

Ma c'e' un cambio di prestazioni "palpabile" usando uno di questi tre
metodi?
Delle due passare parametri tramite registri dovrebbe essere piu' veloce
ma se mi sapete die qualcosa e' meglio :-)
grazie



Sinceramente ne dubbito... 


 ma se mi sapete die qualcosa e' meglio :-)
DI SOLITO se usi una DLL lo fai per "isolare" un grosso blocco
di codice riutilizzabile in piu applicazioni.
Questo significa che il tempo impiegato nella chiamata alla funzione
di solito e' trascurabile rispetto al tempo di esecuzione della funzione
stessa.
Per le DLL e' quindi buona cosa usare la convenzione __stdcall perche
si semplifica il riutilizzo del codice con altri compilatori C/C++
o di altri linguaggi (tutti i linguaggi per cui esiste un compilatore
per Win32 supportano __stdcall visto che e' la convenzione di chiamata
delle funzioni di Windows).
__fastcall e __cdecl invece vanno bene per codice linkato staticamente
nell'applicazione (rendono possibili alcune ottimizzazioni nel passaggio
dei parametri e nella gestione dello stack).
L. Micheletto

Quando esce il terzo e ultimo libro???
Kiuhnm

 Kiuhnm
L'edizione americana è uscita lo scorso agosto. Credo che la traduzione
italiana dovrebbe uscire questo Natale (almeno spero :-))


 tre metodi?
__fastcall è più veloce. Sempre. __cdecl e __stdcall hanno più o meno 
la stessa velocità, ma semantica diversa - __cdecl è necessario se vuoi 
usare le liste variabili di argomenti (...). Usa __stdcall per tutte le 
funzioni esposte verso l'esterno. Se hai bisogno di liste variabili di 
argomenti, resisti alla tentazione di esporre una __cdecl. Fai come fa 
la runtime C con printf, crea una variante v<nome funzione> (vprintf) 
che come ultimo argomento prende una va_list
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!