Retour d'une structure venant d'une DLL standard dans VB6
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 2013
-
31 août 2010 à 20:27
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 2013
-
5 sept. 2010 à 11:02
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.
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
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 2 sept. 2010 à 14:09
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
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 sept. 2010 à 20:17
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
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 4 sept. 2010 à 23:00
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
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 5 sept. 2010 à 00:08
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
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 5 sept. 2010 à 10:39
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"...