cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 2013
-
3 juin 2009 à 09:49
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 2013
-
9 juin 2009 à 13:50
Bonjour à tous
Voila j'aurais aimé avoir votre avis d'expert sur cete opération.
Je veux passer un tableau complet de strings à une DLL standard, que je réalise avec un language qui n'est ni VB ni C.
Cela fonctionne correctement, mais je suis obligé de passer par un tableau de pointeur dans lequel je depose chaque adresse de chaque string du tableau.
J'aimerais juste savoir si quelqu'un aurait une autre méthode.
Voici donc le code qui fonctionne :
Dim TabloString(3) as String
X = 0X X + 1: TabloString(X) "Coucou"X X + 1: TabloString(X) "Je suis un "X X + 1: TabloString(X) "tableau de string"
Dim TabloPointeur() As Long
ReDim TabloPointeur(0 To X) As Long
TabloPointeur(0) = X
For i = 1 To X
TabloPointeur(i) = StrPtr(TabloString(i))
Next
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 juin 2009 à 14:08
Oui remplace la ligne par "ForEver"
En fin de compte c'est juste l'utilisation de l'API pour detecter un escape au clavier
On en a pas besoin car on peut fermer la fenetre avec le bouton
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 juin 2009 à 14:15
Par contre, il faut bien que y'ai un coté un peu negatif car sinon tu va croire que j'adore PureBasic :-)))))))
Comme FRED fait ce qu'il peut pour faire progresser cette splendide bete, il arrive assez souvent que les codes soit incompatibles entre 2 version actuellement c'est la 4.30
Mais un code en 4.20 ou encore pire en 3.94 detectera noir d'erreur de syntaxe.
Mais on lui pardonne deja parce que on l'aime, et aussi car a chaque fois c'est pour ameliorer le language et le rendre encore plus beau et puissant qu'il n'est actuellement
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 juin 2009 à 14:20
Si tu passe par le forum US....et que tu veux voir des codes a ton niveau.
Dans les meilleurs c'est SROD, NETMAESTRO, SPARKIE, GNOZAL, FLUIDBYTE, TROND, FLYPE, KIFFY, TSSOFT ........etc (Liste dans n'importe quel ordre)
SROD a meme créé une lib COMATE PLUS pour donner acces a PB aux objet COM.
Elle est gratuite et open source.
Elle est basé sur DisHelper que tu dois connaitre en C
TSSOFT aussi a créé une lib qui n'est pas open source, mais gratuite pour gerer le OLE, elle s'appelle PureDisHelper basé evidemment sur le meme code C, comme tu peux le lire
Maintenant PB peut jouer dans la cour des grands avec VB main dans la main :-)
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 juin 2009 à 14:29
Ah j'ai oublié...pour compiler en UNICODE
Pour compiler "Compilateur/Option/Activer le suport unicode"
Alors la tu verras aparaitre le tableau.
Mais moi je ne voudrais pas compiler en UNICODE :-(
Car apres toutes mes fonctions dans ma DLL risquent de merder
Vous n’avez pas trouvé la réponse que vous recherchez ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 juin 2009 à 14:29
euh.... j'essaye de te donner un petit coup de pouce, j'en ai jamais fait et pour le moment (même pas pouvoir utiliser d'API), je suis très loin de la conversion
donc pour le moment çà compile mais je voudrais pouvoir utiliser les API
j'ai vu qu'il fallait ajouter des PBI, mais API-Library génère d'autres erreurs empêchant la compilation
as-tu une idée?
ou même, est-ce possible de déclarer manuellement des API ? (sans underscore donc)
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 juin 2009 à 14:45
Le probleme c'est qu'avec les versions demo on ne peut pas utiliser d'API
Les PBI c'est juste des fichiers de code contenant des procedures communes a plusieurs codes que tu peux inclure comme en C en faisant IncludeFile "MonInclude.pbi" pour alleger ton code
On les appelle PBI, mais on pourrait les appeller PB ce serait pareil, ça n'a aucune incidence sur la compilation
Par contre tu devrais peut etre pouvoir appeller directement la DLL par exemple USER32.DLL, SYS32.DLL etc...
Mais il te faut connaitre tous les parametres de chaque API que tu va appeller
En fait j'ai jamais fait.....c'est un peu compliqué pour moi :-(
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 4 juin 2009 à 15:00
Je sais pas si tu te rappelle en PB @ devant un nom de variable c'est son adresse memoire.
Au prealable on reserve 512 octets d'espace memoire en espace
Donc dans cet exemple l'API depose à l'adresse @CurDir$ le chemin
Puis avec Debug on affiche dans le debugger le resultat.
ATTENTION, evidement le debugger n'apparait pas une fois la DLL compilée
Si tu veux faire apparaitre quelque chose, faut utiliser un msgbox au milieu de la DLL
En PB c'est MessageRequester(Titre, Prompt)
Encore une chose, pendant que j'y pense
Un variable string peut etre declarée de deux manieres
Variable$
Variable.s
Dans le premier cas tu devra toujours l'apeller Variables$ car elle est differente de Variable
Dans le second une fois déclarée comme ceci par exemple : Variable.s = "Toto"
Et bien toutes les Variable sans .s seront= "Toto"
Debug Variable
Reponse "Toto"
T'avouera que c'est quand meme balaise ......pour un petit language...... hein :-)
Autant te dire que j'y comprend rien.....mais l'ASM c'est comme le C, je suis amoureux
Remarque c'est comme les tableaux ....on est pas obligé de comprendre pour y trouver beau :-)=)))))
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 juin 2009 à 18:20
quand je fais une dll dans un nouveau projet, elle n'est pas accessible depuis VB : pas de point d'entrée
y'a t-il une spécificité à ajouter avec la compilation?
NB : depuis jaPBe
NB : "pas de point d'entrée" veut dire qu'il n'y a pas de __STDCALL
NB : dans ton zip tu as également un MyDll.LIB et un .EXP, comme pour un activeX par VB6. jaPBe ne m'a pas créé ces fichiers...
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 5 juin 2009 à 07:44
Excuse moi de ma non reponse mais j'avais quitté le boulot et je n'ai pas pu me remettre sur une machine.
Aujourd'hui je suis en reunion, donc je ne vais encore pas pouvoir etre sur une machine :-(
Mais des demain j'espere pouvoir clapoter a nouveau :-)
Le probleme c'est que je ne connais pas JaPBe, j'utilise l'IDE natif.
Ce que je fait souvent, pour tester ma DLL, c'est creer un petit exe avec pure qui l'appelle avec les fonctions
Comme ça je sais deja si ce n'est pas un probleme VB
Je met un msgbox tout de suite au debut de la DLL, et je sais si PB a pu entrer
Comme tu le dit, ce genre de message est synonyme du fait qu'il n'a pas pu entrer dedans, donc le msgbox ne devrait pas servir, mais....
Peut etre une erreur de declaration dans VB
C'est pour ça que je prefere la tester avec Pure qui est bien plus souple et ne necessite pas de declaration
C'est drolement dur de depanner quelqu'un sans voir le code :-(
Deja dur pour un CAID, alors pour brouette comme moi.... :-))))
MyDll.LIB et un .EXP sont créé à la compilation de l'IDE en fait ils ne servent pas à la DLL, ce sont des fichiers qui peuvent servir au cas ou l'on veuille integrer les fonctions de la DLL dans le programme sans avoir à les declarer
Ce qui est bizarre c'est que tu ne puisse recompiler la mienne !!!!
Essaye avec l'IDE natif, je pourrais peut etre mieux te guider, et aussi avec la combine de l'exe pure qui ouvre la DLL pure avant de passer a VB
Ca m'ennerve pour une fois que je trouve quelqu'un de cool comme toi pour m'aider, il faut que j'ai noir de chose qui m'empeche d'etre devant un PC
Je reviens voir au plus tot, l'avancé des travaux :-)
Encore mille merci du mal que tu te donne, je suis abasourdi, un des plus bel exemple d'aide à autruis qu'il m'ai été donné de constater dans le monde de la prog
Je te souhaite une excellente journée et au plus vite je l'espere
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 8 juin 2009 à 14:11
Bon je viens de trouver la solution ......enfin quelqu'un viens de me trouver la solution serait plus juste :-)
Alors je la donne ici, bien que je ne pense pas qu'elle puisse servir beaucoup ici.
Mais on sait jamais
Coté VB
Private Declare Function FenetreTexte Lib "MyDll.dll" (ByVal Titre As String, ByRef Texte As Long) As Long
Private Sub Form_Load()
Dim TabloVB(15) As String
TabloVB(1) = "Hello...i'm KCC"
TabloVB(2) = "i'm locked in VB :-("
TabloVB(3) = "and i want to jump in PB :-)"
For i = 4 To 14
TabloVB(i) = "Line " + Str(i)
Next
Dim TabloPointeur() As Long, MaxTablo As Integer
MaxTablo = UBound(TabloVB)
ReDim TabloPointeur(0 To MaxTablo) As Long
TabloPointeur(0) = MaxTablo
For i = 1 To MaxTablo
TabloPointeur(i) = StrPtr(TabloVB(i))
Next
FenetreTexte "Fenetre tableau", TabloPointeur(0)
End Sub
Du coté PB il fallait rajouter une fonction qui lit le BSTR
Procedure.s PeekBSTR(*BSTR)
lenBSTR =PeekL(*BSTR-4)/2
Dim Char.c(lenBSTR)
For i=0 To lenBSTR
Char(i)=PeekC(*BSTR+i*2)
Next i
ProcedureReturn PeekS(@Char(0))
EndProcedure
Voila, voila.......je remercie encore le grand PCPT de m'avoir soutenu dans cette galere.
Et d'avoir eu cette patience et ce dont de soi que pas beaucoups de personnes possede
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 8 juin 2009 à 15:30
Puisque apparement c'est le fait qu'un tableau soit BSTR et que une string soit convertie en STR lorsqu'elle est passée à une API, ce devait etre la raison pour laquelle j'avais ma string qui passait et pas mon tableau de string
J'aurais aimé pour voir si c'est bien ça convertir mon tableau de String de BSTR en STR
J'ai trouvé ce code qui converti une BSTR en String
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _
Any, source As Any, ByVal bytes As Long)
' convert a BSTR into a VB String
Function StringFromBSTR(ByVal pointer As Long) As String
Dim temp As String
' copy the pointer into the temporary string's BSTR
CopyMemory ByVal VarPtr(temp), pointer, 4
' now Temp points to the original string, so we can copy it
StringFromBSTR = temp
' manually clear then temporary string to avoid GPFs
CopyMemory ByVal VarPtr(temp), 0&, 4
End Function
Mais j'ai pas encore tout compris de son utilisation
toujours est-il que tu passes toujours un tableau de long dans ton exemple....
ok cette fois-ci tu récupères correctement le contenu, mais il me semble que ce n'était pas le but
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 8 juin 2009 à 16:03
Oui tu as raison, j'aurais du....remarque j'aurais pu faire pire et dire que c'etais de moi :-)))))
D'un autre coté personne ne m'aurait cru
De rien pour les fleurs, elles sont vraiment méritée c'est sincere et pas leche botte, car tu es le premier a avoir fait un tel effort :-)
Et ça m'a vraiment épaté que toi, un maitre du C, tu veuille bien venir m'aider dans mon petit monde de PB :-)
Je reconnais que pour quelqu'un qui fait du grand C, on a l'impression de se rabaisser....mais aider les autres c'est aussi se mettre a leur niveau
Avec mon niveau.....tu va avoir drolement mal au dos :-)))))
Tout marche nickel, mais pour etre sur de comprendre, j'ai lu que les BSTR sont des strings avec devant 4 octets qui donnent leur longueur entre autre.
Et je crois avoir compris pourquoi les strings arrivent dans ma DLL, c'est que windows les converti par un temp en STR avant d'arriver dans la DLL, mais pas les tableaux de strings
Le code PB que je t'ai montré s'occupe donc dans la fameuse DLL ou tu as galéré dessus de convertir ce fameux BSTR en STR.
En fait tu avais raison (comme toujours) ce n'etais pas une question d'UNICODE, mais de BSTR que ma DLL n'acceptais pas.
Maintenant tout roule.
Mais comme je suis pas un chiant, et que j'aime bien comprendre bien que je sois monté petit cerveau.
Je me suis dit et si on convertissais la BSTR dans VB au lieu de dans la DLL
C'est à dire envoyer le reel pointeur de la string, au lieu de celui de la BSTR
Alors j'ai tenté de bidouiller ce super code, et j'obtiens a nouveau la premiere lettre de la phrase, sauf si je compile la DLL en UNICODE
Tu as encore raison, j'ai l'impression de tourner en rond.
Mais comme on envoi un tableau de pointeur memoire, ce doit etre un monde de ne pas pouvoir mettre les bons pointeurs, ceux qui pointent sur la STR et non pas la BSTR du tableau , non ????
Voici le code qui donne que la premiere lettre
Il pointe donc bien sur la STR mais pourquoi il s'arrette ???
Function PointerFromBSTR(ByVal pointer As Long) As Long
Dim temp As String
' copy the pointer into the temporary string's BSTR
CopyMemory ByVal VarPtr(temp), pointer, 4
' now Temp points to the original string, so we can copy it
PointerFromBSTR = StrPtr(temp)
' manually clear then temporary string to avoid GPFs
CopyMemory ByVal VarPtr(temp), 0&, 4
End Function
Private Sub Form_Load()
Dim TabloVB(15) As String
TabloVB(1) = "Hello...i'm KCC"
TabloVB(2) = "i'm locked in VB :-("
TabloVB(3) = "and i want to jump in PB :-)"
For i = 4 To 14
TabloVB(i) = "Line " + Str(i)
Next
Dim TabloPointeur() As Long, MaxTablo As Integer
MaxTablo = UBound(TabloVB)
ReDim TabloPointeur(MaxTablo)
TabloPointeur(0) = MaxTablo
For i = 1 To MaxTablo
TabloPointeur(i) = PointerFromBSTR(StrPtr(TabloVB(i)))
Next
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 8 juin 2009 à 16:17
il ne s'arrête pas, ta chaîne est entrecoupée de chr(0) que ta listbox ne sait pas afficher
mais dis moi.... pourquoi tu ne passes-tu pas juste une ligne à ta dll....
tu fais ton appel en boucle sur les items du tableau
(la dll ajoute à la listbox)
puis tu termines sur le caption de la form, la dll affiche ce titre puis la fenêtre complète