Utilisation d'une DLL

kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004 - 14 févr. 2004 à 19:09
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004 - 17 mars 2004 à 05:06
bonjour à tous

je possede un dll qui fonctionne en VB et delphi
je voudrais developper un programme en C ou en java et utiliser cette DLL

je n'aie uniquement le fichier .dll mais pas de .lib ni .h ni .c

comment faire

merci pour votre reponse

RV

13 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
14 févr. 2004 à 20:15
si tu as la signature des fonctions de la dll (nom, paramètres et type de retour et convention d'appel), tu peut l'utiliser avec les fonctions LoadLibrary et GetProcAddress

ex pour une dll contenant la fonction DllRegisterServer qui s'utilise comme cela :
HRESULT __stdcall DllRegisterServer();

tout d'abord il faut définir un type de fonction:
typedef HRESULT (__stdcall *pfnDll) ();

puis charger la dll :
HINSTANCE hDllInst = LoadLibrary("MyDll.dll");

et récupérer l'adresse de la fct:
pfnDll pfn = (pfnDll) GetProcAddress(hDllInst, "DllRegisterServer");

pour appeler la fct :
pfnDll();

par contre si tu ne connait rien sur les fonctions de la dll à par le nom (contenu dans la table d'export de la dll), et bien tu peut pas faire grand chose...
0
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
15 févr. 2004 à 11:43
bonjour à tous merci pour la reponse de ymca

je suis debutant en C grace a la reponse j'ai une petite idée de l'utilisation mais si possible je voudrais des précisions
je n'aie pas trop bien compris ton exemple pour la fonction DllRegisterServer

voila les questions:
comment integrer ces fonctions en C ou en JAVA ?: je donne 2 exemples des procedures que je dois utiliser
Startdevice et input procedure

voila les infos que je possede (en anglais)

1- voici la description generale des fonctions de la DLL en
2- descritption de chaque fonction (avec exemlpe en delphi ???)

-----------------------------------------------------------------------
1- Description of the DLL

General procedures

*** StartDevice ***
opens a link to the Recorder/Logger

*** ReadData(lecture des données) ***
Reads the timer counter status and the A/D data from the K8047 to a buffer in the application program

----------------------------------------------------------------------
2- utilisation de chaque fonction

*********fonction StartDevice*************

Syntax
PROCEDURE StartDevice;

Description
Initializes the communication routines for the K8047 unit. Loads the drivers needed to communicate via the USB port. This procedure must be performed in the beginning of the application program.

Example
BEGIN
StartDevice;
END;

**** fonction ReadData ******
Syntax
PROCEDURE ReadData(Buffer:Pointer);

Parameter
Buffer: A pointer to the data array of 8 integers where the data will be read.

---------exemple ----------------
var // global variables
DataBuffer: ARRAY[0..7] OF Integer;

procedure TForm1.Button1Click(Sender: TObject);
var p:pointer;
i:integer;
s:string;
begin
p:=@DataBuffer; // Address of the data buffer
ReadData(p); // Read the data from K8047
memo1.clear;
s:='';
for i:=0 to 7 do s:=s +inttostr(DataBuffer[i]+chr(9);
memo1.lines.add(s); // Display the data
end;

voila si quelqu'un peu me donner un peut de son temps pour m'aider mille fois merci

RV
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
15 févr. 2004 à 16:05
à propos de mon exemple :
DllRegisterServer est une fonction exportée d'une dll (utilisable de l'extérieure).
Elle est définie comme ceci dans le module en c qui sert à construire le dll :
HRESULT __stdcall DllRegisterServer();

- HRESULT est le type de retour (en gros un entier)
- __stdcall est la convetion d'appel (l'ordre dans lequel sont passés les paramètres dans la pile d'éxeccution et qui doit les dépiler)
- le nom de la fonction est DllRegisterSerber.
- la fonction n'a pas de paramètre.

pour pouvoir utiliser cette fonction à partie de la dll, il suffit de récupérer son adresse (fonction GetProcAddress).

le typedef utilisé permet d'indiquer au compilateur vers quel type de fonction pointe l'adresse récupérée. (type de retour, paramètres...)

EN ce qui concerne ton problème. Tes 2 fonctions doivent avoir comme prototype en C (je ne suis pas sur de la convention d'appel en Delphi, je suppose que c'est stdcall, faudra te renseigner):
void __stdcall StartDevice(void)
void __stdcall ReadData(int* buffer);

les typedef correspondant :
typedef void (__stdcall *PFN_STARTDEVICE)(void);
typedef void (__stdcall *PFN_READDATA)(int*);

après avoir chagé ta dll par LoadLibraruy, récupére les fct :
PFN_STARTDEVICE pfnStartDev;
PFN_READDATA pfnReadData;

pfnStartDev = (PFN_STARTDEVICE) GetProcAddress(...);
pfnReadData = (PFN_READDATA) GetProcAddress(...);

utilisation des fonctions:
pfnStartDev();
int buffer[8];
pfnReadData(buffer);
0
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
15 févr. 2004 à 23:07
merci ymca pour ton aide j'ai réussi

merci encore

RV
0

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

Posez votre question
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
17 févr. 2004 à 15:05
bonjour
encore une question sur ma DLL

j'ai un autre fonction SetGain dont voici les caracteristiques

PROCEDURE SetGain(Channel: Longint ; Gain: Longint);

Parameter
Channel_no: Value between 1 and 4 which corresponds to the input channel number whose gain data is to be changed.
Data: The input amplifier gain value. Valid values are only: 1, 2, 5 and 10.

--------------------------------------------------
j'ai des erreur de compile je pense a cause de la declaration des variables

voila comment je l'utilise:

typedef int (__stdcall *PFN_SetGain)(int ,int);(2 int c'est bon ??

PFN_SetGain pfnSetGain;
tableau qui recupere les infos

int gain[3,3];

ICI ERREUR DE COMPILE
---------------------------------------------------------------------
pfnReadData = (PFN_SetGain) GetProcAddress(hDllInst,"SetGain");
----------------------------------------------------------------------

MERCI DE TON AIDE

rv
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 févr. 2004 à 18:45
pfnSetGain = (PFN_SetGain) GetProcAddress(hDllInst,"SetGain");

ça ira mieux non ?
0
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
17 févr. 2004 à 19:25
OUPS OUPS milles excuses

As tu par hasard une idée si on désire utiliser la meme DLL en JAVA

merci
a+

RV
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
19 févr. 2004 à 10:40
essai de voir sur le forum java s'ils en savent plus sur l'utilsation de dll en java
0
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
15 mars 2004 à 16:11
bonjour a tous et ymca

toujours pour ma dll
le programme marche sans probleme aq une extenstion cpp donc en c++
si j'essaie la compilation en .c (DONC EN C UNIQUEMENT)il y a une erreur a la ligne

HINSTANCE hDllInst = LoadLibrary("K8047D.DLL ");

la commande HINSTANCE c'est DU C OU DU c++ ??

ps : je suis plus à l'aise en C qu'en C++

merci a tous
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
15 mars 2004 à 23:54
rien à voir avec le C ou le c++, HINSTANCE c'est simplement un type défini dans windows.h (ou un include inséré par windows.h)
vérifie donc si tu as #include <windows.h>
0
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
16 mars 2004 à 04:47
j'ai bien mis #include <windows.h>
l'erreur a la ligne
HINSTANCE hDllInst = LoadLibrary("K8047D.DLL ");
est "initializer element is not constant"
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
16 mars 2004 à 23:55
cette ligne est-elle dans le corps d'une fonction ?

si tu essaye te faire ça dans une déclaration de variable globale, je pense pas que ça marche. Appelle LoadLibrary dans le main (ou WinMain)
0
kikornenti Messages postés 8 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 17 mars 2004
17 mars 2004 à 05:06
salut ymca
t'es un chef.
le loadlibrary dans le main et tout fonctionne

encore une fois super merci

a+
rv
0
Rejoignez-nous