Problème de Dll

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Emperor
Messages : 36
Inscription : lun. 28/juil./2008 18:36
Localisation : Québec, Québec

Problème de Dll

Message par Emperor »

Bonjour, j'aurais besoin d'aide pour cette partie de code d'une dll:

Code : Tout sélectionner

  ProcedureDLL AttachProcess(Instance)
  EndProcedure


  ; Called when the program release (free) the DLL
  ;
  ProcedureDLL DetachProcess(Instance)
  EndProcedure


  ; Both are called when a thread in a program call or release (free) the DLL
  ;
  ProcedureDLL AttachThread(Instance)
  EndProcedure

  ProcedureDLL DetachThread(Instance)
  EndProcedure

; Real code start here..
  ;
  
      Global encrypt$ = ""
      Global version.l = 1
      Global decrypt$ = ""
  
 
ProcedureDLL.l About()
    
    ProcedureReturn version.l
EndProcedure

ProcedureDLL.s Encrypt(str$, len)

    For x = 1 To len
        char$ = Mid(str$, x, 1)
        ascii = Asc(char$)
        ascii = ascii + 57

        xchar$ = Chr(ascii)
        encrypt$ = encrypt$+xchar$
    Next x
    ProcedureReturn encrypt$
EndProcedure

ProcedureDLL.s Decrypt(xstr$, len)

    For x = 1 To len
        xchar$ = Mid(xstr$, x, 1)
        ascii = Asc(xchar$)
        ascii = Int(Abs(ascii - 57))
        char$ = Chr(ascii)
        decrypt$ = decrypt$+char$
    Next x
    ProcedureReturn decrypt$
EndProcedure

  If OpenLibrary(0, "MOW.dll")
    CallFunction(0, "About")
    CallFunction(0, "Encrypt", str$)
    CallFunction(0, "Decrypt", xstr$)
    CloseLibrary(0)
  EndIf
Le problème, c'est lorsque j'exécute cette dll à partir de mon programme programmé en Liberty Basic, le programme plante. Et de plus j'ai bien examiné mon code LB et il n'y a aucun problème, le programme plante seulement lors de l'appel de la fonction Encrypt. Alors j'aimerais savoir quelle est la solution à ce petit problème

Merci d'avance :D
Anonyme

Message par Anonyme »

Bonjour & bienvenue , ton code est bon , suremement un problème de convention d'appel , essaye donc ProcedureCDLL au lieu de ProcedureDLL.

et vires cette partie , elle n'a rien a faire dans la dll.
If OpenLibrary(0, "MOW.dll")
CallFunction(0, "About")
CallFunction(0, "Encrypt", str$)
CallFunction(0, "Decrypt", xstr$)
CloseLibrary(0)
EndIf
une dll qui s'appelle elle même , ca na pas de sens.

++
Avatar de l’utilisateur
Emperor
Messages : 36
Inscription : lun. 28/juil./2008 18:36
Localisation : Québec, Québec

Message par Emperor »

