当前博客:关于快码编程跨平台调用动态链接库说明

749 次浏览【转载需注明来源】

博客作者:【快码FOF编程】

个性签名:寒窗苦读十年一朝凤舞九天

快码编程是一款优秀的跨平台编程开发工具,既然是跨平台那么肯定也是可以调用对应平台的动态链接库的~

常见的动态链接库格式有:

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代码编写才可以!

默认排序
Generic placeholder image
Generic placeholder image
快码FOF编程 Time: 2023-06-26 15:43:21

DLL调用的案例

Generic placeholder image
轻声奏乐写代码 Time: 2023-06-29 09:45:38

非常好 点赞

Generic placeholder image
1885****6307 Time: 2023-07-31 11:10:50

易语言写的DLL不能调用吗???

Generic placeholder image
快码FOF编程 回复 3楼 1885****6307 Time: 2023-08-05 20:34:46

只有打开32位的快码IDE,才可以调用32位DLL

Generic placeholder image
快码FOF编程 Time: 2023-08-17 07:29:15

案例来了

Generic placeholder image
快码FOF编程 Time: 2023-08-24 18:52:57

已更新32位快码IDE,通过此IDE可以调用32位的DLL


关于快码编程跨平台调用动态链接库说明