Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 2012
-
15 juil. 2009 à 16:34
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
16 juil. 2009 à 16:35
Bonjour,
Me revoici avec un nouveau problème.
Je me lance dans la création de DLL (pas ActivX)
J'ai modifié mon LINK.exe en suivant les instructions de ce site : http://bbil.developpez.com/traductions/vb6/create-dll/ Je crée différentes fonctions, je compile sans problème.
Je crée un EXE en (VB6 bien sur ^^). Le comportement de la dll est ... bizare.
Pour exemples :
Je crée la fonction dans la dll
Public Function TOTO()
Dim Canal as integer
Canal = freefile
Open App.path & "\DD.log" for Output as #Canal
Print #Canal, "TOTO"
Close #Canal
End function
dans mon exe, j'ai un bouton Command1
dans la methode Click du bouton je met
Call TOTO
Bien entendu j'ai mis le(s) Public Declare qui va(ont) bien
Et ben , quand je lance l'exe et que je click , le fichier log ne se crée pas .
encore + fort, en mode pas a pas , VB6 rentre dans l'instruction Call TOTO et n'en sort jamais ;)
par n'en sort pas j'entends que il y a un point d'arret sur Call TOTO et un a la ligne suivante (End Sub)
Lorsque j'ateinds l'instruction CALL TOTO, le debug prends la main (fait une pause sur le point d'arret)
Je fait F5 et la, ben, le debug ne s'arrete jamais sur le point d'arret du End Sub
Un autre bug que je ne comprends pas :
Dans ma dll
Private p_Msg as string
Private p_On as boolean
Public Function TOTO ()
p_Msg = "TOTO"
p_On = True
End Function
Public Function GetMsg() as string
GetMsg = p_Msg
p_ON = False
End Function
Public Function Is_ON() as boolean
Is_On = p_ON
End Function
Dans l'exe
Un bouton qui fait
Call TOTO
Un Timer a 100ms qui fait
If (Is_ON) then
Me.Caption = GetMsg()
End IF
et la, lorsque je click sur le bouton --> Call TOTO
le timer detect le Is_ON et met a jour le texte
la ou c'est bizard, c'est que le text est tjs UNE SEULE LETTRE. "T"
si au lieu de p_Msg "TOTO" je met p_Msg "LOTO" j'obtient un "L" ...
Si vous savez des connaissances en la matiere, merci de m'en faire profiter ^^
PS le deuxieme test est juste un erzats de comunication, le but principal serrait que ma dll genere un LOG ^^
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
Private p_Msg as string
Public Function TOTO ()
p_Msg = "TOTO"
(...)
End function
ta fonction n'est pas typée
ta fonction ne retourne rien
p_Msg devrait peut-être être déclatée as string*LENGHT
c'est une piste de départ...
tes manipulations ont aussi pu être mauvaises, et ne pas oublier que NATIVEMENT VB ne fait pas de dll non-activeX
(autrement dit il en faudrait peu pour avoir un bug difficile à isoler)
[hr]
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 15 juil. 2009 à 17:49
Je vais expliquer mon projet ^^ peut être que je n'emprunte pas le bon chemin.
J'ai une dll dont je connais les fonctions exportables.
Admetant que cette dll se nome DLL.dll ^^
Elle possède une fonction
A( vA as integer ) as Long
B( vB as integer ) as Long
je ne peux pas toucher au code de la dll mais je doit créer un log de l'utilisation de la dll
Pour ce faire je me propose de faire une dll factice de pond. (c'est un nom que je viens d'inventer cherchez pas sur google ^^)
que mon ancienne dll je la renome old_DLL.dll
et que j'en crée une nouvelle
DLL.dll
qui comporte
Declare fonction o_A(...) Alias "A"
Declare fonction o_B(...) Alias "B"
... --> fleme d'écrire le reste.
J'ai également les fonctions exportables
A et B de la même forme que dans la dll originale (même arguments et type de retour)
mes fonctions feraient la chose suivante
[b]Public Function A ( vA as Integer ) as Long
Dim res as Long
res = o_A(vA)
' ici ecrire dans le log : Cstr(Date) & "| A (" & vA & ") return " & res
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 15 juil. 2009 à 18:41
a juste une chose ^^
je crée un non ActivX parsque sinon l'application qui lance la dll ne "voir pas les points d'entrée" de la dll qui est pourtant dans le meme dossier que le .exe
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
Vous n’avez pas trouvé la réponse que vous recherchez ?
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 16 juil. 2009 à 14:40
Bonjour j'ai été regarder ici
je supose que ce que je doit définir est le "Id de la procédure" dans Avancé. mais que dois-je mettre ?
j'ai essayé avec "Auto" mais lorsque j'explore la dll avec Dependancy Walker, il ne voit pas la methode en question.
Public Function A (ParamArray T() as Variant) as Variant
merci,
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 16 juil. 2009 à 14:52
Heu, pendant qu'on parle de dll, y aurait-il en VB (ou autre langage, je ne suis pas dificile) un moyen de créer une dll pour laquelle "toute fonction serait redirigeé vers une unique"
exemple
DLL.dll
Public Function GENERAL ( ParamArray T() as Variant ) as Variant
'Récupérer le nom de la fonction apelante
'Switch Case sur le nom
' effectuer la fonction
'mettre dans le log ce qui a été fait & vu
End Function
dans un programme EXE.exe
Public Declare Function A Lib "DLL.dll" ( i as integer ) as Long
Public Declare Function B Lib "DLL.dll" (i as String, j as Long) as Boolean
toujours dans l'esprit que l'on ne peut toucher à l'executable, c'est à dire à la déclaration des Imports
(et encore plus loin, trouver le type réel des variables d'entrée de la fonction, pour toute variable dans le
ParamArray T() Variant
)
cordialement
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 16 juil. 2009 à 15:35
c'est pour F2...., pour un activex
dependancy walker sert à voir les points d'entrée des dll, pas à lire l'aide des activex
Pour ma part, si g bien tout compris aux dll , ce que je souhaite c'est que la fonction de la dll soit visible par un
Declare Function A lib "DLL_ds_le_mm_repertoire.dll" (...)...
(activX ou pas je m'en moque, de préférence ce serrait mieux que ca le soit)
Et j'ai remarque que quand Dependancy Walker ne voi pas une fonction dans une dll, le Declare ne marche pas non plus --> l'executable dit "Point d'entree 'bidule' introuvable dans la dll"