Я пишу небольшую программу на 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 также не будут работать, поэтому, похоже, это что-то связано с векторным или строковым классом.
У кого-нибудь есть идеи, как решить эту проблему или использовать два исполняемых файла с разными конфигурациями, мой единственный выбор?
Укажите параметры компилятора, которые вы используете для обеих конфигураций. Например, возможно, что в каждой конфигурации используется другое соглашение о вызове по умолчанию (или какой-либо другой параметр, который делает их несовместимыми). – cdhowie
Вы можете отключить отладку итератора, чтобы сделать их совместимыми. Мой совет, когда он болит, как это, однако, просто не делайте этого. –