2009-09-24 9 views
1

J'ai un problème concernant l'exportation/importation d'une variable globale dans une DLL. J'ai une bibliothèque statique qui contient une variable globale telle que:Symbole de données exporté dans les deux DLL malgré dllimport

Dans l'en-tête:

#ifdef _ENGINE_EXPORTS 
extern __declspec(dllexport) Globals data; 
#else 
extern __declspec(dllimport) Globals data; 
#endif 

Dans le fichier source:

#ifdef _ENGINE_EXPORTS 
__declspec(dllexport) Globals data; 
#else 
__declspec(dllimport) Globals data; 
#endif 

Cette variable globale est exportée dans une DLL qui liens contre cette bibliothèque statique. Je peux voir le symbole exporté en utilisant DLL Export Viewer. Mon problème est que je veux utiliser cette variable globale dans une autre DLL et qu'ils partagent les données. À l'heure actuelle, le même symbole est également exporté dans la DLL (je peux le voir aussi) et donc ils ont des adresses différentes. Je voudrais que dans cette autre DLL, la variable globale est la même que dans la première DLL.

Merci.

Répondre

0

Dans le projet, une DLL est à la racine de tous les autres donc j'exporté le symbole dans celui-ci et semblait fonctionner.

0

De votre description, je comprends que vous avez deux DLL différentes qui exportent toutes les deux la variable globale data.
Lorsqu'une DLL exporte une variable, cette DLL alloue de la mémoire au contenu de cette variable et offre aux autres composants du même processus (par exemple à l'application qui a chargé la DLL) d'utiliser cette mémoire via le nom de variable. Donc, si vous exportez data à partir des deux DLL, les DLL allouent de la mémoire et offrent dans leur contexte le nom de la variable data (vous pouvez l'imaginer comme deux variables avec le même nom, mais dans des espaces de noms différents).
Ce que vous voulez faire, c'est qu'une DLL exporte le data et l'autre DLL importe cette variable. Avec ceci (dllimport) vous déclarez le nom de la variable sans définir (et donc sans lui allouer de mémoire).
donc pris cette bibliothèque statique de votre question static.hpp, static.cpp et static.lib:
vous avez dll_1.cpp (lié contre static.lib)

#define _ENGINE_EXPORTS (1) 
#include "static.h" 
__declspec(dllexport) int getAdrAsInt_1() 
{ 
    return (int)&data; 
} 

et dll_2.cpp (liés contre la « bibliothèque d'importation » de dll_1, voir here)

// here without _ENGINE_EXPORTS to use dllimport instead of dllexport 
#include "static.h" 
__declspec(dllexport) int getAdrAsInt_2() 
{ 
    return (int)&data; 
} 

Une autre façon d'accéder aux données à dll_1 de dll_2 serait d'utiliser de dll_2, GetProcAddress. Mais alors vous avez besoin du HMODULE du LoadLibrary -appeler pour charger dll_1.

BTW: Comme je comprends votre situation "How do I share data in my DLL with an application or with other DLLs?" ne s'applique pas, car il décrit un scénario différent complet.

Questions connexes