C++调用易语言编写的DLL的几点注意
1.
DLL的调用方式
#include<Windows.h>
HMODULE mod = LoadLibrary("xxx.dll");
typedef unsigned char* (CALLBACK _stdcall *ProcessSub)(int,int);
ProcessSub pf = (ProcessSub)GetProcAddress(mod, "xxx");
unsigned char* xxx=pf();
先加载DLL,然后typedef定义数据类型。
unsigned char* 为函数返回值类型,一般非整数返回要传递指针。
CALLBACK _stdcall 这两个都是必需的。
(int,int) 括号内为函数参数个数及类型,一样非整数则需要传递指针,因此大多数情况下可以定义为int,然后强制类型转换。
下面定义了一个使用刚定义好的数据类型的变量pf,同时初始化指向GetProcAddress函数。
该函数两个参数,首先是DLL库,类型为HMODULE,上面用LoadLibrary加载过了。第二是是DLL内定义的函数名,不必多说。
该函数返回函数指针,一般需要强制类型转换到定义的数据类型。
然后就可以像函数一样使用:pf(1,2);。需要注意返回值类型和是否传递指针。
2.
相关注意点
(1)
HMODULE LoadLibrary( _In_ LPCTSTR lpFileName);
该函数的参数类型为LPWSTR 。在VS2019内直接使用C字符串(类似于:“123”)会报错。
这时候只要进项目属性,按图示设置即可。

(2)
由于易语言最大化地做到了简洁易用,那么C++调用它写的DLL就麻烦了。
首先,给别的语言写的DLL,任何时候不要用易语言的“文本型”。
这个貌似是它自创的数据类型,根本没法跨语言交流。(Run-time Check Error #0警告)
想传递字符串,首先必须传递指针。在这里“string”便不能用,这是个“类”而不是数据类型,它的指针是指向“类”而不是数据类型指针。必须使用“char”类型。
其次,易语言对应的子程序参数要设置为整数型(指针是代表内存地址的整数),并且应增加一个整数型参数来接收字符串的长度(可以用sizeof函数获取字符串长度)。
如果子程序返回“文本”,则返回值设置为字节集,C++内数据类型定义为char*。
如果返回“文本”则返回值类型设置为字节集。
(3)
上面定义数据类型时的“_stdcall”也不可省略。
C++默认调用方式为“_cdecl”,此方式调用易语言编译的DLL可能会出问题。因此需要加上声明。
(4)
返回值类型为“字节集”的子程序,实际上是返回字符串指针。
由于char的特性,如果这么写:cout<<*char; ,那么只会显示该字符串第一个字符。
Jimmy Ho
2019年12月10日 21:06
大佬发文,必属精品!