Problem de pointeur lors de l'appel d'une fonction d'une DLL

astrorico44
Messages postés
4
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2006
- 6 mars 2006 à 00:21
astrorico44
Messages postés
4
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2006
- 7 mars 2006 à 20:55
Bonjour,

j'essai d'appeler une fonction d'une DLL ecrite en C en delphi
les premieres fonctions de la DLL fonctionnent mais je n'arrive pas a
appeler la suivante en delphi.

appel en C: WriteContinuous(leds); (avec unsigned char leds[9];)

En delphi et chargement statique de la DLL
J'ai essayer pas mal de truc mais sans succes

function WriteContinous(var Pdata_to_write:Pchar):integer; stdcall; external 'atusbhid.dll';

var
Pdata_to_write:Pchar;
data_to_write:array[0..8] of char;

begin

Pdata_to_write:=@data_to_write;
WriteContinous(Pdata_to_write);

a noter que le fonction C ne renvoie rien mais j'ignore comment l'ecrire en delphi.
Si vous voyez ce qui cloche je suis preneur

Cordialement

Eric

8 réponses

Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
6 mars 2006 à 01:03
Salut,
c'est quoi l'erreur ?
donne le massage
as-tu la source de la dll ?
es-tu sur de la déclaration de la fonction ?

si non essaye Cdecl à la place de StdCall
Extrait de l'aide Delphi :
La convention cdecl est utile pour les appels de fonctions à partir de bibliothèques partagées écrites en C ou en C++

@+
Cirec
0
astrorico44
Messages postés
4
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2006

6 mars 2006 à 22:18
l'erreur est une access violation at 0x7c974a50: write of address 0x00030d24

idem avec la declaration cdecl....

je suis sur de la declaration de la fonction en C, j'essai d'avoir les sources

y a t'il une autre maniere d'appeler cette fonction en delphi que celle que j'ai utilisé ?

Eric
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
6 mars 2006 à 22:26
Non je ne crois pas qu'il y ait une autre manière d'appeler une fonction où procedure depuis une Dll.
Mais si tu arrives à avoir la source on pourra vérifier la syntaxe

@+
Cirec
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
6 mars 2006 à 23:57
function WriteContinous(Leds : Pchar) : integer;

a condition qu'en c++ elle soit ecrite (c++) :

int WriteContinous( ... ) { ... }

je pense que vus ce que tu dis plus haut il faudrait l'ecrire :

type
TStr9 = string[9];

procedure WriteContinous(Leds : TStr9);

pour (c++) :

void WriteContinous( ... ) { ... }

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
astrorico44
Messages postés
4
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2006

7 mars 2006 à 10:09
voici le source de la fonction ds la DLL



void STDCALL WriteContinuous(unsigned char *buffer)

{

unsigned char OutputReport[9];

OutputReport[0] = 0;

for (int c = 0; c < REPORTSIZE; c++)

OutputReport[c + 1] = buffer[c];

WriteReport(OutputReport);

}



ca ne marche pas mieux avec le TStr9 = string[9];



A+

Eric
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
7 mars 2006 à 10:55
Bon alors essaye comme ceci :

Procedure WriteContinous(var Pdata_to_write:Pchar); stdcall; external 'atusbhid.dll';
où encore avec le TStr9

@+
Cirec
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
7 mars 2006 à 16:52
void STDCALL WriteContinuous(unsigned char *buffer)
=
procedure WriteContinuous(buffer : string); stdcall; external 'atusbhid.dll';

c++ char* = delphi string
c++ void ident(){} = delphi procedure ident();
c++ type ident(){} = delphi function ident() : type;

donc

void STDCALL WriteContinuous(unsigned char *buffer)
{
unsigned char OutputReport[9];
OutputReport[0] = 0;
for (int c = 0; c < REPORTSIZE; c++)
OutputReport[c + 1] = buffer[c];
WriteReport(OutputReport);
}

=

procedure WriteContinuous(buffer : string);
var OutputReport : array[0..9] of char;
C : integer;
begin
OutputReport[0] := #00;
for c := 1 to REPORTSIZE do OutputReport[C] := Buffer[C];
WriteReport(OutputReport);
end;

si je ne fais pas d'erreur.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0
astrorico44
Messages postés
4
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2006

7 mars 2006 à 20:55
Bonsoir...o desespoire elle ne veux toujours rien savoir cette .....perie de DLL
avec tous les exemples ci dessus ds tous les sens
ci-joint mon code si quelqu'un veut essayer la DLL estici

cordialement

Eric

function InitHid():integer; stdcall; external 'atusbhid.dll';
function FindHidDevice(const VendorID,ProductID:integer):integer; stdcall; external 'atusbhid.dll' ;
Procedure SetReportContinuous(); stdcall; external 'atusbhid.dll';
Procedure WriteContinous(var Pdata_to_write:Pchar); stdcall; external 'atusbhid.dll';
//function ReadContinous(var buffer : string):integer ; stdcall; external 'atusbhid.dll';

procedure TForm1.Button1Click(Sender: TObject);

const

VendorID = $03EB;
ProductID = $201D;

var
DllInstance, error:integer;
Pdata_to_write:Pchar;
data_to_write:array[0..8] of char;

begin

Pdata_to_write:=@data_to_write;

InitHid();

error := FindHidDevice(VendorID,ProductID);
If (error = 0) then begin
showMessage('Device not connected ');
end;

SetReportContinuous();
data_to_write[0]:='1';
data_to_write[1]:='1';
data_to_write[2]:='5';
data_to_write[3]:='5';
data_to_write[4]:='1';
data_to_write[5]:='1';
data_to_write[6]:='5';
data_to_write[7]:='5';
data_to_write[8]:='2';

WriteContinous(Pdata_to_write);

end;
0