Page 1 sur 1

DLL crée avec PB mais ...

Publié : jeu. 10/mai/2012 22:08
par NY152
Bonjour,

J'ai créé une DLL avec PB compilant tout un tas de fonctions qui me sont utiles dans d'autres programmes (codés en VB6 principalement). Seulement voilà, quand j'essaie d'utiliser cette DLL dans un programme PB, ça ne renvois rien ou ça plante totalement.

Etant une quiche en PB (je me débrouille un peu mais bon), j'ai besoin d'un petit coup de pouce.

Code de la DLL (j'ai met pas toutes les fonctions, c'est juste pour comprendre)

Code : Tout sélectionner

ProcedureDLL.I FileSHA1(FileName$)
	If FileSize(FileName$)=-1
		String$="ERREUR"
	Else
		String$=SHA1FileFingerprint(FileName$)
	EndIf
	ProcedureReturn SysAllocStringByteLen_(String$,Len(String$))
EndProcedure
ProcedureDLL AddToRecentsDocuments(FileName.s)
  SHAddToRecentDocs_(2,FileName)
EndProcedure
En VB6, ces fonctions marchent parfaitement

Code : Tout sélectionner

Public Declare Function FileSHA1 Lib "flib.dll" (ByVal FileName As String) As String
Public Declare Function AddToRecentsDocuments Lib "flib.dll" (ByVal FileName As String) As String

Dim sSha1 as String
sSha1 = FileSHA1("E:\Files\archive.zip")
Text1.Text = sSha1 'Et ça fonctionne

Call AddToRecentsDocuments("E:\Files\Maquette.pdf") 'Idem ça marche
En PB, j'ai essayé avec OpenLibrary() mais rien ne fonctionne sur ce que j'ai tenté.

Si quelqu'un peut me donner un début de réponse pour que cela fonctionne (et sur VB6 et sur PB)

D'avance, merci.

Re: DLL crée avec PB mais ...

Publié : jeu. 10/mai/2012 22:34
par falsam
Pour t'aider à comprendre

Code d'une DLL simple à Sauvegarder et a compiler (option compilateur ShareDLL)

Code : Tout sélectionner

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

Code pour le test

Code : Tout sélectionner

Enumeration
  #MaDLL
EndEnumeration

If OpenLibrary(#MaDLL, "madll.dll")
  Debug CallFunction(#MaDll, "Addition", 40, 20)
  CloseLibrary(#MaDLL)
EndIf
Le résultat devrait être 60

Re: DLL crée avec PB mais ...

Publié : jeu. 10/mai/2012 23:18
par NY152
Ça fonctionne. J'ai remarqué que ça fonctionnait plutôt bien dès que c'est du numérique mais dans le cas de mes fonctions, non puisque c'est du string. Toute la difficulté est là.

Re: DLL crée avec PB mais ...

Publié : jeu. 10/mai/2012 23:45
par Backup
pour un string faut renvoyer l'adresse du String , pas le String

compille ça en "test_dll_string_x86.dll"

Code : Tout sélectionner

 Global ReturnString$
  
  ProcedureDLL.i MaFonction(var.s)
    ReturnString$ = "coucou "+var.s
    ProcedureReturn @ReturnString$
  EndProcedure
puis pour appeler la DLL

Code : Tout sélectionner

; appel de la Dll

If OpenLibrary(0, "test_dll_string_x86.dll") 
debug   PeekS(CallFunction(0, "MaFonction", @" Dobro")) ; je passe juste l'adresse de la chaine  ; le signe'@' sert a ça c'est l'equivalent de VarPTR() dans les vieux Basics
endif


Re: DLL crée avec PB mais ...

Publié : jeu. 10/mai/2012 23:58
par Backup
Au fait , la prochaine fois poste dans "Débutant" ;)

ici c'est pas le bon forum

Re: DLL crée avec PB mais ...

Publié : ven. 11/mai/2012 0:01
par NY152
Le code fonctionne sous PB mais pas sous VB6. Maintenant je ne sais pas si l'un empêche l'autre ...

Re: DLL crée avec PB mais ...

Publié : ven. 11/mai/2012 0:08
par Backup
essaye avec
CallCFunction(#Bibliotheque, FunctionName$ [,Parameter1 [, Parameter2...]])

c'est peut etre un probleme de Format

mais respecte bien l'envoie et le retour de l'adresse de la chaine , pas de la chaine directement ;)

Re: DLL crée avec PB mais ...

Publié : ven. 11/mai/2012 0:11
par NY152
OK je vais veiller à ça merci :)