J'ai un petit problème avec une DLL que je fais sous VC++ 6 et que je veux utiliser sous VBA.
J'arrive sans problème à créer et utiliser ma DLL. Cependant, dès que
j'utilise des String en paramètre de fonction, j'ai un soucis. La
fonction est bien appellée et exécutée entierement mais VB me déclence
une erreur : "convention d'appel de DLL incorrecte"
Mes déclarations sont :
en C++ :
extern "C" char* t1(){ return "essai";}
extern "C" void t2(char *arg){MessageBox...}
en VB :
Public Declare Function t1 Lib "maDLL" () As String
Public Declare Sub t2 Lib "maDLL" (ByVal arg As String)
Donc, l'appel à t1 ne pose aucun problème. L'appel à t2 fonctionne (je
vois ma MessageBox qui affiche bien mon paramètre) mais me déclenche
une erreur de convention d'appel de DLL incorrecte.
char* équivaudrait à String de VB ?
ABSOLUMENT NON !!!
String est une zone mémoire allouée par SysAllocString() et autres APIs de sa catégorie (voir MSDN), cette zone comprend 4 octets au début, le compteur. Les données se trouvent donc à un offset 4 et peuvent contenir nimporte quelles valeurs y compris des zéros et n'a donc pas de délimiteur. Une chaine C n'en 'contient' jamais puisque le zéro est son délimiteur.