Доступ к глобальным данным в библиотеке dll из экспортированной функции библиотеки dll

StackOverflow https://stackoverflow.com/questions/1198893

  •  20-09-2019
  •  | 
  •  

Вопрос

Я создаю библиотеку DLL C ++ Win32 с некоторыми глобальными данными.Существует std::map, определенный глобально, и в dll есть экспортированные функции, которые записывают данные в карту (конечно, после получения блокировки записи).

Моя проблема в том, что когда я вызываю функцию записи из библиотеки dll DllMain, она работает без каких-либо проблем.Но когда я загружаю библиотеку dll из другой программы и вызываю функцию, которая записывает данные в глобальную карту, она выдает мне эту ошибку:

WindowsError: exception: access violation reading 0x00000008

Есть ли что-то, что можно с этим сделать?Та же функция при вызове из DllMain имеет доступ к глобальным данным в библиотеке dll, но при вызове из другого процесса у нее нет доступа к глобальным данным.Пожалуйста, дайте совет.

Я использую компилятор TDM-MinGW gcc 4.4.0.

Редактировать: Хорошо, я разобрался, в чем проблема, и спасибо за помощь, ребята, но проблема была не в проблеме с конструктором или невозможности иметь карты в глобальном пространстве, а в проблеме в boost:: python, который я использую.Я протестировал это, но поскольку я вызывал библиотеку dll из python или, возможно, что-то в этом роде, модуль urllib2 не загружался в библиотеку dll.Теперь я должен посмотреть, как это исправить.

Это было полезно?

Решение

Выглядит как конструктор std::map еще не запускался, когда был вызван ваш код.Время жизни глобальных не-модулей в Win32 DLL довольно сложно, и я не уверен, как конкретно MinGW обрабатывает это.Но может случиться так, что при компиляции библиотеки DLL вы установили свою собственную функцию (DllMain?) в качестве точки входа и, таким образом, переопределил процедуру инициализации CRT, которая вызывает конструкторы.

Другие советы

Ошибка чтения при таком низком адресе памяти обычно означает, что вы пытаетесь получить доступ к нулевому указателю где-либо.Можете ли вы показать свой реальный код?

Вы должны использовать общую память, потому что разные процессы имеют отдельные адресные пространства.Я думаю, у вас не запустится std::map.Я бы рекомендовал использовать MapViewOfFile, CreateFileMapping, OpenFileMapping , ...и простые старые данные.Спросите в Google / MSDN.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top