Sortie cash d'une DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Sortie cash d'une DLL

Message par Kwai chang caine »

Bonjour à tous.

Je voudrais savoir comment faire pour sortir d'une DLL à partir de "AttachProcess"

Je voudrais mettre une verification de la machine avant toute utilisation de ma DLL.
Si c'est pas la bonne, elle n'execute pas la fonction demandée.

Mais voila dans AttachProcess, pas de end, et si je met un procedurereturn bah, elle dit quand meme coucou l'effrontée :?

Alors comment sortir avant l'appel de la fonction "message"

Code de la DLL

Code : Tout sélectionner

ProcedureDLL AttachProcess(Instance) 
 
 Buffer.s = Space(1024)
 Bufsize.l = 1024 
 GetComputerName_(@Buffer, @Bufsize) 
 NomMachineActuel.s = Buffer
 
 If NomMachineActuel <> "NomMachine"
  MessageRequester("Test de passage", "Pas la bonne machine", 0)
  
 EndIf
 
EndProcedure

ProcedureDLL Message() 
 MessageRequester("Test de passage", "Coucou", 0)
EndProcedure
Code du programme

Code : Tout sélectionner

OpenLibrary(0, "PureBasic.dll")
CallFunction(0, "Message")
CloseLibrary(0)
Merci de votre aide
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

comme ça par exemple :

Code : Tout sélectionner

ProcedureDLL AttachProcess(Instance)
  Global flag=0
  
  Buffer.s = Space(1024)
  Bufsize.l = 1024
  GetComputerName_(@Buffer, @Bufsize)
  NomMachineActuel.s = Buffer
  
  If NomMachineActuel <> "NomMachine"
    MessageRequester("Test de passage", "Pas la bonne machine", 0)
   flag=1
  EndIf 
EndProcedure

ProcedureDLL Message()
  If flag=0
    MessageRequester("Test de passage", "Coucou", 0)
  EndIf 
EndProcedure

Code : Tout sélectionner

OpenLibrary(0, "PureBasic.dll")
CallFunction(0, "Message")
CloseLibrary(0)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci DOBRO de ta reponse.

Y'a pas un moyen plus simple que de rajouter à chaque procedure de la DLL une condition de sortie. 8O

Je pensais qu'il existait un style de END, ou PROCEDURERETURN, mais à la sauce DLL :D

A moins qu'il ne faille pas faire mon test dans "AttachProcess" :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

en fait ici une seul procedure te suffit !!

tu compile ça en dll

Code : Tout sélectionner


ProcedureDLL Message() 
  Buffer.s = Space(1024)
  Bufsize.l = 1024
  GetComputerName_(@Buffer, @Bufsize)
  NomMachineActuel.s = Buffer 
  If NomMachineActuel <> "NomMachine"
    MessageRequester("nom",  NomMachineActuel.s, 0)
    MessageRequester("Test de passage", "Pas la bonne machine xx", 0)
    ProcedureReturn
  EndIf 
  
  ; c'est la bonne machine
    MessageRequester("Test de passage", "Coucou", 0)
EndProcedure 
et ceci pour l'appel

Code : Tout sélectionner

OpenLibrary(0, "PureBasic.dll")
CallFunction(0, "Message")
CloseLibrary(0)


et c'est tout pas besoin d'ajouter X procedure pour faire une dll :D


la doc dit :
Pour les programmeurs avancés, il existe 4 procédures spéciales qui sont appelées par Windows lorsque l'un des évènements suivants survient:
- une DLL est attachée à un nouveau process
- une DLL est détachée d'un process
- une DLL est attachée à un nouveau thread
- une DLL est détachée d'un thread

Pour gérer cela, il est possible de déclarer 4 procédures spéciales nommées: AttachProcess(Instance), DetachProcess(Instance), AttachThread(Instance) et DetachThread(Instance). Cela signifie que ces 4 noms sont réservés et ne peuvent être utilisés par le programmeur pour d'autres usages.
les procedure du style AttachProcess(Instance)
ne sont valable que dans ce cas !! sinon tu ne les emplois pas .. :D

il te faut juste créé une procedure par fonction (procedure=fonction) !! :D
le regroupement de ces procedures(fonction) s'appelle une "Librairie" (DLL) :D

considère une fonction(procedure) comme un livre ou magasine que tu demandera au libraire .. (un appel de fonction..)

la Dll (le magasin , la librairie) regroupe autant de procédure (livres)
qu'il y a de fonctions(livres) que l'on appelle par leur nom (m'sieur le libraire, je voudrai le livre appelé Message() svp ? ) !!

c'est exactement ce que tu fait avec :

Code : Tout sélectionner

OpenLibrary(0, "PureBasic.dll") ; on entre dans le magasin
CallFunction(0, "Message") ; on demande le livre Message() 
CloseLibrary(0) ; on se barre sans payer !!


Taillebite est un utilitaire pour transformer ceci en librairie integrable a Purebasic :D voila tout

sinon ce sont des librairie "externe" au prg, autrement appelées DLL :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci DOBRO de tes explications claires et détaillées.
Tu as raison quitte à mettre un test par fonction, autant oublier attachprocess.

J'avais pensé à attachprocess car c'est la premiere fonction, je crois qui s'ouvre, sans qu'on l'appelle, dans une DLL.
Un peu comme le form_load de VB.
Et ça m'évitait de rajouter un test par procedure.

Mais vu que FRED n'a pas prévu, la sortie d'attachprocess, et ben il me reste que cette solution.

Encore merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit : Mais vu que FRED n'a pas prévu, la sortie d'attachprocess, et ben il me reste que cette solution.

Encore merci
une procedure reste une procedure !! on en sort avec ProcedureReturn
quelque soit la procedure !!

le probleme c'est que attachprocess n'est appelé que lors de cet evenement precis (en general c'est le system qui l'appel)!!

tu as declaré une fonction Message() elle est a toi tu en fait ce que tu veux...

et bien sache que le "attachprocess" est une fonction déclaré par le system, c'est pas toi qu'il l'utilise , c'est le system !!

tu peux mettre une condition dans un attachprocess, elle n'aura lieu QUE LORSQUE CET EVENEMENT AURA LIEU , en clair si tu ne fait rien de special
du genre envoyer cet evenement, en utilisant un event_message
La procedure attachprocess, n'aura jamais lieu !!


en clair, pour les besoins de tout les jours, ces procedures, ne nous servent pas vraiment, c'est juste une possibilité que Fred a ajouté !! ..

alors oublie moi ces 4 procedures special, et utilise les tiennes :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Petit scarabé a bien compris, ce que tu voulais me dire.
Il en sera fait selon ta volonté :D :lol:

T'as vu, je l'ai pas dit le mot que tu veux pas que je dise :D , je me suis retenu, et pourtant ça me grattais :lol:

En tout cas merci beaucoup de ton aide 8)
Répondre