Le BSTR comment fonctionne t'il exactement ????

cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 20 sept. 2010 à 09:15
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 23 sept. 2010 à 12:45
Bonjour à tous,

Voila, cela fait plusieurs jours que j'essaie de comprendre le format de BSTR
Et il reste encore pas mal de vide dans mon esprit

J'ai compris qu'il etait constitué d'une "entete" de 4 octets comprenant la longueur de la string sur laquelle il pointe.

Mais comment fait on pour acceder à cette longueur, par quelle instruction ???

Lorque je fait :

Dim a As String
a = "AndreBernard"
MsgBox VarPtr(a)

J'obtiens le pointeur de la variable contenant l'adresse de la string, c'est bien ça ???
Mais pour obtenir le chiffre 12 qui est la longueur de cette variable...comment fait on ???

Merci de votre aide et bonne journée

33 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 sept. 2010 à 09:50
Varptr ne va pas.
VarPtr indique l'adresse du pointeur de chaine (StrPtr)
StrPtr indique l'adresse du début de la chaine (premier caractère)

cette chaine est précédée de la taille en octets (tu auras donc 24 et non 12, car VB6 stocke ses chaines en UTF-16)

pour lire la taille, la fonction LenB est là.

si tu veux refaire la logique :


Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Long)

Private Sub Form_Load()
Dim a As String
Dim nLen As Long
Dim pStr As Long
    a = "AndreBernard"
    '# Au choix, on peux utiliser StrPtr :
    pStr = StrPtr(a)
    '# Ou refaire la logique en partant de VarPtr :
    'GetMem4 VarPtr(a), pStr
    GetMem4 pStr - 4, nLen
    MsgBox nLen
End Sub


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
20 sept. 2010 à 11:07
RENFIELD !!!! Le cavalier solitaire

J'suis tellement content de te parler à nouveau

C'est exactement ce que je voulais.
Car voila, cela fait au moins una année, que j'essaie de creer des procedures qui permettent de passer tous les style de "variables" de VB6 à une DLL Standard

Comme je suis nul en programmation, j'ai trouvé un langage qui permette de creer des "vraies" DLL au format C en utilisant le BASIC.

Depuis ce temps j'utilise de paire VB6 et ce langage, et cela me permet des tonnes de choses, que je n'arrivait pas a faire auparavant avec VB6 seul.
Seulement voila..car y'a toujours un voila
VB6 utilise le BSTR et l'UNICODE nativement ce que les DLL standard n'utilise pas.
Alors cela fait presque un an que je galere pour essayer de passer des tableaux de strings, STRUCTURES et meme des strings entre ma DLL et VB6

