begin process at 2012 05 30 10:06:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

Toujours à propos des DLL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Toujours à propos des DLL

dimanche 13 mars 2011 à 15:08:41 | Toujours à propos des DLL

ArthurAuguste

Membre Club
J’aurais besoin d’une explication sur le fonctionnement des dll.
Voila, dans mon programme principal qui est une simple fenêtre avec une boucle habituelle Getmessage, sur une commande passée par l’utilisateur, je suis amené à charger ma dll dans le corps du programme principal et à lui passer la main.
Cette dll contient :
- un point d’entrée commun (APIENTRY dllmain)
- Une fonction (extern "C" __declspec(dllexport) INT WINAPI), celle que j’appelle par mon programme principal
- Quelques fonctions ordinaires purement internes.
- Une callback.
- Chaque fonction de la dll a ses variables internes propres.
- Mais il y a aussi des variables globales propres à la dll et que je pensais communes à l’ensemble des fonctions de la dll.

Ma question porte sur les variables globales à la dll :
Lorsque j’initialise une variable globale de la dll de manière dynamique, par exemple lorsque je passe lors de l’appel à cette dll par le programme principal un paramètre qui est l’adresse d’un buffer du programme principal contenant du texte et que je recopie une fois pour toutes ce texte dans une variable globale propre à ma dll (je m’assure d’ailleurs ensuite que cette variable globale contient bien le texte recopié). Eh bien au bout d’un nombre assez petit d’échanges entre le prog ppal et la dll (la bcle Getmessage qui appelle automatiquement la callback), je m’aperçois que le texte que j’ai recopié dans ma variable globale de la dll et que pourtant je n’utilise plus qu’en lecture a disparu.
Ca ne change rien si je déclare la variable globale en static. Si le texte en question je le déclare manuellement au moment de la compilation comme une constante dans cette même variable globale, il ne disparaît évidemment plus.
Est-ce que ça signifie qu’entre chaque appel de la callback de la dll par la boucle Getmessage du prog ppal, la dll est réinitialisée ? (pourtant après l’avoir chargée je pensais qu’elle restait en mémoire)
Est-ce normal ? Quelle explication ? et si c’est normal, ce qui est curieux c’est que certaines variables globales à la dll initialisées dynamiquement ne disparaissent pas (n0 instance de la dll, ou handle de la fenêtre du prog ppal par exemple).
S’il y a une explication, qu’en est-il des variables propres à chaque fonction de la dll : est-ce que au moins elles, sont conservées entre chaque échange si je les déclare en static ?
Merci
dimanche 13 mars 2011 à 18:15:15 | Re : Toujours à propos des DLL

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

L'explication la plus probable pour moi est que tu écrases des données par une erreur de code.

@++
dimanche 13 mars 2011 à 19:28:02 | Re : Toujours à propos des DLL

ArthurAuguste

