PRobleme DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shade
Messages : 53
Inscription : sam. 05/juin/2010 15:40

PRobleme DLL

Message par Shade »

salut tous le monde
désolé encore de vous sollicité mais je ne trouve pas comment faire pour envoyer un string dans ma DLL puis le récupérer par la suite dans le programme

merci d'avance pour vos réponse
Dernière modification par Shade le sam. 09/juin/2012 9:33, modifié 3 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: PRobleme DLL

Message par falsam »

Il en faut un peu plus pour pouvoir répondre à cette question :)
D'ou vientg la DLL par exemple
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shade
Messages : 53
Inscription : sam. 05/juin/2010 15:40

Re: PRobleme DLL

Message par Shade »

salut
ces une DLL que j'ai faite. est cette dll a besoin d'un transport de string entre le programme est cette dll

exemple :
NOM = Shade

envois a la dll de NOM pour récupérer une image qui correspond a une image puis renvois le résultat au programme pour un dernier traitement
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: PRobleme DLL

Message par falsam »

Code d'une DLL simple à compiler (Compilateur : Shared DLL)

Fonctionnalité
-Une addition
-Une concaténation de string

Code : Tout sélectionner

ProcedureDLL Addition(x,y)
  ProcedureReturn(x+y)
EndProcedure

ProcedureDLL.s ConcateneString(x$, y$)
  ProcedureReturn x$+y$
EndProcedure
J'ai compilé sous le nom de "madll.dll"

Code d'appel. (Il est tard et je suis fatigué :p)

Code : Tout sélectionner

If OpenLibrary(0, "MaDLL.dll")
  Result=CallFunction(0, "Addition", 1,2)  
  Debug Result
  
  Result=CallFunction(0, "ConcateneString", @"Toi",@"Moi")  
  Debug PeekS(Result)
  CloseLibrary(0)
EndIf

EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: PRobleme DLL

Message par Mesa »

Même chose en utilisant les prototypes :

La DLL: dlltest.dll

Code : Tout sélectionner

Global ReturnString1$

ProcedureDLL.i RenvoieString1()
  ReturnString1$="Test1"
  
  *ReturnString=@ReturnString1$
  
  ProcedureReturn *ReturnString
EndProcedure


ProcedureDLL.i RenvoieString2()
  Static ReturnString2$="Test2"
  
  *ReturnString2=@ReturnString2$
  
  ProcedureReturn *ReturnString2
EndProcedure


ProcedureDLL.s RenvoieString3()
  Shared  ReturnString3$
  ReturnString3$="Test3"
  
  ProcedureReturn ReturnString3$
EndProcedure

ProcedureDLL.s Concatene(Chaine1.s, Chaine2.s)
  Shared  ReturnString4$
  ReturnString4$ = Chaine1 + Chaine2
  
  ProcedureReturn ReturnString4$
EndProcedure
Un exemple:

Code : Tout sélectionner

Prototype Proto_RenvoieString1()
Prototype Proto_RenvoieString2()
Prototype Proto_RenvoieString3()
Prototype Proto_Concatene(Chaine1.s, Chaine2.s)

; Remarque : PureBasic ne sait pas renvoyer une string depuis une dll 
;            mais il peut envoyer une string (comme argument) dans une dll

If OpenLibrary(0, "dlltest.dll")
  
  ;cas 1  Global dans dll
  RenvoieString1.Proto_RenvoieString1 = GetFunction(0, "RenvoieString1")  
  Chaine$ = PeekS(RenvoieString1())
  Debug Chaine$
  
  ; cas 2 Static  dans dll
  RenvoieString2.Proto_RenvoieString2 = GetFunction(0, "RenvoieString2")
  Chaine$ = PeekS(RenvoieString2())
  Debug Chaine$
  
  ; cas 3 Shared  dans dll
  RenvoieString3.Proto_RenvoieString3 = GetFunction(0, "RenvoieString3")
  Chaine$ = PeekS(RenvoieString3())
  Debug Chaine$
  
  ; concatene
  RenvoieString4.Proto_Concatene = GetFunction(0, "Concatene")
  Chaine$ = PeekS(RenvoieString4("Salut"," le monde"))
  Debug Chaine$
  
  CloseLibrary(0)
  
Else
  MessageRequester("", "dll absente.")
EndIf
Je pense qu'on doit pouvoir se passer de peekS avec une librairy static (.lib) et Import. A vérifier.

Est-il possible d'utiliser import avec une dll si on utilise dllC dans la dll ?


Mesa.
Shade
Messages : 53
Inscription : sam. 05/juin/2010 15:40

Re: PRobleme DLL

Message par Shade »

Merci tous le monde

je teste sa des que possible je vous tien au courant
mais je pense que la méthode simple me suffit sans prototype
mais je vais teste les deux est je verrai bien

a plus tard est merci encore
Shade
Messages : 53
Inscription : sam. 05/juin/2010 15:40

Re: PRobleme DLL

Message par Shade »

re tous le monde

voila je vient donner les news pour les 2 solution qui mon étais proposer
g sélectionné celle de falsam plus pratique est plus simple a mettre en place pour se que j'ai besoin de faire merci encore pour vos solution
Shade
Messages : 53
Inscription : sam. 05/juin/2010 15:40

Re: PRobleme DLL

Message par Shade »

re dsl je me suis rejoui trop vite lol j'arrive pas a la mettre en place

je vous passe les bout de code si vous pouvez jetter un coup d'oeil car je vois pas l'erreur

sa ces le CARD.dll

Code : Tout sélectionner

Global CARD.s = ""
ProcedureDLL.s Carte(CARD.s)
  
  If CARD = "AH" Or CARD = "AC" Or CARD = "AD" Or CARD = "AS"
     CARD = "1"
    ProcedureReturn CARD
  ElseIf CARD = "KH" Or CARD = "KC" Or CARD = "KD" Or CARD = "KS"
    CARD = "2"
    ProcedureReturn CARD
  ElseIf CARD = "QH" Or CARD = "QC" Or CARD = "QD" Or CARD = "QS"
    CARD = "3"
    ProcedureReturn CARD
  ElseIf CARD = "JH" Or CARD = "JC" Or CARD = "JD" Or CARD = "JS" 
    CARD = "4"
    ProcedureReturn CARD
  ElseIf CARD = "10H" Or CARD = "10C" Or CARD = "10D" Or CARD = "10S"
    CARD = "5"
    ProcedureReturn CARD
  ElseIf CARD = "9H" Or CARD = "9C" Or CARD = "9D" Or CARD = "9S"
    CARD = "6"
    ProcedureReturn CARD
  ElseIf CARD = "8H" Or CARD = "8C" Or CARD = "8D" Or CARD = "8S"
    CARD = "7"
    ProcedureReturn CARD
  ElseIf CARD = "7H" Or CARD = "7C" Or CARD = "7D" Or CARD = "7S"
    CARD = "8"
    ProcedureReturn CARD
  ElseIf CARD = "6H" Or CARD = "6C" Or CARD = "6D" Or CARD = "6S"
    CARD = "9"
    ProcedureReturn CARD
  ElseIf CARD = "5H" Or CARD = "5C" Or CARD = "5D" Or CARD = "5S"
    CARD = "10"
    ProcedureReturn CARD
  ElseIf CARD = "4H" Or CARD = "4C" Or CARD = "4D" Or CARD = "4S"
    CARD = "11"
    ProcedureReturn CARD
  ElseIf CARD = "3H" Or CARD = "3C" Or CARD = "3D" Or CARD = "3S"
    CARD = "12"
    ProcedureReturn CARD
  ElseIf CARD = "2H" Or CARD = "2C" Or CARD = "2D" Or CARD = "2S"
    CARD = "13"
    ProcedureReturn CARD
  EndIf
  
EndProcedure

est voici le code du prog

Code : Tout sélectionner

If OpenLibrary(0,"CARD.dll")
   C1_Joueur.s = "7h"
;C1_Joueur.s est le resultat du code avant
   CARD.s = UCase(C1_Joueur)
   C1_J.s = PeekS(CallCFunction(0,"Carte",@CARD.s))
   Debug C1_J
   CloseLibrary(0)
EndIf
il me marque
" Acces memoire invalide [ erreur de lecture à l'adresse 0 ] "

je vous remercie d'avance pour votre coup de main
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: PRobleme DLL

