2012-01-04 4 views
3

Я использую DLL, которая выполняет некоторое выделение памяти и возвращает указатель. код что-то вроде этого:Распределение памяти внутри DLL, возвращающее нулевой указатель

ObjectClass *obj = FunctionFromDLL(); 

obj является действительным указателем, но obj->SubObject плохого указатель (0xcdcdcd) Я проверил и FunctionFromDLL() правильно выделяет SubObject, этот указатель только получает плохое значение, когда функция возвращается в вызывающий абонент.

Есть ли что-то особенное для DLL, чтобы «поделиться» своей памятью?

+2

Вам не нужно ничего делать с библиотеками DLL, чтобы обмениваться памятью. DLL-файлы находятся в одном и том же адресном пространстве. Ваша проблема - это что-то другое. Вы пытаетесь передать объекты C++ через границы DLL. Это не работает, если у вас нет одинаковых компиляторов с обоих концов и используйте 'dllexport' /' dllimport'. Вы должны рассказать нам больше, прежде чем мы сможем помочь. –

+0

Экспортированная DLL-функция выполняет __declspec (dllexport), и я использую __declspec (dllimport) в импортированном файле .h. Оба проекта скомпилированы с использованием той же Visual Studio. – Guillaume

+0

Не складывается. Должно быть, это то, о чем вы нам еще не говорили. Инициализированная память не становится неинициализированной при прохождении через границу модуля. –

ответ

0

Это потому, что я определил _USE_32BIT_TIME_T как значение препроцессора.

Я удалил его и теперь он отлично работает.

Спасибо всем.

2

Нет специального способа совместного использования памяти, выделенной между dll и app, просто убедитесь, что вы удаляете память в dll ПОСЛЕ того, что вы больше не используете ее.

Edit: 0xCDCDCDCD: Используется C++ от Microsoft отладки библиотеки времени выполнения, чтобы отметить неиницализированную память кучи

+0

Эта память кучи инициализирована внутри DLL (я проверял с помощью отладчика), а затем становится неинициализированным, когда снаружи. – Guillaume

Смежные вопросы