Passage d'une structure VB.net a une DLL C et recuperation des valeurs

cs_budda Messages postés 6 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 12 octobre 2003 - 11 oct. 2003 à 20:07
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 12 oct. 2003 à 15:34
Hello, je sais que cette question a deja ete posee, mais je n'ai pas reellement trouve une reponse appropriee a mon probleme.

Je definis une structure en VB.net:

Structure MYINFO
Public Validity As Boolean
Public name As String
Public nickname As String
End Structure

dans mon le .h de ma dll j'ai la structure correspondante:

struct myinfo
{
BOOL validity;
char *name;
char *nickname;
};

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

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
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().

BruNews, ciao...
0
cs_budda Messages postés 6 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 12 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:

-----
Debug Assertion Failed
Expression: _CrtIsValidHeapPointer(pUserData)
-----

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?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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...
0
cs_budda Messages postés 6 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 12 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)
0

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

Posez votre question
cs_budda Messages postés 6 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 12 octobre 2003
12 oct. 2003 à 15:09
Desole c'etait SysAllocStringByteLen("Hello world", 12);
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 oct. 2003 à 15:34
void __stdcall test(BSTR *bst) // tu prends pointeur param
{
char *c = (char*) *bst; // juste pour te montrer
if(c) SysFreeString(*bst);
*bst = SysAllocStringByteLen("HELLO", 5); // et NON 6 !!!
}

Voila modele pour dll special vb, ne pas mettre ByVal dans le Declare, pour cela qu'il faut pointeur BSTR* en param.

BruNews, ciao...
0
Rejoignez-nous