DLL C++ en delphi

francoisok Messages postés 2 Date d'inscription mardi 30 août 2005 Statut Membre Dernière intervention 7 février 2007 - 7 févr. 2007 à 13:18
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 14 févr. 2007 à 13:33
Bonjour,

J'ai une DLL ecrite en C : ( il s'agit de la description exterieure de la dll)

La fonction est decrite de cette maniere:

long DeviceDiscovery(
LPSTR pDeviceList, //pointer to the user allocated device list
DWORD dwMaxNumberDevices, //maximum number of devices that fit the device listing
DWORD dwResponseTimeout, //number of seconds to wait for a response
DWORD lpResults //the number of devices discovered by the DLL
};

Je l'ai traduite de cette facon en delphi:

function DeviceDiscovery(pDeviceList:PwideChar;maxNumberDevice: Dword;responseTimeout: Dword;results: Dword):Result;stdcall; External DLL_Name name 'DeviceDiscovery';

Cependant chaque fois que j'appelle cette fonction, je me retrouve face a une erreur de type Eaccessviolation, 'Violation d'acces a l'adresse 100017D3 dans le module 'DLL_Name'. Ecriture de L'adresse 0000000A.

L'erreur vient de la variable de type LPSTR( long pointer String), que j'ai traduit en PwideChar.

Je sais plus quoi faire j'ai reserve de l'espace a la variable pDeviceList en utilisant GetMem().

Si vous avez une idee faites moi signe

Merci

2 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
7 févr. 2007 à 16:41
Transposition vers Delphi :

interface

function DeviceDiscovery( const pDeviceList       : PAnsiChar {ou PChar};
                          const dwMaxNumberDevices,
                                dwResponseTimeout : Cardinal;
                          var   lpResults         : Cardinal
                        ): Integer; StdCall {ou cdecl si linux};

implementation

function DeviceDiscovery( const pDeviceList       : PAnsiChar;
                          const dwMaxNumberDevices,
                                dwResponseTimeout : Cardinal;
                          var   lpResults         : Cardinal
                        ): Integer; External DLL_Name name 'DeviceDiscovery';

end.

voila, c'est ce qui me semble le plus logique au vus de la fonction d'origine.

<hr size="2" width="100%" />Croc (click me)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 févr. 2007 à 13:33
Salut,


Le cdecl est pas réservé à Linux.

Toute Win32 est en stdcall (Et en C) certe, mais par défaut, les compilos C font du cdecl.
0
Rejoignez-nous