Bonjour,
en fait malgré l'
extern "C", le
"name mangling" (ou Decorated Names - décoration de noms) n'est pas totalement effacé. Celui du
C++ est bien supprimé, mais pas celui du
stdcall en C.
Si en
VC++, il est possible de le supprimer complètement lors de l'export d'une fonction en utilisant un fichier de définition (.def), lors de l'importation de symbole, je ne crois pas que cela soit possible (pas à ma connaissance en tout cas

).
Une solution consiste alors à l'exporter en
Delphi avec la décoration de nom attendue par
VC++ (
comme expliqué dans le lien http://www.esanu.name/delphi/DLL/Cal...isual%20C.html).
1 2 3
| exports
GetCurrentUserName; // export normal
GetCurrentUserName name "GetCurrentUserName@0"; // export pour VC++ |
Le chiffre après le
@ est la taille en bytes des paramètres de la fonction.
Ce nombre est l'espace que l'appelant doit ABSOLUMENT allouer sur la pile, en poussant les arguments, car l'appelé se chargera lui même les dépiler ; si l'appelant ne respect pas cette taille, le décalage en résultant corrompra totalement la pile.
En
cdecl, c'est l'appelant qui pousse et décharge les paramètres sur la pile, ce qui n'entraine pas de corruption si trop de paramètres sont passés (et ce qui permet notamment le
varags du C).
Un bon outil pour voir ce qu'une Dll exporte est
Dependency Walker.
Sinon il est aussi possible charger dynamiquement la Dll comme l'explique
Melem, mais je te déconseille d'utiliser la convention register (par défaut en Delphi) car elle n'est pas supportée en VC++ (elle correspond bien au fastcall de C++Builder, mais pas au fastcall de VC++).
Partager