易语言调用C++编写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压入的参数清理掉

函数返回时没有清理、但是易语言运行库认为它清理了的话,与期望不符,就出现“堆栈错误”


发布日期:

所属分类: 易语言 标签: