2012-06-06 2 views
4

Я пишу небольшую программу на C++, которая проверяет C dlls, содержащую некоторые функции. Эти DLL существуют в отладочной версии и версии выпуска, и я хотел бы загрузить их как с одной и той же программой, так и сравнить их с предыдущей версией.dll в режиме отладки, вызывающая программа в режиме деблокирования (и наоборот)

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

Я загружаю dlls/functions с помощью функций LoadLibrary и GetProcAddress.

Существует два типа функций: void type1(int&) и void type2(vector<string>*). Тип 1 прекрасно работает независимо от конфигурации. Но тип 2 работает только тогда, когда конфигурация соответствует.

Код:

 
typedef void(*GetNames)(vector<string>*); 
GetNames get_var_names = (*GetNames)GetProcAddress(dll,"get_var_names"); 
vector<string> var_names; 
get_var_names(&var_names); 

Последняя строка, где программа завершается с ошибкой, как «0xC0000005:. Нарушение прав доступа для чтения места 0xbaadf008» если конфигурация вызывающей программы и dll не совпадают. Ошибка в нарушении чтения, когда программа освобождается, а dll отлаживается, но нарушение записи, когда программа отлаживается, а dll - это выпуск.

Что должна делать функция, так это просто вызвать push_back («x») несколько раз с разными строками.

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

У кого-нибудь есть идеи, как решить эту проблему или использовать два исполняемых файла с разными конфигурациями, мой единственный выбор?

+0

Укажите параметры компилятора, которые вы используете для обеих конфигураций. Например, возможно, что в каждой конфигурации используется другое соглашение о вызове по умолчанию (или какой-либо другой параметр, который делает их несовместимыми). – cdhowie

+1

Вы можете отключить отладку итератора, чтобы сделать их совместимыми. Мой совет, когда он болит, как это, однако, просто не делайте этого. –

ответ

4

Многие (если не все) классы STL используют разную компоновку для DEBUG-сборок. Поэтому вы не можете использовать такой класс, скомпилированный DEBUG, из dll (например, std :: string и std :: vector) в RELEASE-build программы и наоборот.

Следует избегать использования STL-типов/классов в вашем интерфейсе вашей DLL и вместо этого использовать встроенные типы. В таком случае у вас никогда не будет этих проблем.

BTW: Я говорю о MSVC++, конечно (другие компиляторы, о которых я не знаю).

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