merci beaucoup pour la réponse rapide. J'ai fait tout ce que tu m'as dit, mais maintenant le programme plante et je suis obligé de le fermer par le gestionnaire de tâche. Mais ce qui est étrange (et j'ai oublié de le dire dans mon post précédant), c'est que lorsque j'appelle la fonction ABOUT qui me renvoie la version de la dll, j'obtient la version sans aucun problème. Seulement lorsque j'utilise les fonctions ENCRYPT et DECRYPT qui renvoient des strings. Et cela, même si j'utilise PROCEDUREDLL au lieu de PROCEDURECDLL.

Merci d'avance :D
Anonyme

Message par Anonyme »

problème de tpye de retour , renvois un pointeur de chaine à la place.

ProcedureCDLL.l Decrypt(xstr$, len)

For x = 1 To len
xchar$ = Mid(xstr$, x, 1)
ascii = Asc(xchar$)
ascii = Int(Abs(ascii - 57))
char$ = Chr(ascii)
decrypt$ = decrypt$+char$
Next x
ProcedureReturn @decrypt$
EndProcedure
Avatar de l’utilisateur
Emperor
Messages : 36
Inscription : lun. 28/juil./2008 18:36
Localisation : Québec, Québec

Message par Emperor »

désolé, ça ne marche toujours pas. Liberty Basic m'affiche l'erreur:
SMALLTALK/V : a non-continuable protection violation has occured. Check ERROR.LOG file.
dans le fichier ERROR.LOG:

Error log timestamp 7/28/2008 17:47:18
ERROR.LOG
GPF has occurred

START
API method:
Recursive GPF in GPF handler
END

The registers were:
EIP = 0x10001b63
ESP = 0x0012f7a4
EBP = 0x0012f7b4
EAX = 0x00000010
EBX = 0x0012fec4
ECX = 0x00d508f8
EDX = 0x0000000c
EDI = 0x10024000
ESI = 0x00000000
CS = 0x0000001b
DS = 0x00000023
ES = 0x00000023
SS = 0x00000023
End Registers


The registers were:
EIP = 0x09000007
ESP = 0x0291a0b0
EBP = 0x11000004
EAX = 0x020e2a8c
EBX = 0x00000000
ECX = 0x01f70000
EDX = 0x000001d0
EDI = 0x61000002
ESI = 0x020e2a8c
CS = 0x0000001b
DS = 0x00000023
ES = 0x00000023
SS = 0x00000023
End Registers


The registers were:
EIP = 0x020fcf7a
ESP = 0x020e2acc
EBP = 0x01000c03
EAX = 0x021617cc
EBX = 0x021617cc
ECX = 0x0210eaf0
EDX = 0x000001d1
EDI = 0x0210cd1c
ESI = 0x021617cc
CS = 0x0000001b
DS = 0x00000023
ES = 0x00000023
SS = 0x00000023
End Registers


The registers were:
EIP = 0x01001405
ESP = 0x020e4ba8
EBP = 0x01001405
EAX = 0x0215f858
EBX = 0x021617cc
ECX = 0x02119928
EDX = 0x000001d2
EDI = 0x020ecaa4
ESI = 0x0215f858
CS = 0x0000001b
DS = 0x00000023
ES = 0x00000023
SS = 0x00000023
End Registers



Error log timestamp 7/28/2008 17:47:18

The registers were:
EIP = 0x00000000
ESP = 0x020e4ba8
EBP = 0x00000000
EAX = 0x00000000
EBX = 0x00000000
ECX = 0x00000000
EDX = 0x000001d3
EDI = 0x00000000
ESI = 0x00000000
CS = 0x0000001b
DS = 0x00000023
ES = 0x00000023
SS = 0x00000023
End Registers



Error log timestamp 7/28/2008 17:47:18
Message 1001:
a non-continuable protection violation has occurred. Check ERROR.LOG file.
merci d'avance :D
Anonyme

Message par Anonyme »

l'erreur ne me parle pas , donne le code utilisé dans les 2 langages stp.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

P'tet un problème d'unicode? Image
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Essaie d'envoyer un pointeur de chaine, au lieu d'une chaine !
Anonyme

Message par Anonyme »

@Progi , 4 post plus haut :D
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Quelques liens sur LibertyBasic qui peuvent aider ;
http://lbpe.wikispaces.com/ABCs+of+APIs+5 (récupérer des chaînes à partir de fonctions de l'API Windows avec LibertyBasic)
http://www.syberden.net/libertybelle/dll.html (écriture de DLL en C pour LibertyBasic)
Avatar de l’utilisateur
Emperor
Messages : 36
Inscription : lun. 28/juil./2008 18:36
Localisation : Québec, Québec

Message par Emperor »

voici le code liberty basic:

Code : Tout sélectionner

open "32\MOW.dll" for dll as #dll

input message$ 

xmessage$ = encrypt$(message$, len(message$))

print xmessage$

message$ = decrypt$(xmessage$, len(xmessage$))

print message$
close #dll
end


function encrypt$(xstr$, lens)
calldll #dll, "Encrypt",_
xstr$ as ptr, lens as long, encrypt$ as ptr
end function

function decrypt$(xstr$, lens)
calldll #dll, "Decrypt",_
xstr$ as ptr, lens as long, decrypt$ as ptr
end function
de plus, merci gnozal, tu m'as rappellé que LB n'envoyait pas les strings aux variables, mais plutôt des pointeurs... c'est peut-être ça le problème...

alors j'ai modifié mon code PB:

Code : Tout sélectionner

ProcedureCDLL.l Encrypt(*xstr, len)

*Pointeur.String = @*xstr

For x = 1 To len
xchar$ = Mid(*Pointeur\s, x, 1)
ascii = Asc(xchar$)
ascii = Int(Abs(ascii - 57))
char$ = Chr(ascii)
encrypt$ = encrypt$+char$
Next x
ProcedureReturn @encrypt$
EndProcedure


ProcedureCDLL.l Decrypt(*xstr$, len)

*Pointeur.String = @*xstr$

For x = 1 To len
xchar$ = Mid(*Pointeur\s, x, 1)
ascii = Asc(xchar$)
ascii = Int(Abs(ascii - 57))
char$ = Chr(ascii)
decrypt$ = decrypt$+char$
Next x
ProcedureReturn @decrypt$
EndProcedure
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Selon le 2ème document que j'ai posté, LB semble utiliser la convention d'appel stdcall, donc ce serait plutôt ProcedureDLL et pas ProcedureCDLL.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

N'oublie pas aussi que purebasic a besoin d'un octet en plus pour les chaines de caractères (caractère terminal 0)
Anonyme

Message par Anonyme »

Attention a ton utilisation des pointeurs sous pb !

Code : Tout sélectionner

Ficelle$ = "J'adore les strings"
*Pointeur = @Ficelle$

Debug *Pointeur ;<----- RENVOIS L'ADRESSE DU STRING "Ficelle$"
Debug @*Pointeur ;<----- RENVOIS L'ADRESSE DU POINTEUR  "*Pointeur"

; C'est pas pareil ^^
Avatar de l’utilisateur
Emperor
Messages : 36
Inscription : lun. 28/juil./2008 18:36
Localisation : Québec, Québec

Message par Emperor »

est-ce mieux? pourtant le résultat n'est toujours pas concluant...

Code : Tout sélectionner

ProcedureDLL.l Encrypt(*xstr$, lens)

*Pointeur.String = @*xstr

For x = 1 To lens
xchar$ = Mid(*Pointeur\s, x, 1)
ascii = Asc(xchar$)
ascii = Int(Abs(ascii - 57))
char$ = Chr(ascii)
encrypt$ = encrypt$+char$
Next x
*FinalPoint = @encrypt$
ProcedureReturn *FinalPoint
EndProcedure


ProcedureDLL.l Decrypt(*xstr$, lens)

*Pointeur.String = @*xstr$

For x = 1 To lens
xchar$ = Mid(*Pointeur\s, x, 1)
ascii = Asc(xchar$)
ascii = Int(Abs(ascii - 57))
char$ = Chr(ascii)
decrypt$ = decrypt$+char$
Next

*FinalPoint = @decrypt$
ProcedureReturn *FinalPoint
EndProcedure
Répondre