2010-12-15 133 views
1

Comment puis-je accéder à une variable globale qui est initialisée dans la fonction main() de mon application dans une DLL?Accéder à une variable globale dans une DLL

Ma variable globale contient un objet de section critique que j'ai besoin de verrouiller dans une DLL.

J'ai essayé de l'exporter dans mon application et l'importer dans le dll en utilisant

__declspec(dllexport) et __declspec(dllimport) mais lorsque je tente de verrouiller la partie critique, je reçois une exception runtine qui me fait penser que la variable mes accès DLL n'est pas initialisé correctement.

La DLL est chargée au moment de l'exécution à l'aide de LoadLibrary.

Tous les conseils seraient appréciés.

Répondre

6

Généralement, les variables d'une DLL sont accessibles à partir de l'application, mais il semble que vous essayiez de le faire dans l'autre sens. de l'application et l'importation dans la DLL semble un peu hackish

Que diriez-vous de créer une fonction dans votre DLL qui prend un pointeur vers l'objet section critique de votre application et le stocke dans la propre variable globale de la DLL?

DLL:

CRITICAL_SECTION *gCS; 

__declspec(dllexport) void MyDLL_SetCS(CRITICAL_SECTION *cs) { 
    gCS = cs; 
} 

Application:

CRITICAL_SECTION cs; 
// initialize cs here 
MyDLL_SetCS(&cs); 

la DLL peut utiliser sa propre copie du pointeur lorsque cela est nécessaire.

3

C'est une très mauvaise idée, car elle viole le principe de la modularité :(

Je ne sais vraiment pas comment forcer le compilateur et éditeur de liens pour faire ce que vous voulez, si vous avez, je préfèrerais passez une référence/un pointeur vers une telle variable globale dans l'initialisation dll