Message par falsam »

Ta DLL avec un seul ProcedureReturn

Code : Tout sélectionner

ProcedureDLL.s Carte(CARD.s)
  If CARD = "AH" Or CARD = "AC" Or CARD = "AD" Or CARD = "AS"
     CARD = "1"
    
  ElseIf CARD = "KH" Or CARD = "KC" Or CARD = "KD" Or CARD = "KS"
    CARD = "2"
    
  ElseIf CARD = "QH" Or CARD = "QC" Or CARD = "QD" Or CARD = "QS"
    CARD = "3"
    
  ElseIf CARD = "JH" Or CARD = "JC" Or CARD = "JD" Or CARD = "JS" 
    CARD = "4"
    
  ElseIf CARD = "10H" Or CARD = "10C" Or CARD = "10D" Or CARD = "10S"
    CARD = "5"
    
  ElseIf CARD = "9H" Or CARD = "9C" Or CARD = "9D" Or CARD = "9S"
    CARD = "6"
    
  ElseIf CARD = "8H" Or CARD = "8C" Or CARD = "8D" Or CARD = "8S"
    CARD = "7"
    
  ElseIf CARD = "7H" Or CARD = "7C" Or CARD = "7D" Or CARD = "7S"
    CARD = "8"
    
  ElseIf CARD = "6H" Or CARD = "6C" Or CARD = "6D" Or CARD = "6S"
    CARD = "9"
    
  ElseIf CARD = "5H" Or CARD = "5C" Or CARD = "5D" Or CARD = "5S"
    CARD = "10"
    
  ElseIf CARD = "4H" Or CARD = "4C" Or CARD = "4D" Or CARD = "4S"
    CARD = "11"
    
  ElseIf CARD = "3H" Or CARD = "3C" Or CARD = "3D" Or CARD = "3S"
    CARD = "12"
    
  ElseIf CARD = "2H" Or CARD = "2C" Or CARD = "2D" Or CARD = "2S"
    CARD = "13"
    
  EndIf
  ProcedureReturn CARD
EndProcedure
Dans ton code d'appel remplace :

Code : Tout sélectionner

C1_J.s = PeekS(CallCFunction(0, "Carte", @CARD.s))
par (CallFunction au lieu de CallCFunction et Inutile de déclarer à nouveau CARD.s )

Code : Tout sélectionner

C1_J.s = PeekS(CallFunction(0, "Carte", @CARD))
je suis parti du principe que tu étais sous environnement Window.

PS : Ton code "7h" n'existe pas dans ta DLL :p

Pour ta DLL j'ai une préférence pour un Select .... EndSelect. C'est plus sexy :)

Code : Tout sélectionner

ProcedureDLL.s Carte(CARD.s)
  Select CARD
      
    Case "AH", "AC", "AD", "AS"
      CARD = "1"
    
    Case "KH", "KC", "KD", "KS"
      CARD = "2"
    
    Case "QH", "QC", "QD",  "QS"
      CARD = "3"
    
    Case "JH", "JC", "JD", "JS" 
      CARD = "4"
    
    Case "10H", "10C", "10D", "10S"
      CARD = "5"
    
    Case "9H", "9C", "9D", "9S"
      CARD = "6"
    
    Case "8H", "8C", "8D", "8S"
      CARD = "7"
    
    Case "7H", "7C", "7D",  "7S"
      CARD = "8"
    
    Case "6H", "6C", "6D", "6S"
      CARD = "9"
    
    Case "5H", "5C", "5D", "5S"
      CARD = "10"
    
    Case "4H", "4C", "4D", "4S"
      CARD = "11"
    
    Case "3H", "3C", "3D", "3S"
      CARD = "12"
    
    Case "2H", "2C", "2D", "2S"
      CARD = "13"
    
  EndSelect
  
  ProcedureReturn CARD
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: PRobleme DLL

Message par G-Rom »

j'ai pas vu si ton problème est résolu , néanmoins un type string est propre à PB.
si tu veut que ca marche correctement , renvois un tableau de char à la place ,
et lors de l'appel de ta fonction (qui renvois un pointeur sur le tableau de char ) tu fait un joli peeks() ;)
Répondre