Page 8 sur 9

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 13:59
par Kwai chang caine
Bon je viens de verifier, la DLL envoie bien le meme long que je recois dans "Pointeur"

Code : Tout sélectionner

Pointeur = CreationStructureStandard
Donc je vais bien lire le bon pointeur

Mais par contre Copymemory est peut etre mal parametré "Byval/Byref" ??

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 14:06
par G-Rom
je ne suis pas spécialiste du tout en VB , a vrai dire , ce langage est à gerbé , mais passons.
Ca plante à quelle niveau du code VB ?
tu peut le balisé à coup de debug pour voir ou ca crash ?

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 14:09
par G-Rom
y a pas de pointeur en VB banane :D

essaye ca :
CopyMemoryStructure varPtr(VariableStructurer), Pointeur, 12

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 14:33
par djes
Ben moi ça marche avec VB sous Access97

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 "f:\documents\code\kcc\DllPb.dll" (Variable As Complexe) As Long
Private Declare Function ModifieStructure Lib "f:\documents\code\kcc\DllPb.dll" (Variable As Complexe) As Long

Sub EmmissionStructure()

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

AfficheStructure VariableStructuree

ModifieStructure VariableStructuree

Phrase = Str(VariableStructuree.Integer) + Chr(13)
Phrase = Phrase + Str(VariableStructuree.Long) + Chr(13)
Phrase = Phrase + VariableStructuree.String

MsgBox Phrase, vbOKOnly, "Visual Basic - Reception d'une structure Standard de la DLL"
   
End Sub
Code PB

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 

ProcedureDLL ModifieStructure(*Ptr.Complexe)

  *Ptr\Integer = 10
  *Ptr\Long = 25
  *Ptr\String = "Roudou" ;attention à ne pas dépasser la taille de la chaine VB d'origine!!!!

EndProcedure 
Seule limite, la taille de la chaîne semble fixe. Faut-il essayer l'unicode?

EDIT: commentaire sur "roudou"

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 14:48
par Kwai chang caine
@GRom
je ne suis pas spécialiste du tout en VB , a vrai dire , ce langage est à gerbé , mais passons.
Je crois que pour une fois...tu n'es pas assez agressif :lol:
Gerbé c'est un petit mot...mais bon..y va y avoir des nouvelles regles dans le forum alors autant ne pas utiliser ces mots qui pourraient les violer
:lol:
Ca plante à quelle niveau du code VB ?
tu peut le balisé à coup de debug pour voir ou ca crash ?
Apparement pas dans la DLL car elle envoie bien le pointeur, comme je te l'ai dit plus haut :roll:
y a pas de pointeur en VB banane
Aaaaah enfin "quinquin" qui m'apprecie a ma juste valeur...ça fait plaisir :mrgreen:
T'as raison, mais je crois que l'instruction VarPtr sert à lire pas a ecrire, il veut pas ce bouffon ni BYVAL ni BYREF
J'ai donc essayé ça et pas mieux

Code : Tout sélectionner

 Pointeur = CreationStructureStandard
 PointeurStructure = VarPtr(VariableStructurer)
 CopyMemoryStructure PointeurStructure, ByVal Pointeur, 12
@Bonjour DJES....
Et pourquoi que ça marche jamais avec KCC :?
Je vais essayer...merci

Non non, je ne peux pas passer en UNICODE, c'est la le probleme
Car ma Dll a 800 fonctions et certaines d'elles ne le supporte pas, je prefere rien toucher et rester dans le mode par defaut de PB

Et pis dis donc...c'est quand meme pas a PB de se plier à cette daube de VB...ce serait un monde :mrgreen:

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 15:21
par Kwai chang caine
Bon bah je viens d'essayer chez moi ça plante :(
Qu'on puisse pas augmenter la string, c'est normal, a mon avis, car c'est VB qui la gere et si on lui modifie sans son accord, il aime pas bien
Alors j'ai mis un MsgBox dans VB

Code : Tout sélectionner

AfficheStructure VariableStructuree
MsgBox Str(VarPtr(VariableStructuree))
ModifieStructure VariableStructuree
Et un Msgbox dans la DLL

Code : Tout sélectionner

ProcedureDLL ModifieStructure(*Ptr.Complexe)
MessageRequester("Essai", Str(*Ptr.Complexe))
  *Ptr\Integer = 10
  *Ptr\Long = 25
  *Ptr\String = "Ribert"
  ProcedureReturn #False
  
EndProcedure 
Et la c'est un truc de dingue la valeur n'est pas la meme
C'est donc encore VB qui change la valeur en route...

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 15:30
par G-Rom
C'est normal banane :D

