PRobleme DLL
PRobleme DLL
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
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.
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: PRobleme DLL
Il en faut un peu plus pour pouvoir répondre à cette question 
D'ou vientg la DLL par exemple

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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: PRobleme DLL
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
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
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: PRobleme DLL
Code d'une DLL simple à compiler (Compilateur : Shared DLL)
Fonctionnalité
-Une addition
-Une concaténation de string
J'ai compilé sous le nom de "madll.dll"
Code d'appel. (Il est tard et je suis fatigué :p)
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
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: PRobleme DLL
Même chose en utilisant les prototypes :
La DLL: dlltest.dll
Un exemple:
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.
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
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
Est-il possible d'utiliser import avec une dll si on utilise dllC dans la dll ?
Mesa.
Re: PRobleme DLL
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
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
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
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
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
est voici le code du prog
il me marque
" Acces memoire invalide [ erreur de lecture à l'adresse 0 ] "
je vous remercie d'avance pour votre coup de main
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
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
" Acces memoire invalide [ erreur de lecture à l'adresse 0 ] "
je vous remercie d'avance pour votre coup de main
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: PRobleme DLL
Ta DLL avec un seul ProcedureReturn
Dans ton code d'appel remplace :
par (CallFunction au lieu de CallCFunction et Inutile de déclarer à nouveau CARD.s )
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)
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
Code : Tout sélectionner
C1_J.s = PeekS(CallCFunction(0, "Carte", @CARD.s))
Code : Tout sélectionner
C1_J.s = PeekS(CallFunction(0, "Carte", @CARD))
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: PRobleme DLL
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()
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()
