C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

utilisation d'une DLL
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Fabien LE LEZ
Guest





PostPosted: Thu Jan 08, 2004 5:44 pm    Post subject: Re: utilisation d'une DLL Reply with quote



On Thu, 08 Jan 2004 17:47:07 +0000, daniel <daniel (AT) free (DOT) fr> wrote:

Quote:
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

Back to top
daniel
Guest





PostPosted: Thu Jan 08, 2004 5:47 pm    Post subject: utilisation d'une DLL Reply with quote



Bonjour,

Comment utiliser une DLL dans un programme C

Merci

Back to top
Thomas Abbé
Guest





PostPosted: Thu Jan 08, 2004 5:47 pm    Post subject: Re: utilisation d'une DLL Reply with quote



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" <daniel (AT) free (DOT) fr> schrieb:
Quote:
Bonjour,

Comment utiliser une DLL dans un programme C

Merci


Back to top
Thomas Abbé
Guest





PostPosted: Thu Jan 08, 2004 9:36 pm    Post subject: Re: utilisation d'une DLL Reply with quote


"daniel" <daniel (AT) free (DOT) fr> schrieb:
Quote:
Merci beaucoup

de rien
Quote:
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!

Quote:
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:

Quote:

FreeLibrary(hDll);


thomas


Back to top
daniel
Guest





PostPosted: Thu Jan 08, 2004 9:50 pm    Post subject: Re: utilisation d'une DLL Reply with quote

Merci beaucoup


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

BEEP est un pointeur sur une fonction retournant un void ?

Quote:
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 ?

Quote:
...

FreeLibrary(hDll);

thomas


"daniel" <daniel (AT) free (DOT) fr> schrieb:

Bonjour,

Comment utiliser une DLL dans un programme C

Merci




Back to top
Pierre Maurette
Guest





PostPosted: Fri Jan 09, 2004 2:02 am    Post subject: Re: utilisation d'une DLL Reply with quote

"Thomas Abbé" <thomas_abbe (AT) hotmail (DOT) com> a écrit ...

Quote:
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



Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Jan 09, 2004 5:46 pm    Post subject: Re: utilisation d'une DLL Reply with quote

"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> wrote
in message news:<3ffe0c0b$0$1152$636a55ce (AT) news (DOT) free.fr>...
Quote:
"Thomas Abbé" <thomas_abbe (AT) hotmail (DOT) 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 (AT) gabi-soft (DOT) 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

Back to top
Loïc Joly
Guest





PostPosted: Fri Jan 09, 2004 7:15 pm    Post subject: Re: utilisation d'une DLL Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
Quote:
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




Back to top
daniel
Guest





PostPosted: Sat Jan 10, 2004 11:13 am    Post subject: Re: utilisation d'une DLL Reply with quote


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




Fabien LE LEZ wrote:
Quote:
On Thu, 08 Jan 2004 17:47:07 +0000, daniel <daniel (AT) free (DOT) fr> wrote:


Comment utiliser une DLL dans un programme C


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


Back to top
Pierre Maurette
Guest





PostPosted: Sun Jan 11, 2004 11:22 am    Post subject: Re: utilisation d'une DLL Reply with quote

<kanze (AT) gabi-soft (DOT) fr> a écrit ...
Quote:
"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++.

Quote:
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).

Quote:
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






Back to top
James Kanze
Guest





PostPosted: Sun Jan 11, 2004 8:24 pm    Post subject: Re: utilisation d'une DLL Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Quote:
kanze (AT) gabi-soft (DOT) 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.

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

??

