Je declare la fonction dans mon module VB.net comme:
Public Declare Ansi Function structest lib "dll.dll" Alias struct_test (ByRef myinfo As MYINFO) As System.Int32
et dans ma dll:
int __stdcall struct_test(struct myinfo *myinfo)
{
[...]
}
et je l'utilise comme suit:
------------------------------
Dim myinfo As MYINFO
Dim ret As System.Int32
ret = structest(myinfo)
Console.WriteLine(myinfo.name)
------------------------------
Comment faut-il faire pour qu'une structure MYINFO passee en parametre a la fonction de la dll soit remplie dans la dll et retournee a VB.net?
Faut-il que je malloc la string name, ou est-ce deja fait par vb?
L'erreur que j'obtiens avec ce code est: System.NullReferenceException, Object reference not set to an instance of an object.
Merci d'avance
A voir également:
Passage d'une structure VB.net a une DLL C et recuperation des valeurs
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 oct. 2003 à 20:45
char *name; comme membre ne doit pas aller.
Je te donne experience de dll pour vb, encore jamais eu a en faire pour .net:
struct myinfo
{
BOOL validity;
BSTR *name;
BSTR *nickname;
};
Si BSTR *name est de longueur NON NULL, tu dois desallouer avec SysFreeString(). Ensuite tu alloueras sur ces membres de l'unicode par SysAllocStringByteLen() ou SysAllocString().
cs_budda
Messages postés6Date d'inscriptionmardi 7 octobre 2003StatutMembreDernière intervention12 octobre 2003 12 oct. 2003 à 03:18
J'ai reussi a resoudre le pb en utilisant des char *, visiblement les String sous VB.net ont un charset Ansi par defaut.
Donc pour allouer mes char * dans la dll, j'utilise calloc.
Le pb que j'ai maintenant c'est pour free tout ca.
exemple:
source VB:
For x As Integer = 0 to 5000
ret = structest(x, myinfo)
End If
Une fois que ma structure est allouee lors d'un premier passage, lorsque je reviens dedans, je retrouve les valeurs. Jusque la ca me parait normal ;)
Par contre quand j'essaye de free un des champs char * de la structure myinfo, ca me pete un vilain:
Le fait que je puisse pas free les pointeurs dans ma dll C, ca ne va pas entrainer des fuites de memoires?
Ou est-ce qu'il y a un free special a utiliser?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 oct. 2003 à 09:36
Si tu te fais passer un char* par vb.net tu ne pourras pas le FREEer, tu devrais essayer avec BSTR* et SysFreeString sinon fuites memoire garanties.
BruNews, ciao...
cs_budda
Messages postés6Date d'inscriptionmardi 7 octobre 2003StatutMembreDernière intervention12 octobre 2003 12 oct. 2003 à 15:07
Tu m'avais deja conseille de passer toutes mes Strings en unicode dans mon precedent Thread. J'avais donc declare ma fonction en Unicode et utilise des BSTR. Mais meme en utilisant des BSTR, ca me pose des problemes:
En C:
------------
BSTR __stdcall test()
{
BSTR test;
test = SysAllocString("Hello");
return (test);
}
-----------
En VB:
-----------
Public Declare Unicode Function Dlltest Lib "dll.dll" Alias "test" () As String
Private Sub test_unicode()
Dim test As String
test = Dlltest()
Console.WriteLine(test)
End Sub
-------------
Et l'output dans la fenetre de DEBUG me donne:
?????d
Je suis vraiment desole de t'emmerder avec des problemes de base comme ca, mais ca me pourrit la vie 8)
Vous n’avez pas trouvé la réponse que vous recherchez ?