749 次浏览【转载需注明来源】
快码编程是一款优秀的跨平台编程开发工具,既然是跨平台那么肯定也是可以调用对应平台的动态链接库的~
常见的动态链接库格式有:
windows:.dll
linux:.so
mac:.dylib
上述三种动态链接库快码编程的桌面端开发都可以在对应的平台进行调用。
例如在linux中我们创建如下的动态链接库代码:
#include <stdio.h>
int add(int a,int b)
{
return a+b;
}
然后执行编译so文件的命令,分别如下:
1、gcc -c -fPIC -o 上述代码的文件名称.o 上述代码的文件名称.c
2、gcc -shared -o 上述代码的文件名称.so 上述代码的文件名称.o
通过上述的命令行代码即可得到一个so文件,接下来就可以通过快码编程来进行so链接库的调用,具体代码如下:
动态链接库.加载链接库("so文件地址",{
'add': ['int', ['int', 'int']]
})
调试输出(动态链接库.使用命令("add")(1,5))
下面在用windows的dll做一个演示【在快码编程这一层,调用的方式没有任何的区别】
值得注意的是:
1、如果你是C++的用户,链接库代码可以参考上述的linux链接库代码,然后调用vsIDE编译DLL文件即可。
2、如果你是其他中文编程用户,例如:火山开发平台,则具体DLL代码参考可在本处下载:火山代码文件.zip
在快码编程中,调用也是一样的没有任何区别,具体代码如下:
局部变量 链接库ID=动态链接库.加载链接库("C:\\Users\\Administrator\\Desktop\\dllFun.dll",{
'addint': ['int', ['int', 'int']],
'adddouble': ['double', ['double', 'double']],
'addstr': ['str', ['str', 'str']],
'addnoRun': ['void', ['str', 'str']]
})
调试输出(动态链接库.使用命令("addint",链接库ID)(1,5))
调试输出(动态链接库.使用命令("adddouble",链接库ID)(1.1,5.5))
调试输出(动态链接库.使用命令("addstr",链接库ID)("我是字符串","12345"))
动态链接库.使用命令("addnoRun",链接库ID)('小狐狸','咿呀咿呀哟')
局部变量 链接库ID2=动态链接库.加载链接库("user32.dll",{ "MessageBoxW": ["int", ['void *', 'str16', 'str16', 'uint']]})
局部变量 返回结果=动态链接库.使用命令("MessageBoxW",链接库ID2)(null, '是否确认执行xxxxx?', '我是标题', 0x4 | 0x20)
如果 (返回结果==6) {
调试输出("点击了确认")
}否则{
调试输出("点击了取消")
}
//也可以直接通过字符串方式使用命令!
局部变量 链接库ID3=动态链接库.加载链接库("user32.dll",{ "MessageBoxW": "int __stdcall MessageBoxW(void *hwnd, str16 text, str16 caption, uint type)"})
返回结果=动态链接库.使用命令("MessageBoxW",链接库ID3)(null, '是否确认执行cccc?', '我是标题', 0x4 | 0x20)
如果 (返回结果==6) {
调试输出("点击了确认")
}否则{
调试输出("点击了取消")
}
案例供展示了以下用法,分别是:
1、调用一个两个整数参数相加并返回整数的DLL函数
2、调用两个小数相加并返回小数的DLL函数
3、调用两个字符串相加,并返回字符串的DLL函数【注意:在C++中,类型需要是:char*的指针类型】
4、调用一个没有返回值的函数,结果为两个字符串相加
5、调用系统动态链接库命令
6、直接通过纯文本方式调用动态链接库命令
最后文章结尾,关于dylib的调用与上面的方式一样,只不过大家需要自行在mac系统中准备dylib链接库文件
使用快码调用DLL支持的数值类型有如下:
C type |
JS type |
Bytes |
Signedness |
Note |
---|---|---|---|---|
void |
Undefined |
0 |
|
Only valid as a return type |
int8, int8_t |
Number (integer) |
1 |
Signed |
|
uint8, uint8_t |
Number (integer) |
1 |
Unsigned |
|
char |
Number (integer) |
1 |
Signed |
|
uchar, unsigned char |
Number (integer) |
1 |
Unsigned |
|
char16, char16_t |
Number (integer) |
2 |
Signed |
|
int16, int16_t |
Number (integer) |
2 |
Signed |
|
uint16, uint16_t |
Number (integer) |
2 |
Unsigned |
|
short |
Number (integer) |
2 |
Signed |
|
ushort, unsigned short |
Number (integer) |
2 |
Unsigned |
|
int32, int32_t |
Number (integer) |
4 |
Signed |
|
uint32, uint32_t |
Number (integer) |
4 |
Unsigned |
|
int |
Number (integer) |
4 |
Signed |
|
uint, unsigned int |
Number (integer) |
4 |
Unsigned |
|
int64, int64_t |
Number (integer) |
8 |
Signed |
|
uint64, uint64_t |
Number (integer) |
8 |
Unsigned |
|
longlong, long long |
Number (integer) |
8 |
Signed |
|
ulonglong, unsigned long long |
Number (integer) |
8 |
Unsigned |
|
float32 |
Number (float) |
4 |
|
|
float64 |
Number (float) |
8 |
|
|
float |
Number (float) |
4 |
|
|
double |
Number (float) |
8 |
|
虽然C标准允许大多数整数类型的大小变化,但快码FOF对大多数原始类型执行相同的定义,如下所示:
C type |
JS type |
Signedness |
Note |
---|---|---|---|
bool |
Boolean |
|
Usually one byte |
long |
Number (integer) |
Signed |
4 or 8 bytes depending on platform (LP64, LLP64) |
ulong |
Number (integer) |
Unsigned |
4 or 8 bytes depending on platform (LP64, LLP64) |
unsigned long |
Number (integer) |
Unsigned |
4 or 8 bytes depending on platform (LP64, LLP64) |
intptr |
Number (integer) |
Signed |
4 or 8 bytes depending on register width |
intptr_t |
Number (integer) |
Signed |
4 or 8 bytes depending on register width |
uintptr |
Number (integer) |
Unsigned |
4 or 8 bytes depending on register width |
uintptr_t |
Number (integer) |
Unsigned |
4 or 8 bytes depending on register width |
str, string |
String |
|
JS strings are converted to and from UTF-8 |
str16, string16 |
String |
|
JS strings are converted to and from UTF-16 (LE) |
快码FOF定义了敏感类型,可用于处理二进制数据
JS type |
C type |
Bytes |
Signedness |
Endianness |
---|---|---|---|---|
Number (integer) |
int16_le, int16_le_t |
2 |
Signed |
Little Endian |
Number (integer) |
int16_be, int16_be_t |
2 |
Signed |
Big Endian |
Number (integer) |
uint16_le, uint16_le_t |
2 |
Unsigned |
Little Endian |
Number (integer) |
uint16_be, uint16_be_t |
2 |
Unsigned |
Big Endian |
Number (integer) |
int32_le, int32_le_t |
4 |
Signed |
Little Endian |
Number (integer) |
int32_be, int32_be_t |
4 |
Signed |
Big Endian |
Number (integer) |
uint32_le, uint32_le_t |
4 |
Unsigned |
Little Endian |
Number (integer) |
uint32_be, uint32_be_t |
4 |
Unsigned |
Big Endian |
Number (integer) |
int64_le, int64_le_t |
8 |
Signed |
Little Endian |
Number (integer) |
int64_be, int64_be_t |
8 |
Signed |
Big Endian |
Number (integer) |
uint64_le, uint64_le_t |
8 |
Unsigned |
Little Endian |
Number (integer) |
uint64_be, uint64_be_t |
8 |
Unsigned |
Big Endian |
本文重点要讲解的知识:
由于JS的特殊性,会增加DLL复杂类型的交互难度,所以建议大家多使用指针来进行交互。
例如:将一些特殊的数据转换为指针传递到快码编程层;又例如:将一些文件字节数据编码后用文本传递给JS层。【C++万物皆可指针,大家使用快码调用DLL时,请多多使用指针方式】
重点:快码调用的dll、so、dylib必须标准的C代码编写才可以!
测试账号
快码FOF编程 Time: 2023-06-26 15:43:21
评论ID
DLL调用的案例
轻声奏乐写代码 Time: 2023-06-29 09:45:38
评论ID
非常好 点赞
1885****6307 Time: 2023-07-31 11:10:50
评论ID
易语言写的DLL不能调用吗???
快码FOF编程 回复 3楼 1885****6307 Time: 2023-08-05 20:34:46
评论ID
只有打开32位的快码IDE,才可以调用32位DLL
快码FOF编程 Time: 2023-08-17 07:29:15
评论ID
案例来了
快码FOF编程 Time: 2023-08-24 18:52:57
评论ID
已更新32位快码IDE,通过此IDE可以调用32位的DLL