Page 7 sur 9

Re: Mon reve en C Majeur....

Publié : ven. 03/sept./2010 10:50
par swolf
sans vouloir m'incruster dans une conversation d'anciens :mrgreen:
@KCC pourquoi ne pas utiliser ton hyper-sensibilité et tes indéniables talents d'écrivain pour nous pondre un best-seller??

Re: Mon reve en C Majeur....

Publié : mer. 16/mars/2011 23:35
par djes
J'ai trouvé des trucs pour toi:
http://vb.mvps.org/tips/vb5dll.asp
http://xcell05.free.fr/pages/api/utilisation.htm (tu dois déjà l'avoir)
et ça qui te permettra de convertir ces BSTRs. http://www.forums.purebasic.com/english ... 2c#p236896
Avec tout ça tu devrais pouvoir passer des chaines de PB à VB.

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 9:44
par Kwai chang caine
Merci beaucoup DJES, je vais regarder ça de suite 8)

Depuis mes 5 ans que je cherche, j'ai eu a travers mes presques 50 codes qui marchent pas, exploré toutes les possibilité qu'il fallait pas faire :mrgreen:
Je te rassure je ne fait pas que ça, mais chacun de mes programmes me rammenent un jour ou l'autre a ce transfert :?

Mais dernierement, j'ai avancé enfin, car SROD y me disait toujours "Use SafeArray IDIOT :? Use SafeArray it's very simple, since several month i say that to you Use SafeArray!!! :twisted: (Il etait tres amical avec moi) :mrgreen:

"Youse séfaré" "Youse séfaré", il en de bonnes lui, est ce que je lui disait, mange des grenouilles, mange des grenouilles tu verras c'est facile :lol:
Et j'avais essayé, a maintes reprises, les "séfaré" mais pas moyen je scratchais (Bon tu va me dire pour un ex DJ c'est cool :roll:), mais la je scratchais mon RAD VB6, et c'etait pas cool :?

Puis a force de pleurer sur tous les forums C/PB/VB ....une ame sensible a décidé de m'aider, et la miracle, je me suis fait un copain...enfin je suis pas sur, car je lui ai cassé les "roustonbignols" pendant une semaine
Il m'a donné plein de codes pour me guider, et j'ai plus de nouvelles. 8O
SPARKIE a déménagé, SROD a déménagé, "Mon copain" ....en fin de compte y'a pas que les centrales nucleaires qui font demenager...y'a KCC :mrgreen:

Bref, "Mon copain" m'a donné le declic, car il faut pas grand chose pour comprendre...enfin pour moi un peu plus.
Car ce gland de bilou, il ne fait pas que donner un pointeur de SafeArray...non non non, ce serais trop simple, et comme il savait qu'un jour une burne du nom de KCC il esssaierait de devoiler ses parties les plus intimes, il a fait plus compliqué :?

VB quand il envoie un tableau de string, il envoie un pointeur de pointeur de SafeArray 8O
Nadine boudin....j'savais meme pas que ça existait ça..les pointeurs et qui plus est de SafeArray, c'etait deja assez compliqué
Alors "Mon copain" y m'a dit, c'est simple il faut dereferencer le pointeur transmis, c'est a dire abaisser l'elevation d'un niveau :D
Ouaaaaaf Ouaaaaaf Ouaaaaaf Ouaaaaaf !!! mais ouaih..pourquoi n'y ai je pas pensé plus tot :mrgreen: c'etait pourtant si intuitif ..je me demande pourquoi j'ai passé 5 ans la dessus seul devant mon PC

Alors depuis que j'ai compris ça, je suis arrivé a faire les fonctions de transfert de tableaux, mais il me reste le meilleur....les structures :D
Je m'en regale rien que d'y penser...je vais m'y attaquer des ce jour, car melanger les BSTR, les Integer, Les long tout ça sous SafeArray UNICODE , pour y envoyer dans une DLL ASCII qui ne comprend que les LPSTR, et les pointeurs....j'me tripote le clavier d'avance :mrgreen:

Et je lache pas l'affaire des CGI non plus ça a l'air interessant, grace a ton aide, celle de DROOPY et de FREEPUREBASIC d'ici à 2020, KCC il pourra lancer un exe sur son serveur :lol:

