Share via


Chiamata di funzioni DLL da applicazioni Visual Basic

Affinché le applicazioni Visual Basic, o quelle scritte in altri linguaggi quali Pascal o Fortran, possano chiamare le funzioni contenute in una DLL C/C++, è necessario che le funzioni vengano esportate con la convenzione di chiamata corretta, senza le decorazioni dei nomi effettuate dal compilatore.

__stdcall crea la convenzione di chiamata corretta per la funzione (la funzione chiamata pulisce lo stack e i parametri sono passati da destra a sinistra), ma decora il nome della funzione in modo diverso.Pertanto, quando si utilizza __declspec(dllexport) su una funzione esportata in una DLL, viene esportato il nome decorato.

La decorazione del nome di __stdcall applica un segno di sottolineatura (_) prima del nome del simbolo e aggiunge al simbolo il segno @ seguito dal numero di byte nell'elenco di argomenti (lo spazio dello stack richiesto).Di conseguenza, la funzione dichiarata come:

int __stdcall func (int a, double b)

verrà decorata come:

_func@12

La convenzione di chiamata C (__cdecl) decora il nome come _func.

Per ottenere il nome decorato, utilizzare /MAP.Se si utilizza __declspec(dllexport), avviene quanto riportato di seguito.

  • Se la funzione viene esportata con la convenzione di chiamata C (_cdecl), il segno di sottolineatura (_) iniziale verrà rimosso al momento dell'esportazione del nome.

  • Se la funzione esportata non utilizza la convenzione di chiamata C, ad esempio __stdcall, verrà esportato il nome decorato.

Poiché non è possibile eseguire l'override dove avviene la pulizia dello stack, è necessario utilizzare __stdcall.Per rimuovere la decorazione dei nomi con __stdcall, è necessario specificarli mediante alias nella sezione EXPORTS del file def,come illustrato per la seguente dichiarazione di funzione:

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, è necessario utilizzare nel file def la tecnica degli alias illustrata in questo argomento.Se l'alias viene creato nel programma Visual Basic, non è occorre utilizzare gli alias nel file def.Nel programma Visual Basic, è possibile aggiungere una clausola di alias all'istruzione Declare.

Scegliere l'argomento su cui visualizzare maggiori informazioni

Vedere anche

Concetti

DLL di Visual C++