Page 1 sur 2

Problème de Dll

Publié : lun. 28/juil./2008 18:42
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

Publié : lun. 28/juil./2008 19:43
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.

++

Publié : lun. 28/juil./2008 20:46
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

Publié : lun. 28/juil./2008 21:09
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

Publié : lun. 28/juil./2008 22:48
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

Publié : mar. 29/juil./2008 10:23
par Anonyme
l'erreur ne me parle pas , donne le code utilisé dans les 2 langages stp.

Publié : mar. 29/juil./2008 10:32
par djes
P'tet un problème d'unicode? Image

Publié : mar. 29/juil./2008 11:31
par Progi1984
Essaie d'envoyer un pointeur de chaine, au lieu d'une chaine !

Publié : mar. 29/juil./2008 11:50
par Anonyme
@Progi , 4 post plus haut :D

Publié : mar. 29/juil./2008 12:50
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)

Publié : mar. 29/juil./2008 13:11
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

Publié : mar. 29/juil./2008 14:35
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.

Publié : mar. 29/juil./2008 14:45
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)

Publié : mar. 29/juil./2008 19:13
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 ^^

Publié : mer. 30/juil./2008 17:22
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