Retour d'une structure venant d'une DLL standard dans VB6

Signaler
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
Bonjour à tous.

Voila, je viens par ce message faire appel à la bonté et la patience d'un ou plusieurs des membres. :-)

J'utilise conjointement deux langages VB6 et PureBasic.
PureBasic me permet de creer des DLL Standard qui sont normalement identiques à celles que peut créer le C et au format StdCall que j'utilise ensuite dans VB6

Mon probleme c'est que je n'arrive pas à retourner une structure dans VB6
Elle parviens bien à ma DLL, car j'ai mis des msgbox à l'interieur qui me le confirme (Enfin je crois)
Mais au retour, je ne sais pas comment m'y prendre, car ma DLL se charge de modifier la variable.

En fait j'envoie le pointeur de la variable structurée à la DLL qui la reçois, la complete, mais comme elle n'est pas UNICODE le retour n'est pas bon.
Je sais qu'il y a une histoire d'UNICODE et de BSTR entre VB et PureBasic, mais je ne sais pas comment m'y prendre.

Je sais aussi que vous n'aimez pas bien melanger les langages, mais je n'ai pas trop le choix car VB6 ne créé pas de DLL standard et que le C est un peu trop compliqué pour moi :-(
Si quelqu'un pouvait avoir la gentillesse de se pencher sur mon probleme, car je tourne en rond depuis plus d'une semaine.

Voici ma DLL

Private Type Struct
 Name As String
 Number As Integer
 Adress As String
 GoodLevel As Integer
End Type

Private Declare Function TestPb Lib "c:\Dll.dll" (ByRef VariableStructurée As Struct) As Long

Public Sub Form_Load()

 ChDrive (Left(App.Path, 1))
 ChDir App.Path
 Dim Variable As Struct
 Dim RetourAdresse As Long
 Dim RetourDll As Long
 
 Variable.Name = "Bonjour je suis dans VB"
 Variable.Number = 1
 Variable.Adress = "France"
 Variable.GoodLevel = 0
 
 TestPb Variable
 
 MsgBox Variable.Name
 MsgBox Variable.Number
 MsgBox Variable.Adress
 MsgBox Variable.GoodLevel

End Sub


Je vous remercie beaucoup de votre attention
Bonne journée

10 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
51
Salut
je n'arrive pas à ajouter la dll au tableau des
reference
get error message can't add reference to the specify file
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
14
Pas une ActiveX, donc pas de références VB6 possibles. Elle s'utilise à coups de Declare Function

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Oui oui exactement, c'est une DLL standard, pas active X, comme celles qui sont faites par le C

J'ai donné le code de départ, la declaration de la DLL est deja toute faite.
La connexion marche, ce qui ne marche pas, c'est le retour que je ne sais pas gerer, a cause des BSTR et aussi de l'UNICODE

VB est en UNICODE et a un format BSTR pour la gestion de ses variables je crois
Alors que ma DLL est en ASCII et utilise le format "normal" des variables.

C'est tout ce que je sais...apres je comprend pas grand chose de plus

Merci beaucoup de votre aide
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
14
Utilise SysAllocString pour créer une chaine COM à partir d'une chaine Unicode. Pour convertir de l'ASCII en Unicode, utilise CharToOem.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Merci de ta reponse
Je ne suis pas vraiment un caid des API en VB
Je vais essayer de les uiliser comme tu me dit, mais j'arrive jamais a comprendre sous quel format cela doit revenir ou partir (Long ou Struct), ou si c'est byval ou byref, bref ce qui fait que a part en essayant toutes les combinaisons ce qui a pour effet de crasher le RAD a chaque fois, et a part avec un coup de chance...ça ne marche jamais
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
14
CharToOem() demande la chaine source (un Long contenant StrPtr(taChaine)) et un pointeur vers la chaine de destination (un Long avec comme valeur StrPtr(taChaineU)). taChaineU doit être initialisée à Space$(Len(taChaine)*2). SysAllocString renverra un pointeur vers une String si tu lui donnes StrPtr(taChaineU).

Ca devrait aller mais je ne suis pas vraiment un expert en VB6 bas-niveau

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
J'ai un peu du mal a comprendre car tu me dit que :
"CharToOem() demande la chaine source (un Long contenant StrPtr(taChaine))"

Et quand je prend la declaration de CharToOem, j'ai l'impression qu'il attend pas un long mais un string ....
Private Declare Function CharToOem Lib "user32.dll" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
14
La chaine source c'est la chaine que tu veux convertir. Et tu peux changer le type de ses deux paramètres en Long.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Ouaaahhh, tu viens de m'apprendre un truc de dingue.
Je ne savais pas que l'on pouvait changer les types des variables dans les API
Je croyais que l'on devait les utiliser comme elles sont "livrées"...

Merci, je vais essayer
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
14
Du moment que tu fous pas en l'air le stack, ça va ... Mais vaut mieux pas transformer un Integer en String si t'as pas envie de crasher ton programme

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question