Récupération de PChar renvoyés par une DLL

cs_daniel Messages postés 3 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 26 mars 2002 - 21 févr. 2002 à 09:54
hadjdahou Messages postés 3 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 15 juillet 2004 - 15 juil. 2004 à 12:47
J'ai écrit une DLL en Delphi 5 devant me renvoyer des chaînes de caractères. Je les ai codés en PChar. Tout ce passe bien lorsque j'appelle cette DLL avec une appli écrite en Delphi ou en Windev, mais lorsque je la teste en Visual Basic sous Excel, cette fonction DLL ne me retourne rien!...
SOS!... Je ne sais plus comment m'en sortir, cette DLL devant être utilisée dans plein de language
Merci à l'avance

4 réponses

DelphiCool Messages postés 455 Date d'inscription mardi 24 juillet 2001 Statut Membre Dernière intervention 10 mars 2009
21 févr. 2002 à 10:43
fait voir comment ta declarer cette dll
dans delphi et dans les autres langages
0
cs_daniel Messages postés 3 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 26 mars 2002
21 févr. 2002 à 16:07
Merci à l'avance pour l'aide que tu pourras mapporter.
La fonction DebugDllPascal1 (avec un seul paramètre) passé fonctionne très bien
par contre la fonction DebugDllPascal5 (avec 5 paramètres passés) ne fonctionne pas.
Les paramétres sont bien passés à la Dll, mais au retour les paramètres modifiés
dans la dll ne sont pas récupérés par le Visual Basic.
Le code de la 2ème fonction est le même que celui de la 1ère mais répété 5 fois!....

Gloups!...je coule...

Voici le code de la dll de debug en Delphi 5:

library DllDebug;
uses
SysUtils, Dialogs, Classes;

{$R *.RES}

type PInteger = ^Integer;

// Avec un seul paramètre PChar
function DebugDllPascal1(data1 : PChar; plen1 : PInteger) : integer ; stdcall;
var texte : string;
begin
texte := 'Pascal';
plen1^ := length(texte);
StrPLCopy(data1, texte, plen1^);
Result := 0;
end;

// Avec 5 paramètres PChar
function DebugDllPascal5(data1 : PChar; plen1 : PInteger;
data2 : PChar; plen2 : PInteger;
data3 : PChar; plen3 : PInteger;
data4 : PChar; plen4 : PInteger;
data5 : PChar; plen5 : PInteger) : integer ; stdcall;
var texte : string;
adr1,adr2,adr3,adr4,adr5 : int64;
begin
texte := 'P_1';
plen1^ := length(texte);
StrPLCopy(data1, texte, plen1^);

texte := 'Pa_2';
plen2^ := length(texte);
StrPLCopy(data2, texte, plen2^);

texte := 'Pas_3';
plen3^ := length(texte);
StrPLCopy(data3, texte, plen3^);

texte := 'Pasc_4';
plen4^ := length(texte);
StrPLCopy(data4, texte, plen4^);

texte := 'Pasca_5';
plen5^ := length(texte);
StrPLCopy(data5, texte, plen5^);
Result := 0;
end;

exports
DebugDllPascal1,
DebugDllPascal5;

begin
end.

// Voici le code d'appel en Visual Basic (Excel Office 2000):
DECLARATIONS:
Private Declare Function DebugDllPascal1 _
Lib "D:\PrjDel50\Projet\AE\Dll_tracabilite\DllDebug.dll" _
(ByVal d1 As String, _
ByRef nSize1 As Integer _
) As Integer

Private Declare Function DebugDllPascal5 _
Lib "D:\PrjDel50\Projet\AE\Dll_tracabilite\DllDebug.dll" _
(ByVal d1 As String, _
ByRef nSize1 As Integer, _
ByVal d2 As String, _
ByRef nSize2 As Integer, _
ByVal d3 As String, _
ByRef nSize3 As Integer, _
ByVal d4 As String, _
ByRef nSize4 As Integer, _
ByVal d5 As String, _
ByRef nSize5 As Integer _
) As Integer

SUBROUTINE 1
Sub DebugRetourDllPascal1()

Dim d1 As String
Dim n1 As Integer
Dim Status As Integer

d1 = String(100, Chr(0)) 'Pour allouer de la mémoire'
d1 = "valeur_1"
Status = DebugDllPascal1(d1, n1)
d1 = Left$(d1, n1)
Range("Data_1").Value = d1

End Sub

SUBROUTINE 2:
Sub DebugRetourDllPascal5()

Dim d1, d2, d3, d4, d5, d6, d7 As String
Dim n1, n2, n3, n4, n5 As Integer
Dim Status As Integer

d1 = String(100, Chr(0)) 'Pour allouer de la mémoire'
d2 = String(100, Chr(0))
d3 = String(100, Chr(0))
d4 = String(100, Chr(0))
d5 = String(100, Chr(0))

d1 = "valeur_1"
d2 = "valeur_2"
d3 = "valeur_3"
d4 = "valeur_4"
d5 = "valeur_5"

Status = DebugDllPascal5(d1, n1, d2, n2, d3, n3, d4, n4, d5, n5)

d1 = Left$(d1, n1)
d2 = Left$(d2, n2)
d3 = Left$(d3, n3)
d4 = Left$(d4, n4)
d5 = Left$(d5, n5)

Range("Data_1").Value = d1
Range("Data_2").Value = d2
Range("Data_3").Value = d3
Range("Data_4").Value = d4
Range("Data_5").Value = d5

End Sub
0
DelphiCool Messages postés 455 Date d'inscription mardi 24 juillet 2001 Statut Membre Dernière intervention 10 mars 2009
21 févr. 2002 à 16:57
dans la dll, tu peu me dire ce que tu veux faire avec ça

texte := 'Pasca_5';
plen5^ := length(texte);
StrPLCopy(data5, texte, plen5^);

ce que je ne comprends pas c'est que tu recolte la donné data5 et que dans ta fonction tu lui attribu une autre valeur

si tu n'arrive pas à caper se qui te vien de ta dll et qui est dans data5
avec un setstring tu y arrive
???
0
hadjdahou Messages postés 3 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 15 juillet 2004
15 juil. 2004 à 12:47
Noureddine
0
Rejoignez-nous