En tout cas merci de ta gentillesse et de ton soutiens dans une periode ou KCC y se sent bien seul :(
Je te souhaite une excelente journée

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 9:52
par Kwai chang caine
swolf a écrit :sans vouloir m'incruster dans une conversation d'anciens :mrgreen:
@KCC pourquoi ne pas utiliser ton hyper-sensibilité et tes indéniables talents d'écrivain pour nous pondre un best-seller??
Bon j'sais que c'est un peu tard pour une reponse, excuse moi, mais KCC il a pris des vacances on va dire ..."forcées" :mrgreen:
En temps normal, je repond beaucoup plus vite, voir meme beaucoup trop vite :oops:
Et je repond toujours, que ce soit sur n'importe quel sujet, c'est pour moi une marque de politesse, mais j'avais pas vu ton message, donc si tu repasses un jour par la .. :oops:

Deja tu es le bienvenu, et en plus si c'est pour dire des choses gentilles sur le sujet que je prefere le plus, c'est à dire Mouuuuaaaaaahh !!! :mrgreen:
C'est tres gentil ce compliment qui me va droit au coeur, tu n'es pas le premier à me le dire 8)
Mais bon quand tu vois que ici mes textes sont gratuits et plus personne ne veut les lire ou presque..alors j'ai peur que si on rajoute 20 euros dans la balance, ma librairie soit fermée d'avance :lol:

Mais j'y pense quand meme ne serait ce que sur un site, comme ça ne viendront que ceux qui me supporte, et en plus j'ai toujours tellement de choses à dire, et j'aime tellement faire rire, le rire des autres allegent un court instant ma tristesse :oops:
Des centaines de choses que je n'ai encore jamais évoquées sur ces forums, car comme le disent tout mon entourage, y parait que j'ai pas une vie "normale".....remarque ça explique aussi que je n'ai pas un comportement tres normal non plus :mrgreen:

Encore merci ....et au plaisir de reparler de ce sujet :lol: :lol: :lol:

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 10:16
par G-Rom
re-Explique ton problème KCC , j'ai eu le même soucis en c++ pour faire revenir une chaine de caractère dans le résultat d'une fonction.

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 11:21
par Kwai chang caine
Bah en fait, c'est lié a la gestion de VB6
Il parait que VB.NET ne gere plus du tout comme ça

Les tableaux de VB6 ne sont pas des tableaux comme le C/PB
Ce sont des safeArray, c'est a dire une structure que FRED a d'ailleurs incorporé dernierement dans PB qui donne la taille du tableau, les pointeurs des data, la dimension, et d'autres choses que j'ai pas tout compris
Donc quand les tableaux se passent par reference dans VB, ils ont toutes les caracteristiques avec, et faut reconnaitre que c'est cool.

Fred a un peu fait ça en mettant 8 octet avant le debut du tableau la taille

Le deuxieme soucis c'est que les strings qui sont dans ces tableaux, ne sont pas des strings comme C/PB
Ce sont des BSTR, en PB/C ce sont des LPSTR
La BSTR c'est une string avec devant la longueur de la string

Et pour finir VB utilise communement l'UNICODE, ce que je ne veux pas utiliser dans ma DLL
Parfois il traduit en ASCII selon la declaration de l'appel de la fonction dans la DLL, mais parfois il envoie en UNICODE

Alors quand tu melange tout ça, en passant par exemple une structure, ou voir meme un tableau de structure....
Et ben comme VB6 et C/PB ne parle pas un mot pareil, ça fait comme moi qui parle sur le forum anglais et allemand...c'est pas facile..voir impossible

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 12:17
par G-Rom
C 'est pas impossible, je vais jeter un oeil, tout les langages parlent pareil en finalité, mais utilise un patois propre a chacun.

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 12:53
par Kwai chang caine
Merci GRom

@DJES
J'ai jeté un oeil a tes liens, le premier collait bien a ce que je cherche, le passage des UDT, les structures quoi
J'ai essayé de faire comme ils disent, mais VB y veut pas, il me dit convention d'appel incorrect

Code : Tout sélectionner

Private Declare Function CreationStructureStandard Lib "DllPb.dll" () As Complexe
 Dim VariableStructurer As Complexe
 VariableStructurer = CreationStructureStandard
A croire qu'il veut pas que je rammene un UDT, remarque que c'est qu'a moitié etonnant, car PB il sait retourner que des long
Par contre j'ai vu dans le code C du debut, des trucs que je comprend pas

Code : Tout sélectionner

VariantChangeType(&pUdt->vnt, &pUdt->vnt, NULL, VT_BSTR);
Et c'est peut etre la qu'est l'astuce, peut etre que C sait faire des choses que PB ne sait pas faire
Peut etre que C sait retourner des UDT pour que VB les reconnaisse comme UDT ??

Enfin, je sais que c'est pas votre partie le VB, et comme j'vous dit c'est vraiment un monde a part
Bilou il a tellement voulu simplifier les choses que VB converti, "devine", etc tout en arriere plan
Et seul ceux qui ont beaucoup utilisé VB6 savent comment il s'y prend pour envoyer les parametres etc...

