Нарушение прав доступа Вызов в динамически загружаемую DLL с C ++ - PullRequest
0 голосов
/ 27 июля 2011

У меня есть dll (код C), который построен с использованием VS2010 и определяет набор функций. У меня также есть exe (код C ++), построенный с использованием VS2010, который динамически загружает DLL и вызывает функции. Первая пара вызовов функций работает нормально, затем примерно в 20% случаев вызов третьей функции вызывает нарушение прав доступа по нулевому адресу. Остальные 80% времени звонка в порядке. Это всегда один и тот же вызов функции, который вызывает проблему.

typedef void (__cdecl *mtSim_ResetODScan)(void);
mtSim_ResetODScan mpSim_ResetODScan;

if ((mpSim_ResetODScan = (mtSim_ResetODScan)GetProcAddress(mhSimDLL,
    "_Sim_ResetODScan")) == NULL) return 0;

В этот момент mpSim_ResetODScan = 0x5E9741D0. Позже функция вызывается, и когда я отлаживаю исполняемый файл, она прерывает выполнение при вызове функции:

mpSim_ResetODScan();

Попытка войти в функцию приводит к нарушению доступа. Отладчик VS сообщает, что mpSim_ResetODScan по-прежнему имеет значение 0x5E9741D0.

Комментирование всего кода внутри функции в dll не имеет значения.

В DLL:

extern "C" __declspec(dllexport) void __cdecl _Sim_ResetODScan(void);

Dependency Walker показывает, что dll и exe используют MSVCR100.DLL версии 10.0.30319.460.

Любые предложения о том, как я могу отладить это дальше или какие-либо подсказки о вещах, которые я мог пропустить?

1 Ответ

0 голосов
/ 27 июля 2011

Попробуйте запустить программу в обычном режиме под самим отладчиком и установите точку останова данных вокруг переменной mpSim_ResetODScan - чтобы увидеть, когда она может измениться.Кажется, проблема переполнения буфера.

...