Как правильно написать C ++ DLL, которая будет загружаться в режиме отладки тоже без сбоев - PullRequest
0 голосов
/ 15 сентября 2010

мои проблемы связаны с собственными C ++ DLL (Visual Studio 2005, если это имеет значение) и с тем, как их написать, чтобы обеспечить:

  • , когда DLL компилируется в режиме выпуска, она будетбыть правильно загруженным EXE-файлом, скомпилированным в режиме выпуска или отладки (первый приоритет)
  • , если DLL-библиотека скомпилирована в режиме отладки, она также будет правильно загружена EXE-файлом, скомпилированным в режиме отладки.

Сегодня у меня есть собственная C ++ DLL, которая загружается и прекрасно работает в режиме DLL-релиз / EXE-релиз.DLL загружается, но не работает нормально (вызовы функций возвращают неожиданные результаты) в режиме DLL-релиза / EXE-релиза (и это огромная проблема, потому что мешает мне отладить EXE, что является моей главной целью) и вылетаетповреждение кучи в режиме DLL-debug / EXE-debug.

Я знаю, что существует проблема, связанная с CRT, которая требует CRT-изоляции между DLL и EXE.Обычно эта проблема решается за счет того, что операторы new / new [] / delete / delete [] закрываются в DLL и заключаются в них с помощью функций create () / release (), которые позволяют создавать динамические объекты EXE.

Мой вопрос: перед тем, как начать перефакторинг всего своего кода в этом направлении, нужно ли что-то еще сделать, чтобы избежать подобных проблем?CRT-изоляция, вероятно, исправит мою ошибку DLL-debug / EXE-debug, но я не уверен, что это решит проблему DLL-release / EXE-debug.

Есть подсказка?Кто-нибудь уже сталкивался с этой проблемой?

Спасибо, Ал.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2010

Я бы прежде всего решил сценарий отладки / отладки.Повреждение кучи является показателем серьезной существующей проблемы, и пока она не решена, у вас нет гарантии, что любой другой сценарий будет работать должным образом.на самом деле, я бы сказал, что любые другие сценарии будут не работать должным образом.

Кроме того, я не уверен, почему вы думаете, что повреждение кучи необходимо решить путем изоляции ЭЛТ ине проблема в коде dll или exe.Связаны ли dll и exe с различными версиями CRT?

0 голосов
/ 15 сентября 2010

Не используйте специфичный для конфигурации код в публичных h-файлах Dll.Например:

class ExportedClass
{
...

#ifdef _DEBIG
    int debug_info;
#endif

...
}

Когда Dll компилируется в конфигурации отладки, sizeof (ExportedClass) содержит дополнительные 4 байта.Когда этот файл компилируется клиентским кодом с конфигурацией выпуска, sizeof (ExportedClass) меньше на 4 байта.Результат не определен.

Кроме того, не используйте типы, имеющие размер, зависящий от конфигурации, как часть открытого интерфейса Dll: возвращаемые значения и параметры.

...