kikornenti
Messages postés8Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention17 mars 2004
-
14 févr. 2004 à 19:09
kikornenti
Messages postés8Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention17 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
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 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...
kikornenti
Messages postés8Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention17 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
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 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);
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");
----------------------------------------------------------------------
kikornenti
Messages postés8Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention17 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
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 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>