Quote:
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 (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93

Back to top
James Kanze
Guest





PostPosted: Sun Jan 11, 2004 8:37 pm    Post subject: Re: utilisation d'une DLL Reply with quote

"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:

Quote:
kanze (AT) gabi-soft (DOT) 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.

Un petit détail -- malgré le nom que lui donne Windows, je ne
connais pas de système qui offre réelement les bibliothèques
dynamiques. Quand tu les charges, c'est du tout ou rien. C'est donc un
fichier objet, et non une bibliothèque. (En revanche, si la partage
en était la motivation au départ, aujourd'hui, c'est vraiment
l'aspect dynamique qui prime, et le nom « shared object » qu'on
lui donne sous Unix ne convient plus tout à fait non plus.)

Quote:
De plus, sous Windows, c'est à la base du C et non du C++.

Que ce soit Windows ou Unix, la API est spécifiée en termes de C.
(En fait, sous Unix, elle est spécifiée dans quelque chose qui
n'est pas vraiment du C non plus, vue qu'elle exige des converisions
entre des pointeurs à des données et des pointeurs à des
fonctions, ce qui n'est permis ni en C ni en C++.) Ce n'est pas pour
autant qu'on ne peut pas s'en servir en C++ (voire en Ada, en Fortran,
ou en ce qu'on veut).

Quote:
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).

Il est aussi assez traditionnel de se servir d'un objet dynamique pour
libc sous Unix. Et alors ? On peut arguementer que c'est en fait ce
qu'on veut -- on veut la version de libc qui correspond à la version
de l'OS qui tourne sur la machine, et non celui qui tournait sur la
machine où on a fait l'édition de liens.

Quote:
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.

Pas du tout. J'imagine que dans le cas d'une bibliothèque graphique
sous Unix, on se servirait de la bibliothèque dans beaucoup de
programmes, mais la version exacte qu'on charge dépendrait de
l'environement, ou de la ligne de commande.

Quote:
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.

Et dans ce cas-là, pourquoi utiliser un objet dynamique.

En revanche, je vois bien une application qui charge implicitement la
bibliothèque de l'interface avec la base de données, et qui charge
la bibliothèque Oracle 7 ou celle d'Oracle 8, selon le chemin
précisé par l'utilisateur ($LD_LIBRARY_PATH sous Unix).

Quote:
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.

Qu'on le fasse une fois pour des raisons d'apprentissage, je veux bien.
Qu'on livre une application sauscissonnée en dix DLL qui ne servent
qu'à cette application, je me démande bien pourquoi. En fin de
compte, la seule chose qu'apportent les DLL dans ce cas-là, c'est la
possibilité à l'utilisateur d'avoir un mélange de versions qui
ne fonctionne pas correctement, et que tu ne peux pas dupliqué chez
toi.

--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93

Back to top
Pierre Maurette
Guest





PostPosted: Mon Jan 12, 2004 9:44 am    Post subject: Re: utilisation d'une DLL Reply with quote

"James Kanze" <kanze (AT) gabi-soft (DOT) fr> a écrit ..
Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

|> [email]kanze (AT) gabi-soft (DOT) fr[/email] 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)

??
Sans doute s'agit-il de "langage" au sens de la localisation des

applications.
Les DLL de ressources de localisation permettent de gérér ce point
facilement (enfin, élégamment) : re-chargement différé (changement de langue
en cours d'utilisation du programme). Il est possible (mais ce n'est pas
spécifiques aux DLL) de "sortir" un module de localisation de l'application
qui peut être mis à la disposition de tiers. Je ne sais plus trop ce qui est
Windows et ce qui est spécifique à Borland dans cette technologie.
Pierre







Back to top
Loïc Joly
Guest





PostPosted: Mon Jan 12, 2004 11:24 am    Post subject: Re: utilisation d'une DLL Reply with quote

James Kanze wrote:
Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

|> [email]kanze (AT) gabi-soft (DOT) fr[/email] 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 :

[...]


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

??
Par exemple, windows fourni une spécification de ses DLL qui permet à

tous langages de les utiliser, comme une sorte d'ABI. Cette
spécification est un standard de fait sous windows, et permet donc
d'interfacer deux langages de programmation qui ne savent même pas que
l'autre existe. Dans .NET, cette ABI comprend aussi des notions objet,
ce qui permet à un programme en C++ de dériver d'une classe écrite en
visual basic.
Quote:

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

??

Par exemple, une entreprise client A veut un produit qui a besoin de
connaissances de l'entreprise B et C. Plutôt que de demander à B
d'intégrer une bibliothèque classique fournie par C, B et C se mettent
d'accord sur un protocole d'échangepar DLL, et B et C peuvent livrer
indépendamment leur part à A qui se chargera de faire l'intégration.
Inconvénient : A doit savoir ce qu'il fait, avantage : Beaucoup plus de
réactivité, confidentialité accrue.



Back to top
Arnaud Debaene
Guest





PostPosted: Wed Jan 14, 2004 9:33 am    Post subject: Re: utilisation d'une DLL Reply with quote

James Kanze <kanze (AT) gabi-soft (DOT) fr> wrote

Quote:

|> 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).

Il est aussi assez traditionnel de se servir d'un objet dynamique pour
libc sous Unix. Et alors ? On peut arguementer que c'est en fait ce
qu'on veut -- on veut la version de libc qui correspond à la version
de l'OS qui tourne sur la machine, et non celui qui tournait sur la
machine où on a fait l'édition de liens.

Pierre parlait d'une fonctionnalité différente : D'une manière
générale, les DLLS permettent "d'injecter" dynamiquement son code dans
une application tierce, ce qui peut être utiles pour certaines
opérations : instrumentation, log, ceraint mécanismes utilisés par les
antivirus, et malheureusement d'autre activités moins honnêtes. Mais
bon, on est très loin du C++ là!

Quote:
Qu'on le fasse une fois pour des raisons d'apprentissage, je veux bien.
Qu'on livre une application sauscissonnée en dix DLL qui ne servent
qu'à cette application, je me démande bien pourquoi. En fin de
compte, la seule chose qu'apportent les DLL dans ce cas-là, c'est la
possibilité à l'utilisateur d'avoir un mélange de versions qui
ne fonctionne pas correctement, et que tu ne peux pas dupliqué chez
toi.

C'est vrai. Ceci dit, sur des systèmes complexes, les librairies
dynamiques peuvent simplifier le déploiement et la mise à jour
(patchs), avec évidemment les risques de mélange de versions que cela
implique.
A noter que .NET offre un mécanisme intéressant de ce point de vue :
Par défaut (c'est modifiable par fichier de configuration), un
executable n'accepte de fonctionner qu'avec les DLL exactes contre
lesquelles il a été construit (numéro de version, CRC et
éventuellement signature).

Arnaud

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.