Bon, je crée mes fonctions dll avec extern "C" en déclaration:
Mais pourquoi extern "C", et pourquoi ça ne marche pas sans cette déclaration?8OCode:
1
2 extern "C" __declspec(dllexport) void LetterList();
Version imprimable
Bon, je crée mes fonctions dll avec extern "C" en déclaration:
Mais pourquoi extern "C", et pourquoi ça ne marche pas sans cette déclaration?8OCode:
1
2 extern "C" __declspec(dllexport) void LetterList();
Cela sert juste a a voir un décoration de type C, et pas C++
Ca n'a donc d'intérêt que si ton module est compilé en C++
Oui, mais si c'est juste de la décoration, pourquoi ça ne fonctionne pas si je les enlève?
Précision supplémentaire: je travaille sous VC2005.
ça a aussi un intéret dans les headers, si le header est inclus dans un code C++.
En fait, ça sert à faire en sorte que la fonction puisse être appelée aussi bien depuis un programme en C que depuis un programme en C++.
De plus, si tu utilises ta DLL avec LoadLibrary() et GetProcAddress(), tu as intéret à ce que la fonction soit extern "C" : Au pire, elle aura un nom du type "_MaFonction@16" facile à deviner alors qu'en C++, elle aura un nom du genre ?MaFonction@dcLKUolkv@slk (un nom C++ propriétaire, dépendant du compilateur ET de sa version).
Avec extern "C", ta fonction sera décorée en _LetterList@0 (0 = taille des arguments)
Sinon ce sera une signature différente
Ok, j'ai compris à peu près.
Mais pourquoi ça ne marche pas sans extern "C"?
Donc, j'ai réfléchi un peu.
extern "C" est-il responsable du fait que la fonction LetterList() soit __cdecl?
Non. extern "C" est responsable du fait que la fonction __cdecl LetterList soit décorée comme "une fonction C __cdecl" plutôt que comme "une fonction C++ __cdecl".
PS: socrate, ça, c'est une décoration de fonction C __stdcall. C'est pour cela que j'avais dit "au pire".
ok, merci encore
Effectivement, erreur de ma part :oops:Citation:
Envoyé par Médinoc