Probleme de retour avec une DLL

Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 - 17 juil. 2003 à 16:35
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 - 17 juil. 2003 à 17:52
Salut !

je ne trouve vraiment rien sur le net, peut-etre pourrez-vous m'aider !

J'ai cree une DLL toute con avec 2 fonctions :
int test (void);
char* test2 (void);

La premiere retourne 4 et la deuxieme doit retourner "coucou"... Pas tres complique a priori, mais impossible de retourner le char* en String pour VB. J'ai bien recuperer un Long, mais comment en faire une chaine de caracteres pour VB ?

Private Declare Function test2 () As String ===> Plantage
Private Declare Function test2 () As Long ===> Recuperation du pointeur ok...

Merci de me renseigner si vous pouvez !

Mindiell Software
mindiell@free.fr

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juil. 2003 à 17:09
ben oui un String VB n'est pas un char[] sinon irait aussi vite que le C.
tu dois faire de l'alloc memoire, un exemple:
ajoute 2 nombres passes sous forme de String VB, le resultat est mis dans String a. Retourne != 0 si erreur.
Si tu veux retourner le String directement, tu retournes le resultat de (pointeur) SysAllocStringByteLen.

exterc "c" long __stdcall bnAdd(BSTR *a, BSTR *b)
{
char *c, *cEnd, *cDeb, *d, *dEnd, *dDeb, *pmem;
int alen, blen, memlen; c (char*)*a; d (char*)*b; cDeb c; dDeb d; cEnd = c; dEnd = d;
while(*cEnd) cEnd++;
while(*dEnd) dEnd++;
while(*cDeb == '0') cDeb++;
while(*dDeb == '0') dDeb++; alen cEnd - cDeb; blen dEnd - dDeb;
if(!alen && !blen) {
szRET[0] = 48;
SysFreeString(*a);
*a = SysAllocStringByteLen(szRET, 1);
return 0;
}
memlen = (alen > blen) ? alen + 2: blen + 2;
pmem = (char*) malloc(memlen);
if(pmem == 0) return 1;
d = pmem + memlen - 2;
dEnd--; cEnd--; *(d+1) = 0;
memlen = 0; // flag carry
if(alen < blen) goto bSup;
while(cEnd >= cDeb) {
if(dEnd < dDeb) break;
*d = *cEnd + *dEnd - 48 + (char)memlen; if(*d > 57) {*d *d - 10; memlen 1;}
else memlen = 0;
cEnd--; dEnd--; d--;
}
while(cEnd >= cDeb) {
*d = *cEnd + (char)memlen; if(*d > 57) {*d *d - 10; memlen 1;}
else memlen = 0;
cEnd--; d--;
}
goto addExit;
bSup:
while(dEnd >= dDeb) {
if(cEnd < cDeb) break;
*d = *cEnd + *dEnd - 48 + (char)memlen; if(*d > 57) {*d *d - 10; memlen 1;}
else memlen = 0;
cEnd--; dEnd--; d--;
}
while(dEnd >= dDeb) {
*d = *dEnd + (char)memlen; if(*d > 57) {*d *d - 10; memlen 1;}
else memlen = 0;
dEnd--; d--;
}
addExit:
if(memlen) *d = 49;
else d++;
SysFreeString(*a);
*a = SysAllocStringByteLen(d, strlen(d));
free(pmem);
return 0;
}

BruNews, ciao...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juil. 2003 à 17:12
PRECISION IMPORTANTE !!!
mon exemple est pour une dll specialisee pour VB, donc les Declare ne doivent pas mettre Byval car tu prends bien un ptr BSTR*.
BruNews, ciao...
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
17 juil. 2003 à 17:25
> mon exemple est pour une dll specialisee pour VB, donc les Declare ne doivent pas mettre Byval car tu prends bien un ptr BSTR*.

Euh, j'ai rien compris lol :o)

Tout ce que je veux c'est retourner une chaine de caractere, tu pourrais eclaircir ton code pour moi ? Genre ne mettre que le :

long test (void)
{
bla bla bla...

return a;
}

merci :)
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
17 juil. 2003 à 17:37
> Tout ce que je veux c'est retourner une chaine de caractere, tu pourrais eclaircir ton code pour moi ?

Ah, et puis tant qu'on y est, tu pourrais me mettre l'exemple cote VB aussi, parce que le VB il recupere un Long mais il en fait quoi ???

:) merci !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juil. 2003 à 17:40
extern "C" __stdcall winDir(VOID)
{
return SysAllocStringByteLen("YOUPI", 5);
}

BruNews, ciao...
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
17 juil. 2003 à 17:52
> extern "C" __stdcall winDir(VOID)
> {
> return SysAllocStringByteLen("YOUPI", 5);
> }
>
> BruNews, ciao...
>

Ca marche nickel :o)

Je t'adore !!!!!!!!!!!!!!!!!!

PS: T'auras ton nom dans mon projet toi :o)
0
Rejoignez-nous