Créer une dll qui génèrerait un fichier LOG

Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 - 15 juil. 2009 à 16:34
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Derniè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

11 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 juil. 2009 à 16:47
salut,


[h1]cas 1/h1
Public Function TOTO() 
(...)
End function
ta fonction n'est pas typée
ta fonction ne retourne rien


[h1]cas 2/h1
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]
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
15 juil. 2009 à 17:39
[i]Code Visual Basic :

Public Function TOTO()

(...)

End function

ta fonction n'est pas typée
ta fonction ne retourne rien /i

en effet, ma fonction ne retourne rien, ce pourrait être une sub, (je sais pas si c'est possible une sub exportable)

Cas 2 :
J'ai bien essaye avec le String * 255 mais cela ne semble rien changer

VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
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

A = res
End Function/b

nb : j'aurais pu éviter l'utilisation de res et mettre directement ds A mais je trouve cela plus clair comme cela

bien entendu je fait la même chose pour la fonction B et toute autre

florentcreate
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
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
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 juil. 2009 à 08:18
ta dll servirait d'interface (pas de pont ni même de wrapper)

tout à fait faisable avec un activex
class => sélection procédure => outils => attributs de procédure
++
[hr]
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
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
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
16 juil. 2009 à 14:41
arf mon image n'a pas été mise dans le post ci dessus

elle est à cette adresse :
http://www.monsterup.com/image.php?url=upload/1247747775932.jpg

dsl
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 juil. 2009 à 14:48
c'est pour F2...., pour un activex
dependancy walker sert à voir les points d'entrée des dll, pas à lire l'aide des activex
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
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
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
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"
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 juil. 2009 à 16:35
une vrai dll n'a pas de type paramarray
revoir mes précédents messages, ce que tu tentes de faire n'est que bidouille

te peux faire ta dll qui loguera avant d'appeler, mais faut faire çà propre avec un langage approprié (cpp, delphi)
0
Rejoignez-nous