Newsgroup: it.comp.lang.delphi
Titolo: Traduzione convenzioni di chiamata

[postato su icpw32, icld]
Buongiorno a tutti,
mi trovo a dover tradurre alcuni header realizzati con VC++ verso
(Object) Pascal.
Non avendo familiarita' con lo strumento di origine, vorrei chiedere se
qualcuno di voi sa chiarirmi cosa sia la seguente dichiarazione:
#if !defined(_APIxxxx_)
#define APIxxxx __declspec(dllimport)
#else
#define APIxxxx __declspec(dllexport)
#endif
o meglio, supponendo di avere
  RETCOND APIxxxx SrvDisconnect ();        // Header C
se sia o meno equivalente ad una
  // traduzione in Pascal
  SrvDisconnect: function: RETCOND cdecl stdcall;
Grazie in anticipo e
Saluti
Paolo Arosio

 #endif
E' una forma comoda di definizione di un identificatore
(APIxxxx) in modo che esso possa fungere sia da keyword
di importazione, sia da keyword di esportazione.
Quando si scrive una DLL generalmente conviene distribuire
1 solo file header di interfaccia, che, guarda caso, 
e' lo stesso file header che viene usato in compilazione
della DLL.  Solo che durante la compilazione della DLL,
il sistema deve esportare le funzioni il cui prototipo e'
preceduto da tale identificatore, mentre durante la 
compilazione dell'applicazione che interfaccia la DLL,
le funzioni dovranno essere importate.
Visto che il file header e' uno solo, il modo per far
scegliere al compilatore o l'una o l'altra strada, e'
quella di definire o meno _APIxxxx_.
Il codice della DLL avra' qualcosa del tipo:
#define  _APIxxxx_
#include "myheader.h"
Il codice dell'applicazione avra' soltanto:
#include "myheader.h"
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 di importazione, sia da keyword di esportazione.
ma nello specifico il tipo di convenzione non e' specificato dalle righe
sopra?
cioe' __declspec non dice nulla sul fatto che debbano essere dichiarate
nella unit pascal come stdcall o cdecl o altro?
Saluti
Paolo Arosio

nella unit pascal come stdcall o cdecl o altro?
No, ma fai bene ad usare stdcall (non ricordo, ma mi sembra
che questa convenzione indichi il passaggio dei parametri
a-la-C, da destra a sinistra).
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

 a-la-C, da destra a sinistra).
Non è questo il problema, il fatto è che con cdecl la pulizia dello 
stack spetta al chiamante. Con sdtcall il pop dei parametri spetta al 
chiamato, e confondere le due convenzioni è moooolto pericoloso :-) Lo 
stack si disallinea e buonanotte, crash a go-go
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.18. C, C++ and ASM developers
                              and beta testers are welcome!

 dichiarate nella unit pascal come stdcall o cdecl o altro?
Se non è indicato esplicitamente, i compilatori C usano sempre cdecl


stack si disallinea e buonanotte, crash a go-go
E' vero e, nel caso specifico di una DLL creta con VC++, da
usare in Delphi, bisogna usare "cdecl" e non "stdcall".


Andrea,
se non ti spiace ne approfitterei per un'altra cosa:
un wchar_t come lo tradurresti in Pascal?
l'help di BCB 3 mi dice che ha dimensione uguale ad un int, mentre
rpc.hlp mi dice che "The wchar_t type is defined by MIDL as an unsigned
short (16-bit) data object"
a peggiorar le cose, in TCHAR.H distribuito col Dev-C++ (mingw) si
definisce
typedef wchar_t TCHAR;
o
typedef char TCHAR;
a seconda che sia o meno definito _UNICODE.
(in realta' nell'header che sto traducendo c'e' appunto TCHAR, preceduto
dalle inclusioni di <windows.h>, <winreg.h>, <stdio.h>, <stddef.h>,
<string.h>)


 usare in Delphi, bisogna usare "cdecl" e non "stdcall".
Grazie: in effetti il convertitore automatico del DrBob mi mette sia
cdecl che stdcall, il che mi pareva quanto meno strano, visto che
differiscono almeno per la pulizia dello stack.
Saluti
Paolo Arosio

 un wchar_t come lo tradurresti in Pascal?
Delphi possiede WideChar, di 2 byte.
