C++调用易语言编写的DLL的几点注意

作者: CCA2878 分类: 编程/Program 发布时间: 2019-12-10 20:51

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; ,那么只会显示该字符串第一个字符。

一条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云