Regardez rien que les variant...c'est un truc a VB, je crois....
Je viens d'apprendre y'a pas vieux, qu'en fait le variant c'est la valeur de la variable et on livre avec, le type de la variable
C'est pour ça que c'est deux fois plus gros un variant....

Enfin c'est plein de joyeuserie comme ça, avec lesquelles je m'eclate depuis 5 ans.
Remarque vouloir marier une brouette avec une baguette de pain....y'a que KCC :oops:

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 12:55
par G-Rom
j'ai regardé vite fait
on peut traduire les SafeArray de cette manière en PB :


Code : Tout sélectionner

Structure SafeArrayBound
  cElements.i  ; Number element of dimension
  lLBound.i    ; Lower bound
EndStructure

Structure SafeArray
  cDims.u
  fFeatures.u
  cbElements.i
  cLocks.i
  *pvData.i
  Dim rgsabound.SafeArrayBound(1) ; Risque de problème ici , PB ne va pas adresser automatiquement la taille
EndStructure



*Pointer.SafeArray = AllocateMemory(SizeOf(SafeArray))
*Pointer = FonctionVbQuiRenvoisUnPointeurDeSafeArray()


For Dimension = 0 To *Pointer\cDims-1
  Debug "Dimension = "+Str(Dimension)
  
  For element = *Pointer\rgsabound(Dimension)\lLBound To *Pointer\rgsabound(Dimension)\cElements

    ElementSize = *Pointer\cbElements
    *ptrElement = *pvData + (element * ElementSize)   ; <---- TON ELEMENT EST LA !
    
  Next 
  
Next   


Evidement , il faut que tu soit un roi du peek / poke pour récupérer les données car le Dim rgsabound.SafeArrayBound(1) dans la structure risque de posé problème
je l'ai juste mis pour simplifier la lecture. pour le moment , tu as une fonction en VB prête a renvoyer un pointeur de SAFEARRAY ?

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:12
par Kwai chang caine
Merci beaucoup GRom

Mais maintenant, pour tout ce qui est des tableaux de strings, je pense avoir trouvé
Mon probleme maintenant c'est les Structures, Je ne sais pas comment les gere VB

En plus je crois que VB les "modifie" en route pour optimiser
Style une structure que tu ecrirais comme ça

Code : Tout sélectionner

Type
 Grom As Integer
 Kcc As "String"
 Djes As Integer
End Type 
VB va la transformer en arriere plan comme ça

Code : Tout sélectionner

Type
 Grom As Integer
 Djes As Integer
 Kcc As "String"
End Type 
Car y'a une histoire d'octets a economiser, il les classe par ordre de grandeur, pour ne pas avoir d'octets de perdu
"Mon copain" il a essayé de m'expliquer.....mais j'ai pas tout compris

En fin de compte y'a tellement de chose a comprendre en VB, car il fait ce qu'il veut
Ce que tu code, n'est pas du tout ce qui sort :?

VB a ses regles, pour soit disant optimiser, et faciliter la vie..c'est vrai si on essaie pas de mettre les mains dans le cambouis :?

Alors si c'est bien vrai qu'il modifie les structures selon une convention a lui, comment s'y retrouver de l'autre coté ??
Il faudrait que je connaisse son raisonnement et que je créé la structure comme il l'optimiserait, comme ça il y touchera pas

En plus actuellement j'essais juste de retourner une structure créée dans PB...et bin ..a moi la peur

Je suis arrivé a faire l'inverse, normal, c'est toujours simple avec PB
Mais pour une fois VB a l'air de convertir en ASCII direct et c'est pour ça que avec PB ça marche

Donc lire une structure VB avec PB...ça ça marche:

Code PB de la DLL

Code : Tout sélectionner

Structure Complexe
 String.s
 Long.l
 Integer.i
EndStructure 

ProcedureDLL AfficheStructure(*Ptr.Complexe)
 
 Phrase$ + Str(*Ptr\Integer) + Chr(13)
 Phrase$ + Str(*Ptr\Long) + Chr(13)
 Phrase$ + *Ptr\String
 
 MessageRequester("", Phrase$)
 
EndProcedure 
Code VB

Code : Tout sélectionner

Public Type Complexe
 String As String
 Long As Long
 Integer As Integer
End Type

Private Declare Function AfficheStructure Lib "DllPb.dll" (Variable As Complexe) As Long

Sub EmmissionStructure()

 Dim VariableStructurer As Complexe
 ChDir App.Path
  
 VariableStructurer.String = "Robert"
 VariableStructurer.Integer = 25
 VariableStructurer.Long = 77777

 AfficheStructure VariableStructurer
    
End Sub
Maintenant, j'arrive pas a faire marcher la reception d'une structure créé par PB

Code VB

Code : Tout sélectionner

Public Type Complexe
String As String
Long As Long
Integer As Integer
End Type

