|
|
很多初学易语言的朋友,一提到“调用DLL”和“自定义导出函数”就犯怵:概念抽象、调试困难、崩溃不报错。其实只要把几个关键点理顺,这事并不神秘。这里结合自己的踩坑经历,完整说一下思路与常见坑,力求能让你照着就能跑起来。
先说调用DLL的前置知识。DLL里导出的函数,本质上就是一段可复用的代码入口。易语言调用它,需要三件事:函数名(或序号)、参数列表(类型与顺序)、调用约定(stdcall/cdecl)。很多人只关注函数名,忽略调用约定和参数类型匹配,结果不是返回值错乱就是直接崩溃。经验是:优先看官方头文件或用工具(如Dependency Walker、PE-bear)确认导出,必要时查找对应C/C++声明;若只有示例,务必核对是否是stdcall(Windows API多为stdcall,现代编译器常见__stdcall或WINAPI)。
在易语言里声明外部函数时,要精确映射类型。整数参数一般可用整型,句柄用整数型也行,但更安全是按API文档语义区分(HWND、HANDLE本质是指针宽度整数,32位与64位差异要注意)。字符串最容易出问题:ANSI与Unicode的差别、是否需要以0结尾、是否由调用方分配缓冲区。调用需要写入的字符串缓冲时,不要直接传易语言普通字符串,建议分配定长字节集(或内存块),明确传指针和长度。对返回结构体的函数,更建议用内存块按结构体大小分配,然后按偏移读写成员,逐步验证。
关于调用约定:stdcall由被调函数清栈,cdecl由调用方清栈。声明错误会导致栈不平衡,轻则返回值异常,重则瞬间崩溃。若不确定,优先尝试stdcall;若函数来自C运行库且文档标明cdecl,就按cdecl来。还有64位下统一采用Microsoft x64调用约定,参数前四个走 |
|