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

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

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

WindowsError: exception: access violation reading 0x00000008

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

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

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

3 ответа

Решение

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

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

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

Другие вопросы по тегам