Membre Club
Bonjour,
Non je ne peux pas écraser, voir mon autre message: "API32 sous WIndows et appel DLL" ou j'ai écrit ceci en complément d'info (j'ai supprimé tout le code, je ne fais donc plus rien, sauf à sortir ce que contient le buffer)

Complément d'info:
Pour mieux tester, je ne fais plus rien dans ma callback, je ne fais juste qu'imprimer par MessageBox le buffer pour voir à quel moment il disparaît, puis return immédiat sur CallNextHookEx.
En fait tant que je tape des caractères sur la fenêtre active de mon programme principal (ou ce qui est bizarre dans la fenêtre CMD de MSDOS) mon buffer ne disparaît pas, dès que je tape des caractères sur d'autres fenêtres actives que ces deux premières fenêtres mon buffer disparaît (je sors des MessageBox vides). Mais lorsque je reviens sur une des deux premières fenêtres, mon buffer réapparaît un peu comme s'il y avait plusieurs versions de DLL qui tournaient.
Il doit y avoir un truc que je n'ai pas compris...



dimanche 13 mars 2011 à 20:57:55 | Re : Toujours à propos des DLL

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Il y a bien UNE dll PAR processus de chargée quand c'est un hook.

ciao...
BruNews, MVP VC++
lundi 14 mars 2011 à 08:57:16 | Re : Toujours à propos des DLL

ArthurAuguste

Membre Club
Merci pour la précision,
Saurais-tu où je peux trouver des explications documentaires sur ce sujet ?
Y aurait-il à ton avis une solution pour conserver les variables globales de la dll une fois celles-ci initialisées ?
(Rappel du fonctionnement: une fois le hook lancé, la boucle getmessage de mon prog ppal (ma fenêtre) dirige les messages concernant les appuis sur les touches vers la callback qui se trouve dans ma dll).
Est-ce que je me trompe si je dis que s'il y a une dll par processus, les variables locales aux fonctions de la dll déclarées en static ne sont pas non plus conservées ?
Est-ce qu'à ton avis ça changerait quelque chose si je transfère la boucle getmessage (pour les messages concernant les touches) dans ma dll avec la callback ?
lundi 14 mars 2011 à 10:26:11 | Re : Toujours à propos des DLL

BruNews

Administrateur CodeS-SourceS
Les touches clavier sont à récupérer par un hook clavier, pas de GetMessage à faire.

Le partage des variables peut se faire (entre autre) par une section 'SHARED'.

Se reporter aux nombreux exemples de hook que j'ai postés ici.

ciao...
BruNews, MVP VC++
lundi 14 mars 2011 à 19:21:30 | Re : Toujours à propos des DLL

ArthurAuguste

Membre Club
Merci pour tes explications.
Entre-temps j'ai fait marcher mon appli en sauvegardant les données sensibles dans un fichier en sortie de callback et en les récupérant à l'entrée de la callback, j'ai mis les données susceptibles de changer et de resservir à l'exécution suivante de la DLL dans une union sous la forme suivante:
union DONNEES // structure permettant de mapper les données
{
char image[Tailimage];
struct DETAIL
{
HHOOK clehook; // clé hook
BOOL SHIFTDOWN;
BOOL ALTDOWN;
BOOL CTRLDOWN;
BOOL MAJUSCULE;
HWND lastactivfen;
DWORD Lastlongtitre;
UINT nbBACK;
char Pnomfichier[100];
} Monimage;
} Mesdonnees;
Ainsi je lis et j'écris tout en une seule fois dans: Mesdonnees.image
Ca marche très bien maintenant, mais ça n'est pas très satisfaisant pour l'esprit d'être obligé de faire des E/S.
Je vais aller voir si je trouve de la doc sur les sections "SHARED" as-tu dans tes développement un exemple court et facile à comprendre d'utilisation de ces sections "SHARED" ?
Merci
lundi 14 mars 2011 à 21:51:13 | Re : Toujours à propos des DLL

BruNews

Administrateur CodeS-SourceS
http://www.cppfrance.com/code.aspx?id=17387

Regarde dans le CPP de la DLL.

ciao...
BruNews, MVP VC++
lundi 14 mars 2011 à 22:41:41 | Re : Toujours à propos des DLL

ArthurAuguste

Membre Club
Ok,
Si j'ai bien compris la zone partagée et qui, donc, n'est pas réinitialisée d'une exécution à l'autre est encadrée par les bornes:
#pragma data_seg("Shared")
et
#pragma data_seg()

Merci

P.S. Simple demande de précision: est-ce que le mot "Shared" est un mot réservé obligatoire pour préciser que la zone qui suit sera partagée ou bien est-ce simplement un nom donné à cette zone et dans ce cas on peut l'appeler n'importe comment?
"Toto" ou "Commun" d'ailleurs si c'était un nom de zone, je ne vois pas d'autres endroits où on y fait référence.
mardi 15 mars 2011 à 10:17:36 | Re : Toujours à propos des DLL

BruNews

Administrateur CodeS-SourceS
La source sur laquelle je t'ai envoyé date un peu.
Sur les versions recentes de VC++, il convient d'employer cette syntaxe:

#pragma section("SctnShare",read,write,shared)

#pragma data_seg("SctnShare")
HWND hmain = 0;
#pragma data_seg()

En meme temps, tu as ta reponse.

ciao...
BruNews, MVP VC++

1 2

Cette discussion est classée dans : programme, variable, dll, globale, principal


Répondre à ce message

Sujets en rapport avec ce message

variables globales et DLL [ par cosmobob ] je me pose plusieurs questions :quand on crée une DLL, comment déclarer une variable qui soit globale à toutes les instanciations de la DLL ? (cad si Vriable globale..... ou pas??? [ par Clonk ] Bonjour,voilà, pour le moment, je usis obligé d'utiliser une variable globale dans mon appli, j'en ai besoin pour garder le chemin de mon exe, je le r DLL et variables [ par CyberP ] Voilà je voudrais donner la possibilitée à une dll d'appeler une fonction de l'application mèreDonc j'ai créé une structure que j'appelle PLUGINSYNC ( variable globale ou non [ par fcbouan ] quel es la bonne approche , utiliser par exemple une variable globale de buffer gMonbuffer[TAILLE] et l utiliser dans une fonction ( ecriture dans un Problème avec ShellExecute() [ par F_o_X ] Bonsoir a tousVoila, je voulais faire un programme qui est en rapport avec les moteur de recherche, mais pour que mon programme soit au point, je dois débuter avec MFC déclaration d'une variable globale [ par moezzz ] Je débute avec la programmation vc++ utilisant MFC. j'utilise l'assistant pour générer l'application. je sais pas comment déclarer une variable global client/serveur ( comment dedoubler un meme programme en client et serveur) [ par herve_blondel ] salut a tous !je suis entrain de faire un projet de simulateur du protocol RIP et voici ce qui me casse la tete. en fait, sur un poste je dois simuler dependance, ocx et dll [ par LoRdKiFlEx ] Salut,Je viens de finir un programme et j'aimerai creer un installer pour pouvoir le distirbuer. Seulement comment dois je faire pour connaitre les dl declarer une variable globale [ par EricLeRouge ] J'aimerai savoir comment declarer une varible (par ex un int) en globale dans le cas d'un projet avec plusieurs fichiers. Si je cree un .h ou je decla classe de DLL dans un programme... [ par Gendal67 ] Bonjour,Désolé de vous demander, je suis débutant dans la création de DLL : je viens à l'instant d'apprendre des trucs de bases dc un livre spécial qu


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales