Chiamata di funzioni DLL da applicazioni Visual Basic
Per le applicazioni Visual Basic (o applicazioni in altri linguaggi, ad esempio Pascal o Fortran) per chiamare le funzioni in una DLL C/C++, le funzioni devono essere esportate usando la convenzione di chiamata corretta senza alcuna decorazione del nome eseguita dal compilatore
__stdcall
crea la convenzione di chiamata corretta per la funzione (la funzione chiamata pulisce lo stack e i parametri vengono passati da destra a sinistra) ma decora il nome della funzione in modo diverso. Pertanto, quando __declspec(dllexport)
viene usato in una funzione esportata in una DLL, il nome decorato viene esportato.
La __stdcall
decorazione del nome antepone il nome del simbolo con un carattere di sottolineatura ( _ ) e aggiunge il simbolo con un carattere di segno (@) seguito dal numero di byte nell'elenco di argomenti (lo spazio dello stack richiesto). Di conseguenza, la funzione quando dichiarata come:
int __stdcall func (int a, double b)
è decorata come _func@12
nell'output.
La convenzione di chiamata C (__cdecl
) decora il nome come _func
.
Per ottenere il nome decorato, usare /MAP. L'uso di __declspec(dllexport)
esegue le operazioni seguenti:
Se la funzione viene esportata con la convenzione di chiamata C (
__cdecl
), rimuove il carattere di sottolineatura iniziale ( _ ) quando il nome viene esportato.Se la funzione esportata non usa la convenzione di chiamata C ,ad esempio
__stdcall
, esporta il nome decorato.
Poiché non è possibile eseguire l'override della posizione in cui si verifica la pulizia dello stack, è necessario usare __stdcall
. Per annullare la dedecoerazione dei nomi con __stdcall
, è necessario specificarli usando gli alias nella sezione EXPORT del file con estensione def. Come illustrato di seguito per la dichiarazione di funzione seguente:
int __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);
Nel. File DEF:
EXPORTS
MYFUNC=_MyFunc@12
INITCODE=_InitCode@0
Affinché le DLL vengano chiamate da programmi scritti in Visual Basic, la tecnica alias illustrata in questo argomento è necessaria nel file con estensione def. Se l'alias viene eseguito nel programma Visual Basic, l'uso dell'aliasing nel file con estensione def non è necessario. Può essere eseguita nel programma Visual Basic aggiungendo una clausola alias all'istruzione Declare .