Et personne ne peut bien m'aider, car VB6 etant vieux, peu de personnes ne l'utilisent, ou l'a encore installé sur sa machine.Beaucoup de gens travaillent maintenant avec la version EXPRESS de DOT.NET
Donc je n'arrive pas a trouver quelqu'un qui aurait assez de connaissances en VB6 et en C pour pouvoir creer cette passerelle avec le C (Enfin avec mon langage qui encore une fois lui ressemble comme deux gouttes d'eau au niveau comportement) et qui serait extremement utile, et je pense pas qu'a moi.
Car si j'arrivais a creer le code qui transmet ça a ma DLL, je pense qu'une DLL C fonctionnerait tout aussi bien qu'une de mes DLL, et la ce serait utile a pas mal de gens.
Il y a quelques aides sur ce sujet....mais comme je ne connait rien en C, je ne comprend pas tout non plus.
Ce qui me manque c'est de comprendre ce que l'on envoie avec VB6 quand on met BYVAL, STRPTR, etc...le reste, j'en fait mon affaire, car mes DLL ne necessite que l'envoie de pointeurs en ANSI et en LPTSTR comme le C nativement

Le forum de mon langage, ne connaissent pas non plus VB, et ceux du C non plus en grosse partie.

Un gentil membre d'un forum VB, m'a dirigé un jour sur un lien de quelqu'un qui creait une DLL standard avec VB6 en le bidouillant.
J'ai essayé pendant une semaine, avec l'aide de membres d'un forum C, de me connecter a cette soi-disante DLL standard.
En fait et d'apres ce qu'en ont déduis les programmeurs C qui se sont embeter sans resultat a essayer de connecter cette DLL, elle aurait deux moteurs, un COM et un C, mais avec deux moteurs pas moyen de la faire avancer. La seule chose qui marchait bien c'est qu'elle avait le comportement d'une DLL C, mais ça s'arrettait la, on etait pas obligé de l'inscrire dans la BDR, et il fallait donc la Declarer a la mano, ce que je recherchais a faire.
J'ai donc abandonné cette solution peu fiable pour revenir a la premiere.

Je me retrouve donc avec des dizaines de codes, des BYVAL par ci, des BYREF par la, STRPTR, VARPTR, CopyMemory, des liens, des tutos, etc...et je ne comprend pas mieux, je sais plus ou j'en suis

Alors voila, je suis désolé de te saouler avec mes problemes, mais je suis désespéré, et je ne sais plus vers qui me tourner, car quand on travaille avec deux langages on a le cul entre 2 chaises, comme ont dit populairement.

Tu sais que tu es mon hero de VB depuis que je suis venu sur ce forum, je ne sais pas si tu te rappelles, mais tu m'as sorti maintes fois du caca.
Mais si tu pouvais m'aider sur ce coups la, je t'en serais reconnaissant, et je forcerais mes enfants a l'etre toute leur vie et peut etre meme les enfants de mes enfants.

Je te remercie deja mille fois de ton code et te souhaite une bonne journée
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 sept. 2010 à 11:19
cavalier solitaire... l'homme et sa monture... ca fait un peu K2000 ^^


quand on appelle les APIs, par exemple, en mettant un ByVal String
VB va, a la volée transformer notre chaine en ASCII.

Pour ca que nous utilisons bien souvent la version ASCII des APIs (un comble alors que VB gère l'Unicode)

il arrive (GDI+, par exemple) que nous utilisions la version Unicode des APIs. Il est alors plus simple de déclarer Byval Lon et de passer le StrPtr directement.

Dans ton cas, tes dll attendent vraissemblablement un tableau de Bytes, terminé par un \0

possible d'utiliser StrConv pour passer ta chaine (FromUnicode) et ainsi obtenir ton tableau :

Dim a() as Byte
a = Strconv(CHAINE, vbFromUnicode)



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
20 sept. 2010 à 11:52
K2000 il etait beau, grand et il avait une voiture qu'il fallait 10 000 SMIC pour se la payer
Excuse moi j'arrive plus a avoir les balises, les couleurs etc ...

Oui mon soucis, c'est que j'arrive bien a envoyer ma variable a ma DLL, c'est le retour le plus dur :

Private Declare Function LisVbStringByval Lib "Dll.dll" (VarString As Long) As Long
Private Declare Function LisVbStringByref Lib "Dll.dll" (VarString As Long) As Long
Private Declare Function ConvCStringToVBString Lib "kernel32" Alias "lstrcpyA" (ByVal lpsz As String, ByVal pt As Long) As Long ' Notice the As Long return value replacing the As String given by the API Viewer.

Public Function GetStringFromPointer(lpTest As Long) As String

Dim zpos As Long
Dim s As String

s = String(255, 0)
ConvCStringToVBString s, lpTest
zpos = InStr(s, vbNullChar)
s = Left(s, zpos - 1)
GetStringFromPointer = s

End Function

Public Sub Form_Load()

Dim Variable As String, RetourDll As Long
ChDrive (Left(App.Path, 1))
ChDir App.Path

Variable = "Hello, i'm in VB6"
MsgBox (StrPtr(Variable))

'Envoie de l'adresse de la string en BYVAL (STRING POINTEUR)
MsgBox "STRPTR = " + Str(StrPtr(ByVal Variable)), vbOKOnly, "Visual basic 6 BYVAL"
RetourDll = LisVbStringByval(ByVal StrPtr(Variable))
MsgBox "Retour de la DLL = " + GetStringFromPointer(RetourDll), vbOKOnly, "Visual basic 6 BYVAL"

'Envoie de l'adresse de la string en BYREF(STRING POINTEUR)
MsgBox "STRPTR = " + Str(StrPtr(Variable)), vbOKOnly, "Visual basic 6 BYREF"
RetourDll = LisVbStringByref(StrPtr(Variable))
MsgBox "Retour de la DLL = " + GetStringFromPointer(RetourDll), vbOKOnly, "Visual basic 6 BYREF"

End Sub

Car je voudrais pouvoir modifier le tableau, la structure dans la DLL et retourner dans VB.
Et la je me heurte non seulement au format, mais aussi a cette histoire de gestion de la table, car si on ecris directement dans la memoire avec la DLL une variable plus longue et que VB ne le sait pas, je risque de "deborder" ...
0

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

Posez votre question
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
20 sept. 2010 à 12:00
J'ai retourvé la barre d'outil

Avec un copain on a essayé de faire passer une structure..et ben a moi la peur...

En fait ce code etait censé envoyer le pointeur de la structure, on la modifiait dans la DLL, et on la retournait en envoyant une autre structure par son pointeur.
Mais la question que je m'etait posé, c'est comment elle faisait la deuxieme structure pour gerer ce que l'on ecrivais dedans, puisque ce n'etait pas VB qui l'ecrivait.
Je pense que ce n'etait pas la bonne methode

Private Declare Function mSetData Lib "MyData.dll" (ByVal VarString As Long) As Long
Private Declare Function mGetData Lib "MyData.dll" (ByRef VarString As Long) As Long

Private Type myStruct
 Foo As Long
 Bar As Long
 Str As String
End Type

Public Sub Form_Load()

 Dim Somedata As myStruct, Adress As Long
 ChDrive (Left(App.Path, 1))
 ChDir App.Path
  
 Somedata.Foo = 10
 Somedata.Bar = 8
 Somedata.Str = "Hello"
 
 Adress = VarPtr(Somedata)
 mSetData Adress

 Dim Newdata As myStruct
 
 mGetData VarPtr(Newdata)

 MsgBox Newdata.Bar, vbOKOnly, "VB6"
 MsgBox Newdata.Foo, vbOKOnly, "VB6"
 MsgBox Newdata.Str, vbOKOnly, "VB6"
  
End Sub
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 sept. 2010 à 14:00
tu te fatigues un brin pour rien.

tu peux envoyer directement ta structure, en faisant un Byref As Any
ou un Byref as myStruct

ta chaine sera mise en ascii, Str pointera vers le debut de chaine.

depuis ta dll tu pourras bien evidemement modifier cette chaine, en restant néanmoins dans la limite de la taille de la chaine transmise a l'origine.

En gros, si tu demandes une String (en utilisant ou non un Type), le plus simple est de l'allouer dans VB avant l'appel, et de lui transmettre la taille de ce Buffer.

Je n'ai toujours pas compris pourquoi tu souhaitais absolutment utiliser ce langage tiers... quel est le gain ? (vitesse ?...)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
20 sept. 2010 à 18:05
En fait, j'ai changé de langage principal, car je voulais creer des DLL standard non ActiveX comme le C, pour ne pas a avoir a les inscrire en BDR et qu'elle soit utilisable par d'autre langages.
J'ai été extremement déçu lorsque j'ai vu, il y a quelques années que les DLL VB6 n'avait rien de DLL que l'extension ou presque
Aussi pour le fait que je voulais pouvoir programmer des logiciels "portable" au sens de les mettre sur une clef USB et qu'ils tournent sans aucune installation.

Seulement voila, il aurais fallu programmer en assembleur, ou bien en C.
Et ce sont deux langages innccessible au niveau difficulté pour moi

Alors j'ai arpenté le NET, essayé plein de BASIC, et un jour je suis tombé sur ce formidable langage.
J'adorais VB a cette epoque et ne jurais que par lui, et lorsque j'ai decouvert, la puissance, la rapidité, le bas niveau accessible aussi simplement qu'en C, la portabilité, la legereté (il tenait presque sur une disquette) a comparé des gros CD de VB, l'IDE ne necessite aucune installation, tu copie le repertoire n'importe ou et tu travaille, la possibilité de creer des vraies DLL comme en C, puisque le compilo est fait en C, les exe et les DLL sont petits, le prix modique avec update gratuites a vie, la possibilité de mixer dans le meme code de l'assembleur, car le compilo compile directement en ASM, on peut meme lui demander de sortir le source ASM pendant la compile, et j'ai oublié de dire car en fait cela ne me sert pas qu'il est en plus multiplateforme (LINUX, MAC et Windows)et encore d'autres avantages...mais je ne voudrais pas te saouler car je ne suis pas un representant pour vendre ce langage, et c'est meme un peu incongru de parler de lui ailleur que sur son forum qui est aussi tres actif et qui apporte encore un plus a ce langage.

Bref, j'ai du me rendre a l'evidence, que VB sur certains terrains avait perdu de la splendeur a mes yeux.
Et plus je code avec et moins j'ai envie de coder VB, je doit etre honnette avec toi.
Car VB parait simple, et il a été fait pour etre simple lorsqu'on lui demande des choses simples, comme disent certains pour que le dernier pekin (comme moi d'ailleurs) puisse coder sans passer des années a apprendre.
Mais le paradoxe c'est qu'il deviens extremement dur, lorsque l'on sort des sentiers battu, il arrive meme a decontenancer des bon programmeurs en C, qui ne comprennent pâs comment on peut faire pour gerer des choses simples aussi difficilement.
Dans ma quette au passage de structure, certains programmeurs ont abandonés, malgré leur bonne volonté devant les BSTR, BYVAL, BYREF, VarPtr et tout le toutim

De plus VB par sa simplification a outrance, m'a permis de mal coder depuis 30 ans, pas de declaration de type, les variants qui n'existent pas en C, etc....et quand je me suis mis a programmer ce langages, je me suis retrouvé avec des programmeurs de metiers, maitre de l'ASM et du C, et j'ai découvert l'ampleur des degats que VB avait fait sur moi

Ta prochaine question sera surement, car je prefere la devancer mais pourquoi tu reviens a VB, si tu le trouve si toc que ça maintenant.
Et bien deja affectueusement...il m'a trompé, un peu comme une femme qui aurait couché ailleur, mais je l'ai tellement aimé et ai été tellement fier de lui pendant si longtemps qu'un grand amour ne s'oublie jamais
Et la seconde raison est plus utilitaire, VB est le langage le plus utilisé dans le monde du travail, du fait de VB mais aussi du VBA qui trone dans tous les bureaux et que le premier pequin massacre a coup de macros
La ou je travaille ils ne jurent que par lui, alors je ne peux le quitter.

Mais utiliser les deux simultanement, procure une puissance assez incroyable.
Le VB pour le COM et l'OOP, et l'autre langage pour la portabilité et la simplicité du travail bas niveau et sa sa creation de DLL format C

Voila mon bon RENFIELD!!!! me voila avec deux langages et donc deux fois plus d'emmerdes.
Car je n'arrive pas a trouver quelqu'un qui veuille bien se pencher sur mon vieux VB6 dans mon forum, et quelqu'un de VB6 qui m'aide a rendre VB plus accessible a des langages de base comme le C

C'est dur de vouloir marier un cheval avec un vache ....je te parle pas de la tete des paysans de chaque coté de la barriere ...moi je me dit que tous les langages devraient pouvoir s'entraider et tirer parti de la puissance de l'autre...et eviter les petites guegueres, du style : "VB6 n'est pas un vrai langage c'est un jouet" ou ton langage c'est pas du C, c'est de la bidouille et moi je suis programmeur pas bidouilleur...
Je te promet que ces phrases je les ai lues plusieurs fois...

Un peu de gentillesse, de comprehension, de compation devrait sufir pour pouvoir contenter tout le monde.
Apres tout les programmeurs ne sont deja pas si nombreux pour avoir besoin de se dechirer a la maniere des clans
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
20 sept. 2010 à 18:36
tu peux envoyer directement ta structure, en faisant un Byref As Any
ou un Byref as myStruct

Bah en fait, avant d'en arriver la, j'ai essayé un peu toutes les methodes, en y comprenant souvent pas grand chose...et je crois bien que celle la, je l'avais essayé aussi..mais comme je n'avais pas compris que VB convertissais sans rien dire en envoyant a la DLL, j'essayais encore de convertir BSTR et ça marchait pas, j'avais des hieroglyphes

Tu as raison...d'ailleurs les gens comme toi ont toujours raison, c'est pour cette raison que j'adore les cottoyer, outre le fait qu'ils ennervent un peu, car en quelques secondes il te donnent une solution que 2 semaines de recherche n'ont pas suffit a trouver, et puis aussi, un peu comme un enfant qui voit ses parents avoir toujours raison et c'est parfois agaçant tout en restant admirable[happy8]
Je ne t'apprend rien en te disant que tu es genial..et que ton lasso n'a rien perdu de sa splendeur et de son agilité depuis tant d'années

Bon, je viens de creer un dossier special RENFIELD ce qui fera au moins ma 10eme methode

Bon..... reste a traiter la modif et le retour, ce qui est pas une mince affaire.
Car tu doit t'en douter je veux etre libre de raccourcir ou agrandir les strings a partir de la DLL

En gros, si tu demandes une String (en utilisant ou non un Type), le plus simple est de l'allouer dans VB avant l'appel, et de lui transmettre la taille de ce Buffer.

Bah c'est la qu'est l'os, helas !!!!
C'est que la taille, je ne la connais pas dans VB, car j'envoie ma structure, j'appelle une fonction qui travaille avec et qui retourne son resultat, mais la taille du retour seul la DLL (et les dieux bien sur ) la connaissent
Donc dans cette alternative quelle methode utiliserais tu pour le retour ???
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2010 à 04:17
Tout lu^^

generer de "vraies" dll depuis vb6


Ne plus enregistrer ses activeX:
www.vbfrance.com/codes/ISOLATOR-GENEREZ-FICHIERS-MANIFEST-VOS-EXE-DLL-OCX_48269.aspx

enfin, les allocations de BSTR sont possible via SysAllocStringet ses copines (jamais trop teste... si souci, je veux bien regarder)




Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
21 sept. 2010 à 10:49
Merci pour le lien...encore une methode depuis XP que je ne connaissais pas
Je vois que je ne suis pas le seul a vouloir rendre portable les applis

Excuse moi pour la longueur des textes, mais vu la peine que tu te donnes a aider tout le monde, la moindre des choses est que tu saches ou tu met les pieds
Et encore..je ne t'ai pas parlé de mon enfance et de mon couple

Dis voir, tu n'as pas repondu a ma question, normal elle etait perdu dans le bottin de mon post.

Grace a toi, je suis arrivé a passer une structure a ma DLL et ceci bien plus simplement
Mais maintenant, comme tout ceux qui ne savent rien faire.....ils en veulent toujours plus, je voudrais la modifier dans la DLL, et la retourner.
Le probleme c'est que la longueur de la nouvelle string, VB ne la connais pas car il envoie sa structure et c'est la DLL qui travaille et qui la remplie, c'est donc la DLL qui la connait.

J'ai essayer avec la meme methode, mais ça plante le RAD, je pense que c'est parce que je ne declare pas comme il faut l'envoie de la nouvelle structure

Private Declare Function mSetData Lib "MyData.dll" (ByRef VarString As myStruct) As Long
Private Declare Function mGetData Lib "MyData.dll" (ByRef VarString As myStruct) As Long

Private Type myStruct
 Foo As Long
 Bar As Long
 Str As String
End Type

Public Sub Form_Load()

 Dim Somedata As myStruct
 ChDrive (Left(App.Path, 1))
 ChDir App.Path
  
 Somedata.Foo = 10
 Somedata.Bar = 8
 Somedata.Str = "Hello"
 
 mSetData Somedata

 Dim Newdata As myStruct
 Newdata.Str = Space(200)
 
 mGetData Newdata

 MsgBox Newdata.Bar, vbOKOnly, "VB6"
 MsgBox Newdata.Foo, vbOKOnly, "VB6"
 MsgBox Newdata.Str, vbOKOnly, "VB6"
  
End Sub


Merci de ton aide
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2010 à 11:52
Que fais tu, en gros, dans la dll ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
21 sept. 2010 à 13:37
En fait, c'est une DLL d'essai, pour l'instant je fais ce que je veux.
Je veux etre sur de bien savoir passer tableaux et Structures avent de généraliser ça dans toutes mes applications VB.

Mais dans cet essai :

1/ Je recupere le pointeur de la structure passée avec "mSetData"
Comme la structure est déclarée dans la DLL, ça comme et les champs sont bien synchro (4 octets par element)

2/ En public j'ai une variable structurée de la meme maniere dans laquelle je copie la variable qui arrive de VB6.

3/ Je modifie la variable public de la DLL a ma convenance (Je lui rajoute une grande phrase, plus grande que celle d'origine, pour etre sur de pouvoir faire ce que je veux sans planter le RAD de VB) et je rajoute 3 et 5 au integer de la structure

4/ Je recupere le pointeur de la nouvelle variable structurée de VB6 par l'intermediaire de "mGetData Newdata" et je lui dit que "Nouvelle Variable VB6 = "Public VariableDll.Str".
Et comme j'avais agrandie la longueur dans VB6 a 200, je pensais que ça passerait, mais non.

Le probleme c'est que si j'ecris diractement a l'adresse de la string VB6, y'a de grandes chances de deborder, car comme je te l'ai dit, normalement je ne devrait pas avoir a mettre " Newdata.Str = Space(200)" dans VB6 car la longueur de retour je ne la connais pas....

Il faudrait pouvoir retourner la string par je ne sais quel moyen, et la reallouer dans VB6 selon sa grandeur...mais alors la...j'ai besoin d'un Cow-Boy
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2010 à 13:52
bien de penser a aligner tes structures.

exemple:

type xxx
a as integer
b as long
end type

vb va coller un 'dummy' de deux octets entre a et b...

blogs.codes-sources.com/renfield/archive/2009/07/16/len-vs-lenb-copymemory-structures-perso-types-etc.aspx

pour ta realloc, as tu regardé SysAllocString ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
21 sept. 2010 à 14:58
Pour la synchro, je crois que ça roule puisque tout arrive tres bien dans la DLL, comme tu me l'a conseillé "ByRef VarString As myStruct"

Pour la realloc...oui j'ai vu que on pouvait creer une BSTR avec ça, alors dire que j'ai regardé....oui
Dire que j'ai compris...ce serait un tant soit peu exagéré

Pour ce retour, crois tu que le fait de donner le pointeur de la nouvelle structure a ma DLL pour qu'elle la remplisse, soit la meilleure solution ????
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2010 à 15:16
oui, en n'oubliant pas de faire le SysFreeString de l'ancien pointeur.

ce sont les APIs utilisées par VB, de toute façon

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
21 sept. 2010 à 15:32
Tu va rire..mais j'ai pas bien compris

Je donne a ma DLL le pointeur de Newdata par la fonction mGetData bon ça on est d'accord, tu viens de me dire que c'est la meilleure methode.

Le probleme reste entier dans ma DLL, si j'ecris dans la string de mon pointeur et que je depasse, ça va pas le faire.

Donc il faut bien que je créé une nouvelle structure dans la DLL et que je puisse la transmettre a VB, ou bien tu veux dire qu'il faut que dans ma DLL j'utilise les API SysAllocString et SysFreeString pour remplacer celle de VB ???
Je n'arrive pas a comprendre la methode qu'il faut utiliser pour pouvoir agrandir cette string sans que VB plante .....
Qui doit faire quoi ??
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2010 à 15:38
SetData => Données dans la dll. Données, pas structure. Exit donc les pointeurs, etc. tu stockes au format de ton language.

GetData => Appel des données.
Long, pas de soucis, on recopie.
String => on fais un sysFreeString sur le Ptr recu puis un SysAllocString pour créer un String (BSTR) tout beau pour VB.

ainsi, le soft VB, derrière, pourra a loisir le manipuler sans interferer (pointeur) avec les données contenues dans la dll

quand viendra l'heure pour VB de liberer la string du UDT, il fera de lui même un SysFreeString et tout le monde sera content

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
21 sept. 2010 à 16:01
Tu va encore plus rire...je crois que j'ai compris

Ouuuuula lalala !!!! si c'est puissant ce que tu viens de dire...
En fait tu veux dire que ma DLL elle peut se taper le boulot de VB a la mano, sans que i voient que du feu

J'suis comme un "ouf"..jamais j'aurais cru ça possible
Qu'une DLL LPSTR puisse creer une variable BSTR
Moi je croyais que si on liberait la string a partir d'un autre process, on plantait VB ..

Bon il me reste plus qu'a essayer ...trop fort cette histoire trop fort.....trop fort.....

Tu part pas en vacance dans les dix dernieres années....car je risque d'avoir encore besoin de toi.

Mille merci, je te tiens au courant, j'essaierais ça demain
Trop fort cette histoire trop fort.....trop fort.....
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2010 à 16:03
Moi je croyais que si on liberait la string a partir d'un autre process, on plantait VB ..


C'est le principe de la dll => mappée dans le même espace mémoire, tous les pointeurs sont donc valides.

NB. J'ai pas testé une ligne de ma petite théorie, a valider, donc.

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
22 sept. 2010 à 18:20
Bon je viens de faire un petit essai....eeeeeet eeeeeet eeeeeet ....ça marche pas

Tu m'a dit de liberer le pointeur envoyé ...c'est fait
Apres j'ai fait un
PtrEnvoyéParVb = SysAllocString(LaNouvelleVariable)

Mais j'ai réféchi, le pointeur envoyé par VB j'ai directement la string pas son pointeur..
Il faut que je pose le nouveau pointeur à la place du pointeur de la string ???
0
Rejoignez-nous