Chargement de fonction d'une librairie DLL - C++ - Programmation
Marsh Posté le 12-06-2003 à 19:44:37
c'est nickel bien codé, parfaitement comprehensible, parfais, rien a dire =)
Marsh Posté le 12-06-2003 à 19:44:51
la suite de if la est splendide
toutes les variables sont declarées en global, c'est mal.
tu veux savoir quoi exactement ?
Marsh Posté le 12-06-2003 à 21:43:55
Le truc de FAR PASCAL et GetProcAddress( )
Le reste c'est facile, j'aimerais juste des explications sur la déclarations des fonctions. ces même fonctions qui ne sont pas définies dans le code mais dans la librairie ... enfin je crois
Marsh Posté le 12-06-2003 à 23:59:41
bin y a pas grand chose a dire a part que getprocaddr choppe l'adresse de la fonction.
pour le FAR PASCAL je suis meme pas sur que ce soit necessaire
edit: je rectifie c'est sans doute utile mais je sais pas comment ca fonctionne
Marsh Posté le 13-06-2003 à 08:07:31
ls PASCAL me semble que c'est un #define de _stdcall qui est la convention d'appel de fonction. tu peux effectivement t'en passer si ta fonction retourne char/short/int/void/float/double et ne prends pas de param sinon ca peut mener a des pb. (Si la fonction dans ta dll est declaré avec __stdcall / PASCAL et que tu l'utilises sans (c a d avec _cdecl) ca va merder)
le FAR je sais pas
Marsh Posté le 13-06-2003 à 08:46:17
dans la lib de vc++ ou c'etait déclaré, j'ai vu
#define FAR
donc il servait a rien ...
Marsh Posté le 13-06-2003 à 08:48:29
BlackGoddess a écrit : dans la lib de vc++ ou c'etait déclaré, j'ai vu |
ca doit etre un relicat des temps ancien alors
Marsh Posté le 13-06-2003 à 10:21:14
chrisbk a écrit : |
Exact. ça vient du 16Bits, ou il y avait des pointeur distants et ds pointeurs locaux, un truc dans l'genre.
Marsh Posté le 16-06-2003 à 10:19:17
Ce que je comprends pas c'est
--> void (FAR PASCAL *Imp_Init) (short far*,short far*,short far*);
Alors ça c'est la déclaration ...
ainsi que
--> (FARPROC) Imp_Init=GetProcAddress(hImpDLL, "Imp_Init" );
Et ça c'est la récupération de l'adresse dans la DLL ...
J'aimerais comprendre ces espèces de type bizarres
FAR PASCAL et FARPROC
Merci pour les renseignements
Marsh Posté le 16-06-2003 à 10:49:38
Ca date des Win 3.1 ca.
C'était du 16 bits. Y'avait 2 type de pointeur : les 16 bits (OFFSET), qui limitent à 64Ko, et les pseudo 32 bits (SEGMENT + OFFSET), pseudo cas si c'était bien codé sur 32 bits, c'est pas comparable au 32 bits actuels. On avait droit à 1Mo. Ce dernier pointeur étaient des pointeur FAR (nécessitent un FAR CALL au niveau assembleur).
Voilà pour le FAR. Dès que ton exe fait + de 64Ko, il faut des pointeur FAR sur tes fonctions. Comme on charge des dll, situées dans un autre segment de code, => pointeur FAR.
Après, PASCAL c'est une convention d'appel comme te l'a dit chrisbk.
Ca été abandonné parce que, je crois, PASCAL est toujours __stdcall, alors que WINAPI peut être différent (sous Mac notamment), ou éventuellement, être un jour différent.
Je viens de jeter un oeil à windef.h :
Code :
|
Bon ben PASCAL est différent selon les sytèmes alors. Je sais pas pourquoi ils ont changé PASCAL pour WINAPI, peut être simplement pour le style.
Voila. J'espère ne pas avoir trop dit de betises vu que j'ai jamais codé sous Win 3x (notamment, je sais pas comment ca se passe pour les 286). Mais en gros ca doit etre ca.
Marsh Posté le 16-06-2003 à 17:15:50
le FAR "peut" être toujours valable, car étant en mode protégé, tu peux avoir des appels inter-segment via des adresse 16:32 bits (alignées sur 64 bits il me semble, donc 16 bits de perdus).
mais je sais pas si ça se passe au niveau du code compilé pour l'appli, les DLL systèmes, ou le code exécuté par le vecteur d'interruption pour sauter au noyau...
après pour être sûr, il faudrait savoir de quoi viens le source... (appli win16 ou win32 ?, vu le code c'est du win16)
Marsh Posté le 16-06-2003 à 18:48:19
Appel inter-segment en 32 bits ?
Je croyais qu'il fallait être privilégié pour changer la valeur d'un registre de (descipteur de) segment ... ?
Marsh Posté le 17-06-2003 à 10:34:19
c ptet (oups) possible, j'ai jamais essayé encore...
mais chose sûr, tu ne peux pas changer vers un sélecteur (segment) dont le niveau de privilège est plus haut.
mais peut être que dans les API bas-niveau, il possible de créer plusieurs segment de donnée pour avoir plus de ressources (vu qu'un process win32 a 2Go de données par défaut (les 2Go supérieures sont mappées vers le code des DLLs je crois), et qu'il faut compiler avec une option spéciale pour pouvoir avoir 3Go.
Donc dans le cas ou on aurait plus de 4Go de ram avec windows en mode PAE, je pense qu'ils ont dû laisser la possiblité d'avoir plusieurs segments de données (je vais faire un tour dans la MSDN, vu que j'aimerai bien savoir ce qu'il est possible de faire à ce niveau)
Marsh Posté le 17-06-2003 à 10:36:52
parallèlement je sais (dumoins crois) que sous les noyaux NT, le kernel n'utilise que deux niveau de privilèges (le ring 0 pour le noyau, et le 3 je crois pour les applis), mais par exemple OS/2 utilise les 4 niveaux de privilèges du mode protégé x86 (0 pour le kernel, 1 pour les drivers bas-niveau, 2 pour les "services", et le 3 pour les process utilisateur).
Marsh Posté le 17-06-2003 à 10:54:07
héhé je crois que j'ai trouvé une coquille chez crosoft:
http://msdn.microsoft.com/library/ [...] pre_47.asp
Marsh Posté le 17-06-2003 à 11:20:53
bon apparement y'a pas moyen de créer plusieurs segment de donnée, pour le mode PAE c'est une fenêtre qui est mappée par le mmu pour attendre la mémoire au dessus des 4 Gos....
http://www.winntmag.com/Articles/I [...] 1&show=685
http://msdn.microsoft.com/library/ [...] nsions.asp
Marsh Posté le 17-06-2003 à 15:25:28
Je confirme c'est un extrait de code d'une application win16 sous win3.1
Marsh Posté le 17-06-2003 à 17:06:16
ok c'est bien ce que je pensais...
tu comptes l'utiliser via une appli win16, ou tout refaire pour le win32 ? (pb dans le cas d'un windows nt)
Marsh Posté le 17-06-2003 à 18:36:13
L'executable compilé marche parfaitement sous WinNT je bosse sur cet OS
Marsh Posté le 23-06-2003 à 13:25:30
qq1 saurait ou trouver des cours sur le chargement des dll, sur le systeme, sur le vecteur d'interruption, les registres, etc ?
parce que ca m'interresse bcp, mais c du chinois pour moi tout ca ...
(plutot sous noyau nt5 si possible, mais reprendre plus tot depuis win16 m'interresse aussi )
Marsh Posté le 23-06-2003 à 13:26:40
tu veux savoir faire ca en C ? (eg charger une DLL )
paske c pas bien compliqué, genre 4 fonctions
Marsh Posté le 23-06-2003 à 13:44:20
non, independemment du c, je voudrais savoir comment ca fonctionne (par exemple est-ce le noyau qui charge une dll ? ou est-elle chargée ? etc)
Marsh Posté le 23-06-2003 à 17:44:39
Y'a des bouquins là dessus. Pour des infos sur le fonctionnement des dll, tu peux chercher de la doc sur le format PE. Tu verras le chargement des dll, l'édition dynamique des liens, la rellocation, ...
Marsh Posté le 23-06-2003 à 18:44:54
qq1 aurait une url ? ou une référence de bouquin ?
Marsh Posté le 23-06-2003 à 18:45:21
je me suis un peu documenté sur le format PE, mais je voudrais creuser plus profondement le sujet
Marsh Posté le 24-06-2003 à 10:00:20
Ben y'a la doc de MS :
http://www.microsoft.com/whdc/hwde [...] ECOFF.mspx
Marsh Posté le 12-06-2003 à 17:59:08
Auriez vous quelques informations ou explications à propos des chargements de librairies DLL et de récupération des fonctions contenues dans cette librairie. Je dois être capable d'expliquer ce programme ! C'est le FAR PASCAL et les (FARPROC) Imp_Init=GetProcAddress(hImpDLL, "Imp_Init" );
Voici le code complet du petit programme
@ plus
Jardy