Code : Tout sélectionner

Str(VarPtr(VariableStructuree))
Ca te renvois l'adresse de "VariableStructuree" , pas sa valeur.

Code : Tout sélectionner

ModifieStructure VariableStructuree
Là , tu lui passe la valeur de la variable , pas son adresse.


Tu te brêle les pinceau avec les pointeurs / adresse mon ami. :D

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 15:35
par djes
Où est-ce que ça plante? Tu utilises comment VB, quelle version? Ah! Et mets Roudou au lieu de roudoudou, car sinon ça dépasse!!!!

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 16:07
par Kwai chang caine
@GRom
Là , tu lui passe la valeur de la variable , pas son adresse.
C'est possible, mais pas si sur, car en VB tout depend de la declaration du haut

Code : Tout sélectionner

Private Declare Function ModifieStructure Lib "DllPb.dll" (Variable As Long) As Long
Ca veut dire que quand tu ecris

Code : Tout sélectionner

ModifieStructure VariableStructuree
Tu le passe BYREF, car le BYREF est le mode par defaut en VB6
si y'a rien d'ecrit devant la variable c'est donc un BYREF, donc normalement on passe l'adresse
A ce que j'ai compris si tu ecris

Code : Tout sélectionner

ModifieStructure Byval VariableStructuree
La tu passe la valeur de VariableStructuree
Et c'est pareil si tu ecris la declaration comme ça

Code : Tout sélectionner

Private Declare Function ModifieStructure Lib "DllPb.dll" (Byval Variable As Long) As Long
La tu passe toujours la valeur de VariableStructuree
Donc si tu ecris

Code : Tout sélectionner

Private Declare Function ModifieStructure Lib "DllPb.dll" (Byval Variable As Long) As Long
ModifieStructure VariableStructuree
Tu passes aussi la valeur car dans la declaration le BYVAL prevaut
Tu vois comment c'est simple VB6 :mrgreen:

@DJES
Où est-ce que ça plante?
Ca plante dans la deuxieme fonction Modifie
C'est normal parce que la lecture, j'avais dit que ça marchait
Et comme j'ai dit plus haut, y doit y avoir un bins dans les pointeur/valeur un peu comme dit GRom
Car la valeur que j'envoie est pas la meme des deux cotés...mais pourquoi ??
Tu utilises comment VB, quelle version?
Le VB6 SP6, le vrai l'unique, le merdique :lol:
Pas VBA mais normalement si ça marche en VBA ça devrait marcher en VB6, c'est bizarre :roll:
Ou alors VB6 est moins protégé que VBA
Ah! Et mets Roudou au lieu de roudoudou, car sinon ça dépasse!!!!
Oui j'avais vu, car ça c'est tout le debut de mon histoire de y'a deux trois ans.
Au debut je faisais comme toi pour les tableaux de strings, et ça marchait
Sauf que SROD y m'a passé une branlé, en me disant qu'il faut utiliser les pointeurs comme ça que pour les lire
Surtout ne jamais tenter de les modifier, ça peut etre dangereux, et encore moins agrandir et reduire, car la table d'alloc de VB n'est pas au courant quand tu modifies ses variables et elle a tout bien gardé les grandeurs des variables etc..
Si tu lui reduit, mais surtout agrandi et ben on va lire n'importe ou dans la memoire..et la on invente un nouveau bouton quitter super rapide pour VB6 :lol:
C'etait pour les tableaux de strings, mais je suppose que pour les structures c'est pareil :roll:

La methode qu'il m'avait donné etait de lire la tableau dans la DLL avec le pointeur envoyé comme tu as fait au debut, de creer un nouveau tableau, de copier le tableau de VB dans le tableau de la DLL, comme ça ils ont chacun un tableau identique referencé dans leur table
De modifier ou faire ce qu'on veut avec le tableau de la DLL, puis retourner l'adresse tableau de la DLL
A son tour VB recupere l'adresse tableau de la DLL, fait un copymemory de ce dernier dans un troisieme tableau
Au final tu as 3 tableaux, le premier, le second dans la DLL, et le troisieme a nouveau dans VB6 en retour.

Ca c'est pour les tableaux de strings...mais encore une fois je pense que pour les STRUCTURES ce doit etre pareil non ??

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 16:45
par djes
Oui je me rappelle, mais là c'est bon, ça n'a rien à voir. La DLL est chargée par le programme. Tant que tu restes dans les clous de l'espace mémoire réservé par VB, tu n'auras pas de souci.

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 17:17
par Kwai chang caine
J'ai trouvé un exemple donné par microsoft et en français, mais j'ai pas mieux compris pour ça.
Vous qui comprenez le C
http://support.microsoft.com/kb/171583

