OVH Cloud OVH Cloud

utilisation d'une DLL

20 réponses
Avatar
daniel
Bonjour,

Comment utiliser une DLL dans un programme C

Merci

10 réponses

1 2
Avatar
Fabien LE LEZ
On Thu, 08 Jan 2004 17:47:07 +0000, daniel wrote:

Comment utiliser une DLL dans un programme C


fr.comp.os.ms-windows.programmation.
--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Avatar
Thomas Abbé
typedef void (*BEEP)(int, int);

BEEP Beep;

HINSTANCE hDll = LoadLibrary("filename");

chargement des fonctions que tu veux importer
Beep = (BEEP)GetProcAddress(hDll, "Functionname");
...

FreeLibrary(hDll);

thomas


"daniel" schrieb:
Bonjour,

Comment utiliser une DLL dans un programme C

Merci



Avatar
Thomas Abbé
"daniel" schrieb:
Merci beaucoup


de rien
typedef void (*BEEP)(int, int);


BEEP est un pointeur sur une fonction retournant un void ?



oui, BEEP est un pointeur sur une fonction retournant void avec deux
parametres int!

BEEP Beep;

HINSTANCE hDll = LoadLibrary("filename");

chargement des fonctions que tu veux importer
Beep = (BEEP)GetProcAddress(hDll, "Functionname");


poour utiliser cette fonction je fais quoi ?


facile!
....
Beep(20, 30);
...

sourtout pas oublier:


FreeLibrary(hDll);




thomas


Avatar
daniel
Merci beaucoup


Thomas Abbé wrote:
typedef void (*BEEP)(int, int);


BEEP est un pointeur sur une fonction retournant un void ?

BEEP Beep;

HINSTANCE hDll = LoadLibrary("filename");

chargement des fonctions que tu veux importer
Beep = (BEEP)GetProcAddress(hDll, "Functionname");


poour utiliser cette fonction je fais quoi ?

...

FreeLibrary(hDll);

thomas


"daniel" schrieb:

Bonjour,

Comment utiliser une DLL dans un programme C

Merci






Avatar
Pierre Maurette
"Thomas Abbé" a écrit ...

typedef void (*BEEP)(int, int);

BEEP Beep;

HINSTANCE hDll = LoadLibrary("filename");

chargement des fonctions que tu veux importer
Beep = (BEEP)GetProcAddress(hDll, "Functionname");
...

FreeLibrary(hDll);


Ça, c'est le chargement explicite.
Vous pouvez utiliser une méthode implicite, celle utilisée pour les
fonctions des API Windows.
Dans ce cas, c'est Windows qui se démerde pour charger la DLL si nécessaire.
Vous déclarez le prototype (dans un VotreDLL.h), éventuellement avec un
spécificateur facultatif __declspec(dllimport) ou équivalent.
Il suffit ensuite de lier la bib d'importation VotreDLL.lib, que vous avez
du obtenir en sortie de lieur lors de la fabrication de la DLL, sinon avec
un utilitaire.
Pierre

Avatar
kanze
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> wrote
in message news:<3ffe0c0b$0$1152$...
"Thomas Abbé" a écrit ...

typedef void (*BEEP)(int, int);

BEEP Beep;

HINSTANCE hDll = LoadLibrary("filename");

chargement des fonctions que tu veux importer
Beep = (BEEP)GetProcAddress(hDll, "Functionname");
...

FreeLibrary(hDll);


Ça, c'est le chargement explicite. Vous pouvez utiliser une méthode
implicite, celle utilisée pour les fonctions des API Windows. Dans ce
cas, c'est Windows qui se démerde pour charger la DLL si nécessaire.


En général, quelque soit le système, il y a plusieurs façons d'utiliser
des objets dynamiques. Une discussion aprofondie sur les fonctions de
l'API et les commandes de l'éditeur de liens n'a pas sa place ici --
c'est propre au système d'exploitation. En revanche, avant d'en arriver
là, il faudrait savoir ce qu'il cherche réelement à faire, parce que ce
qu'il faut faire en dépend étroitement.

En ce qui concerne les objets dynamiques que tu développes toi-même, au
moins d'écire des bibliothèques avec un API importante (systèmes
d'exploitation, bases de données, bibliothèques graphiques, etc.), à peu
près la seule raison que je vois pour utiliser le chargement dynamique,
c'est qu'on veut pouvoir choisir entre plusieurs bibliothèques lors de
l'execution, pour que le comportement réel dépend de l'environement, les
paramètres de la ligne de commande, les droits de l'utilisateur, etc. Ce
qui suppose un chargement explicit de la bibliothèque.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Loïc Joly
wrote:
En ce qui concerne les objets dynamiques que tu développes toi-même, au
moins d'écire des bibliothèques avec un API importante (systèmes
d'exploitation, bases de données, bibliothèques graphiques, etc.), à peu
près la seule raison que je vois pour utiliser le chargement dynamique,
c'est qu'on veut pouvoir choisir entre plusieurs bibliothèques lors de
l'execution, pour que le comportement réel dépend de l'environement, les
paramètres de la ligne de commande, les droits de l'utilisateur, etc. Ce
qui suppose un chargement explicit de la bibliothèque.