Private Declare Function CreationStructureStandard Lib "DllPb.dll" () As Complexe
Public Declare Sub CopyMemoryStructure Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Complexe, ByRef Source As Long, ByVal Length As Long)

Sub ReceptionStructureStandard()

 Dim VariableStructurer As Complexe, Phrase As String, Pointeur As Long
 ChDir App.Path
  
 VariableStructurer = CreationStructureStandard
 CopyMemoryStructure VariableStructurer, Pointeur, 20
 
 Phrase = Str(VariableStructurer.Integer) + Chr(13)
 Phrase = Phrase + Str(VariableStructurer.Long) + Chr(13)
 Phrase = Phrase + VariableStructurer.String
 
 MsgBox Phrase, vbOKOnly, "Visual Basic - Reception d'une structure Standard de la DLL"
  
End Sub
Code PB de la DLL

Code : Tout sélectionner

Structure Complexe
 String.s
 Long.l
 Integer.i
EndStructure 

ProcedureDLL CreationStructureStandard()
   
 Static VariableStructurer.Complexe
 
 VariableStructurer\Integer = 10
 VariableStructurer\Long = 1457859
 VariableStructurer\String = "Coucou je viens de la DLL et je suis une structure"
  
 ProcedureReturn @VariableStructurer
  
EndProcedure
C'est ce que je disais au dessus a DJES, apparement VB ne veut pas que je retourne directement un UDT 8O
Alors qu'avec l'exemple du premier lien de DJES avec du C, c'est ce qu'il preconisent
Mais le C sait peut etre faire des choses que PB ne sait pas faire
Car j'ai vue la ligne

Code : Tout sélectionner

VariantChangeType(&pUdt->vnt, &pUdt->vnt, NULL, VT_BSTR);
Et ça en PB ?????

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:19
par G-Rom
je ferais plutôt de cette manière au niveau de PB :

Code : Tout sélectionner

Structure Complexe
String.s
Long.l
Integer.i
EndStructure

Global *VariableStructurer.Complexe = AllocateMemory(SizeOf(Complexe))


ProcedureDLL.i CreationStructureStandard()
*VariableStructurer\Integer = 10
*VariableStructurer\Long = 1457859
*VariableStructurer\String = "Coucou je viens de la DLL et je suis une structure"
ProcedureReturn *VariableStructurer
EndProcedure

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:38
par Kwai chang caine
Je vais essayer ...

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:43
par Kwai chang caine
Pas mieux ça crashe VB :(

Code : Tout sélectionner

Public Declare Sub CopyMemoryStructure Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Complexe, ByRef Source As Long, ByVal Length As Long)
Private Declare Function CreationStructureStandard Lib "DllPb.dll" () As Long

Sub ReceptionStructureStandard()

 Dim VariableStructurer As Complexe, Phrase As String, Pointeur As Long
 ChDir App.Path
  
 Pointeur = CreationStructureStandard
 CopyMemoryStructure VariableStructurer, Pointeur, 12
 
 Phrase = Str(VariableStructurer.Integer) + Chr(13)
 Phrase = Phrase + Str(VariableStructurer.Long) + Chr(13)
 Phrase = Phrase + VariableStructurer.String
 
 MsgBox Phrase, vbOKOnly, "Visual Basic - Reception d'une structure Standard de la DLL"
  
End Sub

Code : Tout sélectionner

Structure Complexe
 String.s
 Long.l
 Integer.i
EndStructure 

Global *VariableStructurer.Complexe = AllocateMemory(SizeOf(Complexe))


ProcedureDLL.i CreationStructureStandard()
 
 *VariableStructurer\Integer = 10
 *VariableStructurer\Long = 1457859
 *VariableStructurer\String = "Coucou je viens de la DLL et je suis une structure"
 ProcedureReturn *VariableStructurer
 
EndProcedure

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:45
par G-Rom
Surement à cause de "Global"

essaye ca :

Code : Tout sélectionner

Structure Complexe
String.s
Long.l
Integer.i
EndStructure




ProcedureDLL.i CreationStructureStandard()
*VariableStructurer.Complexe = AllocateMemory(SizeOf(Complexe))
*VariableStructurer\Integer = 10
*VariableStructurer\Long = 1457859
*VariableStructurer\String = "Coucou je viens de la DLL et je suis une structure"
ProcedureReturn *VariableStructurer
EndProcedure

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:53
par Kwai chang caine
Bah non..c'est pas mieux...
Moi je pense plutot que je vais pas lire ou y faut avec le CopyMemoryStructure
Car je remonte bien un LONG dans "Pointeur"
Mais a la ligne

Code : Tout sélectionner

CopyMemoryStructure VariableStructurer, Pointeur, 12
Et ben je fait l'economie du bouton quitter de VB :lol: