Доступ к глобальной переменной в DLL - PullRequest
1 голос
/ 15 декабря 2010

как мне получить доступ к глобальной переменной, которая инициализируется в функции main () моего приложения в dll?

Моя глобальная переменная содержит объект критического раздела, который мне нужно заблокировать в dll.

Я пытался экспортировать его в свое приложение и импортировать его в DLL, используя

__declspec(dllexport) и __declspec(dllimport), но когда я пытаюсь заблокировать критическую секцию, я получаю исключение рунтингачто заставляет меня думать, что переменная, к которой обращается моя dll, не инициализирована правильно.

DLL загружается во время выполнения с использованием LoadLibrary.

Любые подсказки приветствуются.

Ответы [ 2 ]

6 голосов
/ 15 декабря 2010

Обычно переменные в DLL доступны из приложения, но похоже, что вы пытаетесь сделать это наоборот. И ваш способ экспорта из приложения и импорта в DLL кажется немного хакерским.

Как насчет создания функции в вашей DLL, которая берет указатель на объект критической секции из вашего приложения и сохраняет его в собственной глобальной переменной DLL?

DLL:

CRITICAL_SECTION *gCS;

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

Применение:

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

Тогда при необходимости DLL может использовать собственную копию указателя.

3 голосов
/ 15 декабря 2010

Это действительно плохая идея, поскольку она нарушает принцип модульности :(

Честно говоря, я не знаю, как заставить компилятор и компоновщик делать то, что вы хотите, если вам нужно, я бы предпочел передать ссылку / указатель на такую ​​глобальную переменную при инициализации dll.

...