D'autres utilisations existent :
Pouvoir modifier le programme sans l'arrêter (dynamique)
Profiter d'une standardisation des bibliothèques dynamiques sur un OS
pour faire des programmes multi-langages (statique)
Travailler à plusieur entreprises sur un projet sans qu'une seule soit
un point de passage obligé pour de la recompilation (statique)
...

--
Loïc

Avatar
daniel
Merci pour toutes vos reponses qui m'ont bien depanné.




Fabien LE LEZ wrote:
On Thu, 08 Jan 2004 17:47:07 +0000, daniel wrote:


Comment utiliser une DLL dans un programme C



fr.comp.os.ms-windows.programmation.



Avatar
Pierre Maurette
a écrit ...
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> wrote

Ça, c'est le chargement explicite. Vous pouvez utiliser une méthode
implicite, celle utilisée pour les fonctions des API Windows. Dans ce
cas, c'est Windows qui se démerde pour charger la DLL si nécessaire.


En général, quelque soit le système, il y a plusieurs façons d'utiliser
des objets dynamiques. Une discussion aprofondie sur les fonctions de
l'API et les commandes de l'éditeur de liens n'a pas sa place ici --
Tout à fait d'accord, à part l'idée générale de bib dynamique ( = fichiers

image, en gros), les spécificités nombreuses dont il est question sont 100%
dépendantes de l'OS.
De plus, sous Windows, c'est à la base du C et non du C++.

c'est propre au système d'exploitation. En revanche, avant d'en arriver
là, il faudrait savoir ce qu'il cherche réelement à faire, parce que ce
qu'il faut faire en dépend étroitement.

En ce qui concerne les objets dynamiques que tu développes toi-même, au
moins d'écire des bibliothèques avec un API importante (systèmes
d'exploitation, bases de données, bibliothèques graphiques, etc.), à peu
près la seule raison que je vois pour utiliser le chargement dynamique,
Certaines fonctionalités pas si rares que ça imposent sous Windows de

transmettre une fonction écrite dans une DLL (filtrage global E/S par
exemple, voir SetWindowsHookEx).

c'est qu'on veut pouvoir choisir entre plusieurs bibliothèques lors de
l'execution, pour que le comportement réel dépend de l'environement, les
paramètres de la ligne de commande, les droits de l'utilisateur, etc. Ce
qui suppose un chargement explicit de la bibliothèque.
Oui. Attention toutefois à ne pas faire le parallèle explicit = usage

mono-application et implicit = usage multi-application. Par exemple, les DLL
chargées en implicit peuvent très bien être installées dans le répertoire de
l'exécutable, et elles ne polluent pas plus le système. Sauf si l'on a de
bonnes raisons de ne pas charger toutes les DLL d'une appli lors de son
lancement. En explicit, on peut opter pour un fonctionnement
alternatif/dégradé, en cas d'absence d'un fichier DLL. D'après la doc
Microsoft, c'est plutôt implicit qui devrait être choisi par défaut.
Personellement, je pense que si l'on est amené à programmer sous Windows, il
ne peut être nuisible de programmer une paire de DLL, pour mieux maîtriser
le sujet omniprésent.
STOP !!
Pierre


Avatar
James Kanze
Loïc Joly writes:

|> wrote:
|> > En ce qui concerne les objets dynamiques que tu développes
|> > toi-même, au moins d'écire des bibliothèques avec un API
|> > importante (systèmes d'exploitation, bases de données,
|> > bibliothèques graphiques, etc.), à peu près la seule
|> > raison que je vois pour utiliser le chargement dynamique, c'est
|> > qu'on veut pouvoir choisir entre plusieurs bibliothèques lors
|> > de l'execution, pour que le comportement réel dépend de
|> > l'environement, les paramètres de la ligne de commande, les
|> > droits de l'utilisateur, etc. Ce qui suppose un chargement
|> > explicit de la bibliothèque.

|> D'autres utilisations existent :

|> Pouvoir modifier le programme sans l'arrêter (dynamique)

C-à-d que je veux avoir accès à la version la plus récente
disponible dans l'environnement, c-à-d que je veux que la
bibliothèque chargée dépend de l'environnement.

|> Profiter d'une standardisation des bibliothèques dynamiques sur
|> un OS pour faire des programmes multi-langages (statique)

??

|> Travailler à plusieur entreprises sur un projet sans qu'une seule
|> soit un point de passage obligé pour de la recompilation
|> (statique)

??

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
1 2