在录制易语言调用C++编写的DLL时,出现了调出DLL后堆栈出错的问题
c++源码:
// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) int add(int a, int b) { return (a + b); } extern "C" __declspec(dllexport)int sub(int a, int b) { return (a - b); }
解决办法:
把int 改成 _stdcall
extern "C" __declspec(dllexport) int _stdcall add(int a, int b) { return (a + b); } extern "C" __declspec(dllexport)int _stdcall sub(int a, int b) { return (a - b); }
调用处理:
这时候原函数名称 add 和 sub会改变,我们通过DLL函数查看器找到改变后的函数名,重新在易语言中调用。
原因分析:
函数调用的时候分为三个步骤:
1、往栈里压入参数
2、转到函数所在代码执行
3、返回调用前的地方
有没有加__stdcall区别的地方在于3:
加了的话,返回的时候会把步骤1压入的参数全部清理掉
没加的话,返回的时候不会把步骤1压入的参数清理掉
函数返回时没有清理、但是易语言运行库认为它清理了的话,与期望不符,就出现“堆栈错误”