访问冲突使用C ++调用动态加载的DLL

时间:2011-07-27 11:53:43

标签: c++ visual-studio-2010 dll linker

我有一个使用VS2010构建的DLL(C代码)并定义了一组函数。我还有一个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 :(得分:0)

尝试在调试器本身下正常运行程序,并在变量mpSim_ResetODScan周围放置数据断点 - 以查看它何时可能发生变化。似乎是缓冲区溢出的问题。