用c++写的dll,另一个exe程序调用dll中的函数,结果dll函数返回时报access violation 异常;调试dll函数时,每一步都正常,就在函数返回时报av异常,通过分析发现,是函数调用时的调用约定与导出时声明的调用约定不同造成的。比如,在dll中如下声明导出函数:
extern "C" __declspec(dllexport)
bool __stdcall GetNextRecord(HANDLE hFile,
void* pv);
而在exe调用时,如下声明和获取函数:
typedef bool (*lpGetNextRecord)(HANDLE hFile,
Eoas_Atp200C* p200C);
lpGetNextRecord getNextRec = (lpGetNextRecord)GetProcAddress(hDll,
"GetNextRecord");
即没有声明调用方式,这时候可能会使用默认的__cdecl
调用方式,这样在调用函数的时候有时会报av异常。