Page 1 sur 1

PRobleme DLL

Publié : mar. 05/juin/2012 14:58
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

Re: PRobleme DLL

Publié : mar. 05/juin/2012 22:44
par falsam
Il en faut un peu plus pour pouvoir répondre à cette question :)
D'ou vientg la DLL par exemple

Re: PRobleme DLL

Publié : jeu. 07/juin/2012 1:55
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

Re: PRobleme DLL

Publié : jeu. 07/juin/2012 2:35
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

Re: PRobleme DLL

Publié : jeu. 07/juin/2012 11:16
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.

Re: PRobleme DLL

Publié : ven. 08/juin/2012 9:55
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

Re: PRobleme DLL

Publié : sam. 09/juin/2012 7:41
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

Re: PRobleme DLL

Publié : sam. 09/juin/2012 9:41
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

Re: PRobleme DLL

Publié : sam. 09/juin/2012 10:44
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

Re: PRobleme DLL

Publié : mar. 17/juil./2012 11:57
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() ;)