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
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
"Thomas Abbé" <thomas_abbe@hotmail.com> 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
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
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
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> wrote
in message news:<3ffe0c0b$0$1152$636a55ce@news.free.fr>...
"Thomas Abbé" <thomas_abbe@hotmail.com> 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:kanze@gabi-soft.fr
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
"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
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
kanze@gabi-soft.fr 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)
...
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
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.
Merci pour toutes vos reponses qui m'ont bien depanné.
Fabien LE LEZ wrote:
On Thu, 08 Jan 2004 17:47:07 +0000, daniel <daniel@free.fr> wrote:
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.
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
<kanze@gabi-soft.fr> 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
"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
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
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
|> kanze@gabi-soft.fr 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:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> 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