Mais ce que j'aurais voulu faire c'est pas envoyer le pointeur de VB, mais creer une structure, la remplir dans la DLL et la lire dans VB.
En fin de compte l'inverse de ce qu'on a fait

Re: Mon reve en C Majeur....

Publié : jeu. 17/mars/2011 19:14
par G-Rom
Juste une question comme ca , dans quel but utilise tu VB ?
car , un "langage" , que dis-je , un dialecte primitif qu'est le VB , pourquoi ne change tu pas carrément pour le C ?
c'est quand même plus simple , non ?

Re: Mon reve en C Majeur....

Publié : ven. 18/mars/2011 9:02
par Kwai chang caine
Mon bon Grom, cela doit faire a peu pret la 10e fois que je l'explique en long en large en travers sur ce forum :mrgreen:
Et cela m'etonnais que tu ne me pose pas la question, suite a ta reaction quelques posts plus haut :lol:

Parce que je t'aime "beaucoup bien", je vais faire une 11e edition.

Du temps du moyen age ...non..j'vais pas remonter si loin :lol:
J'ai toujours programmé Basic meme sous DOS, je n'ai jamais croisé le C
Donc naturellement, j'ai fini avec VB6 apres etre passé par GFA Basic, QB45

J'ai essayé de quitter le VB6 a cause de ses runtimes, et de sa non portabilité (Impossible a mettre sur une clef), mais surtout je voulais faire des DLL.(J'adore les DLL 8) )
Hors VB6 en plus d'etre une daube sans nom, est incapable meme les dernieres version DOTNET d'aujourd'hui de faire une DLL standard :?
Il fait des daubes, qui s'appelle DLL, mais qui sont des ActiveX (Obligation inscription dans la BDR, etc ....bref des daubes)

J'ai donc cherché un autre basic, j'ai essayé plein de betes, LibertyBasic, ...et je me rappelle plus pour les autres (je me rappelle jamais de rien d'ailleurs :oops: )
Un jour j'ai essayé PB et surtout ça je m'en rappellerais toute ma vie, car j'suis tombé sur le cul, un code de MISHA je crois
Un skinnage de form, je croyais ça impossible, avoir une form de la forme d'une image 8O

J'ai donc continué avec notre PB d'amour
Quand j'ai eu le bonheur de croiser votre route, et d'etre accueilli si gentiment par DOBRO, toi, Brossden, FLYPE, etc... j'ai en plus trouvé des copains, chose que je n'avait pas dans ce domaine, j'avais appris l'informatique tout seul dans ma chambre ou je restais enfermé 24/24 par passion, (Internet existait pas..meme pas le nitel..) et dans le monde ouvrier et à cette epoque faire de l'informatique c'etait "jouer", et je n'ai jamais eu la chance de croiser des "tronches comme vous" (Le premier qui me dit que je fait le calimero, y va entendre le reste :?)

J'etais pretentieux, je vous rassure je le suis toujours dans certains domaines, on quitte pas un defaut qui vous gagne :lol:
Mais la j'en ai pris plein la gueule, et je reste tres poli, voir tous ces codes de ouf, vous voir parler de plein de truc que je comprenais meme pas le titre (et ça continue toujours actuellement d'ailleurs)
Me rendre compte de ce qu'etait PB, et tous ses avantages que je recherchais en un (Portabilité USB, petit, DLL, puissance, rapidité, simplicité.....) le forum FR avec que des super copains...(Enfin surtout au debut :() et pour finir le US avec des CADORS de la prog d'un niveau que je n'aurais meme pas révé.

Bref tout etait rose dans le nouveau monde de KCC, qui a donc décidé d'abandonner VB6
J'ai donc programmé 1/2 ans sans presque toucher VB

Mais voila, j'ai eu des problemes de santé, qui m'ont obligé d'arreter ma carriere de 25 ans d'ouvrier, je viens d'avoir la medaille :mrgreen:
Ne sachant pas ou me foutre, mes patrons m'ont donc demandé si je parlais plusieurs langues, pour pouvoir coller les timbres dans les bureaux :lol:
Et la je leur ai dit que j'aimais la programmation depuis l'age de 14 ans dans ma chambre, alors ils m'ont jeté dans un service d'informatique.

Voila, donc depuis 5 ans, j'essaie de depanner tout le monde, c'est pourquoi j'ai autant de sujets d'un eclectisme ostentatoire :lol:
Car on me demande des fois du reseau, des fois un serveur, des fois de modifier les proprietés d'une machine, de piloter des emulateur IBM, etc...
J'ai donc l'avantage de programmer dans tous les dommaines, et vous le desavantage d'essayer de m'aider :oops:

Bref....bref ...bref..putain KCC, faut que j'aille pisser, alors pourquoi VB6..putain pourquoi merde ??? (Pensée de GRom) :lol:

Et ben maintenant que le decors est planté, dans ma boite OFFICE est roi comme dans toutes les grandes boites.
EXCEL et ACCESS regnent en roi, et ils ne veulent pas entendre parler d'autre chose

J'ai donc payé moi meme sur mon salaire d'ouvrier ma license de PB, mais aussi la license de VB6, car ici VB6 est le roi des langages, je suis le seul a l'utiliser, ici c'est encore plus top tout le monde travaille avec VBA le grand :mrgreen:
Donc je n'ai pas le choix, malgré toute ma bonne volonté, je suis lié a VBA/VB6 pour la vie, enfin tant que VBA fera partie d'OFFICE.

Mais KCC c'est un teigneux...il a pas laché l'affaire, ses patrons ils ont voulu le forcer a VBA, et il a dit non avec ses petits points boudinés, il a contre les ordres installé VB6, et en plus PB, et sans l'accord des superieurs il code avec deux langages "interdits" chez nous
Mais bon, il sort des giciels qui marchent bien, sans bug, car il met tellement longtemps a les faire :lol:
Alors on lui fout la paix puiqu'il est utile et comme le disait mon copain GEBONET, le client y s'en fou avec quoi l'exe il est fait, l'important c'est qu'il marche et qu'il fasse ce qu'on a demandé 8)

Voila mon bon GRom, tu peux aller pisser :mrgreen:

Re: Mon reve en C Majeur....

Publié : ven. 18/mars/2011 11:00
par Frenchy Pilou
Un genre de Mario Bros de l'informatique en somme! :wink:

Re: Mon reve en C Majeur....

Publié : ven. 18/mars/2011 11:04
par Kwai chang caine
Bon les copains...je sais pas si en fait ça vous interesse, ou bien si vous m'avez aidé que par générosité humaine ou voir meme par amour pour moi :mrgreen:
Mais je vais partir plutot sur la premiere option pour ne mettre dans la gene personne :lol: :lol:

Donc j'ai cherché, et ne me demandez pas comment j'ai fait, car des fois je me dit qu'un clavier en braille me serait de la meme utilité que le miens tellement j'essaie n'importe quoi, "a l'aveugle" :oops:

D'un autre coté, faut quand meme reconnaitre la performance des programmeurs CROSOFT qui sont arrivé a faire un langage que tu lui rentre n'importe quoi ou presque, tu lui declare rien et y se demmerde 8)

Bref, je suis arrivé a remonter ma structure, alors pour vous, et peut etre pour un autre futur abruti comme moi, qui un jour aura besoin de marier une chevre et un choux, voila ce que j'ai pondu.

Code : Tout sélectionner

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal Size As Long)
Dim VariableStructurer As Complexe, Phrase As String, PointeurDll As Long, PointeurElement As Long
 ChDir App.Path
   
 PointeurDll = CreationStructureStandard
 
 CopyMemory PointeurElement, ByVal PointeurDll, 4
 VariableStructurer.String = Space$(lstrlen(PointeurElement))
 lstrcpy VariableStructurer.String, PointeurElement
  
 CopyMemory VariableStructurer.Long, ByVal PointeurDll + 4, 4

 CopyMemory VariableStructurer.Integer, ByVal PointeurDll + 8, 4
 
 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"
Notez quand meme la ligne

Code : Tout sélectionner

Private Declare Sub CopyMemoryLong Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal Size As Long)
Si c'est pas de l'aveugle ça....j'my connais pas, vous pouvez y mettre n'importe quoi dedans le ANY, et VB se debrouille a convertir en pointeur long et encore faut il qu'il envoie le bon pointeur :mrgreen:

Code : Tout sélectionner

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
Maintenant, c'est "zarebi" parce que j'arrive pas a poser tout dans la structure d'un coup.
Ca marche mais en deplacant moi-meme le pointeur et faisant CopyMemory a chaque fois :roll:
C'est un peu normal parce que la structure elle contiens les valeurs, pas les pointeurs, je n'ai pas compris comment poser les pointeur dans la structure..enfin c'est deja un debut, j'vais pas me plaindre [Calimero Off] :wink:

Y'a encore un truc que j'ai pas du "Pécho", j'utilise ce mot parce que il est rigolo, et que vu que je peux pas l'utiliser en parlant de gonzesse :lol: