Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
ying32 committed Aug 12, 2023
2 parents 8b3ee76 + 3748184 commit 8af1366
Show file tree
Hide file tree
Showing 184 changed files with 162,686 additions and 138,989 deletions.
16 changes: 9 additions & 7 deletions Compile.README.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

### liblcl

liblcl Based on Lazarus 2.2 version FPC 3.2.2, the specific installation method of each platform refers to the official website installation instructions.
liblcl Based on Lazarus 2.2.2 version FPC 3.2.2, the specific installation method of each platform refers to the official website installation instructions.

The liblcl project source code is located in the "liblcl/src" directory. `liblcl for Windows, Linux, MacOS`.

Expand All @@ -17,10 +17,12 @@ Compile steps:
* 4. Menu -> Project -> Project Options -> Compiler Options -> Build modes Switch the relevant ring mode. The current valid mode is as follows:
* Win32
* Win64
* Linux32 **(Untested)**
* Linux64
* Linux32
* LinuxARM
* MacOS64(cocoa)
* LinuxARM **(Untested)**
* LinuxARM64 **(Untested)**
* MacOS64(cocoa)
* MacOS M1 **(Untested)**

* 5. menu -> Run-> Build or Shift + F9 (Must use Build)

Expand All @@ -29,6 +31,6 @@ The compiled binary can be viewed in the following directory:
**Note: This directory is my local compilation directory, please modify the corresponding output location if you compile it yourself.**
Output liblcl location modification: `Menu -> Project -> Project Options -> Compiler Options -> Build modes Switch the relevant ring mode -> Target file name`

> Windows: `"..\..\..\..\..\bin\liblcl"`
> Linux: `"../bin/liblcl"`
> MacOS: `"../../../../../bin/liblcl"`
> Windows: `..\bin\$(TargetCPU)-$(TargetOS)\liblcl`
> Linux: `../bin/$(TargetCPU)-$(TargetOS)/liblcl`
> MacOS: `../bin/$(TargetCPU)-$(TargetOS)/liblcl`
18 changes: 11 additions & 7 deletions Compile.README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

### liblcl

liblcl 基于Lazarus 2.2 版本 FPC 3.2.2,具体各个平台的安装方式自行参考官网安装说明, 其它版本编译出现的问题请自行解决相关。。
liblcl 基于Lazarus 2.2.2 版本 FPC 3.2.2,具体各个平台的安装方式自行参考官网安装说明, 其它版本编译出现的问题请自行解决相关。。

liblcl工程源码位于"liblcl/src"目录。`liblcl适用于Windows、Linux、MacOS`

Expand All @@ -18,10 +18,13 @@ liblcl工程源码位于"liblcl/src"目录。`liblcl适用于Windows、Linux、M
* 4、菜单->Project->Project Options -> Compiler Options -> Build modes 切换相关编环模式,当前有效模式为以下几种种:
* Win32
* Win64
* Linux32 **(未经测试)**
* Linux64
* Linux32
* LinuxARM
* MacOS64(cocoa) 。
* LinuxARM **(未经测试)**
* LinuxARM64 **(未经测试)**
* MacOS64(cocoa)
* MacOS M1 **(未经测试)**

* 5、菜单 -> Run -> Build 或者 Shift + F9 (必须使用Build)

**注意: 如你想要编译ARM和Linux 32位的liblcl则需要在对应平台安装相应的[Lazarus](http://www.lazarus-ide.org/)和FPC。也可考虑安装[CodeTyphon](http://www.pilotlogic.com/sitejoom/index.php/codetyphon)进行交叉编译,不过挺麻烦。**
Expand All @@ -31,6 +34,7 @@ liblcl工程源码位于"liblcl/src"目录。`liblcl适用于Windows、Linux、M
**注意:此目录为我本机编译目录,自行编译请修改相应的输出位置。**
输出liblcl位置修改:`Menu -> Project -> Project Options -> Compiler Options -> Build modes Switch the relevant ring mode -> Target file name`

> Windows: `"..\..\..\..\..\bin\liblcl"`
> Linux: `"../bin/liblcl"`
> MacOS: `"../../../../../bin/liblcl"`
> Windows: `..\bin\$(TargetCPU)-$(TargetOS)\liblcl`
> Linux: `../bin/$(TargetCPU)-$(TargetOS)/liblcl`
> MacOS: `../bin/$(TargetCPU)-$(TargetOS)/liblcl`
102 changes: 26 additions & 76 deletions README.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,6 @@ A common cross-platform GUI library, the core uses Lazarus LCL.

* c/c++: [Tools/genBind/c](Tools/genBind/c)

* Highly completed languages:

* nim(Beta): https://github.com/ying32/nim-vcl
* rust(Test): https://github.com/ying32/rust-vcl

* Language under test




----

Language binding tool generator: [genBind](Tools/genBind), c/c++, rust and nim have been generated. Refer to the binding template files of these languages for details.
Expand All @@ -50,44 +40,6 @@ The `utf-8` encoding is used by default on all platforms.

----

##### Use structured exception handling functions

*Note: If the `UsehandleException` compilation instruction is enabled in the `ExtDecl.inc` file of the liblcl source code, then there is no longer a need for `MySyscall` to handle exceptions, but the compiled file will increase, and it will increase by about 1M under Windows, Linux It will increase about 3M under macOS, and about 2.5M under macOS.*

```c

// Type definition
typedef uint64_t(LCLAPI *MYSYSCALL)(void*, intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);

// Get this function from DLL
pMySyscall = (MYSYSCALL)get_proc_addr("MySyscall");

// ----------- Instructions -----------
#define DEFINE_FUNC_PTR(name) \
static void* p##name;

#define GET_FUNC_ADDR(name) \
if(!p##name) \
p##name = get_proc_addr(""#name""); \
assert(p##name != NULL);

#define COV_PARAM(name) \
(uintptr_t)name

#define MySyscall(addr, len, a1, a2 , a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
pMySyscall((void*)addr, (intptr_t)len, COV_PARAM(a1), COV_PARAM(a2), COV_PARAM(a3), COV_PARAM(a4), COV_PARAM(a5), COV_PARAM(a6), COV_PARAM(a7), COV_PARAM(a8), COV_PARAM(a9), COV_PARAM(a10), COV_PARAM(a11), COV_PARAM(a12))


// The function defined in this way can catch the exception thrown by LCL in DLL
DEFINE_FUNC_PTR(Application_Instance)
TApplication Application_Instance() {
GET_FUNC_ADDR(Application_Instance)
return (TApplication)MySyscall(pApplication_Instance, 0 ,0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0);
}
```
----
##### Default instanced class

*No need to manually call create and release.*
Expand Down Expand Up @@ -128,19 +80,19 @@ Printer = Printer_Instance();
* Basic event callback
```c
typedef void(*SYSCALL0)();
typedef void(*SYSCALL1)(intptr_t);
typedef void(*SYSCALL2)(intptr_t, uintptr_t);
typedef void(*SYSCALL3)(intptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL4)(intptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL5)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL6)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL7)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL8)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL9)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL10)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL11)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL12)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL0)();
typedef void(*ESYSCALL1)(intptr_t);
typedef void(*ESYSCALL2)(intptr_t, uintptr_t);
typedef void(*ESYSCALL3)(intptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL4)(intptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL5)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL6)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL7)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL8)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL9)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL10)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL11)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL12)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
// Callback function prototype
Expand All @@ -153,19 +105,19 @@ static void* LCLAPI doEventCallbackProc(void* f, void* args, long argCount) {
getParamOf(index, args)
switch (argCount) {
case 0: ((SYSCALL0) (f))(); break;
case 1: ((SYSCALL1) (f))(_A_(0)); break;
case 2: ((SYSCALL2) (f))(_A_(0), _A_(1)); break;
case 3: ((SYSCALL3) (f))(_A_(0), _A_(1), _A_(2)); break;
case 4: ((SYSCALL4) (f))(_A_(0), _A_(1), _A_(2), _A_(2)); break;
case 5: ((SYSCALL5) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4)); break;
case 6: ((SYSCALL6) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5)); break;
case 7: ((SYSCALL7) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6)); break;
case 8: ((SYSCALL8) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7)); break;
case 9: ((SYSCALL9) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8)); break;
case 10: ((SYSCALL10)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9)); break;
case 11: ((SYSCALL11)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10)); break;
case 12: ((SYSCALL12)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10), _A_(11)); break;
case 0: ((ESYSCALL0) (f))(); break;
case 1: ((ESYSCALL1) (f))(_A_(0)); break;
case 2: ((ESYSCALL2) (f))(_A_(0), _A_(1)); break;
case 3: ((ESYSCALL3) (f))(_A_(0), _A_(1), _A_(2)); break;
case 4: ((ESYSCALL4) (f))(_A_(0), _A_(1), _A_(2), _A_(2)); break;
case 5: ((ESYSCALL5) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4)); break;
case 6: ((ESYSCALL6) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5)); break;
case 7: ((ESYSCALL7) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6)); break;
case 8: ((ESYSCALL8) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7)); break;
case 9: ((ESYSCALL9) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8)); break;
case 10: ((ESYSCALL10)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9)); break;
case 11: ((ESYSCALL11)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10)); break;
case 12: ((ESYSCALL12)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10), _A_(11)); break;
}
// Always return NULL
return NULL;
Expand Down Expand Up @@ -290,8 +242,6 @@ static void un_init_lib_lcl() {
### C language call liblcl example

```c
// main.c : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "liblcl.h"

Expand Down
98 changes: 26 additions & 72 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,6 @@

* c/c++: [Tools/genBind/c](Tools/genBind/c)

* 完成度较高的语言:

* nim(Beta): https://github.com/ying32/nim-vcl
* rust(test): https://github.com/ying32/rust-vcl

* 测试中的语言

----

语言绑定工具生成器:[genBind](Tools/genBind),目前已经生成了c/c++、rust、nim的,详细参考这几种语言的绑定模板文件。
Expand All @@ -48,43 +41,6 @@

----

##### 使用结构化异常处理的函数

*注: 如果在liblcl源代码`ExtDecl.inc`文件中启用了`UsehandleException`编译指令,则不再需要`MySyscall`处理异常,但编译出的文件会增大,Windows下会增加约1M左右,Linux下会增加3M左右,macOS下会增加2.5M左右。*

```c
// 类型定义
typedef uint64_t(LCLAPI *MYSYSCALL)(void*, intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);

// 从DLL中获取此函数
pMySyscall = (MYSYSCALL)get_proc_addr("MySyscall");

// ----------- 使用方法 -----------
#define DEFINE_FUNC_PTR(name) \
static void* p##name;

#define GET_FUNC_ADDR(name) \
if(!p##name) \
p##name = get_proc_addr(""#name""); \
assert(p##name != NULL);

#define COV_PARAM(name) \
(uintptr_t)name

#define MySyscall(addr, len, a1, a2 , a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
pMySyscall((void*)addr, (intptr_t)len, COV_PARAM(a1), COV_PARAM(a2), COV_PARAM(a3), COV_PARAM(a4), COV_PARAM(a5), COV_PARAM(a6), COV_PARAM(a7), COV_PARAM(a8), COV_PARAM(a9), COV_PARAM(a10), COV_PARAM(a11), COV_PARAM(a12))


// 如此定义的函数就可以捕捉DLL中LCL抛出的异常
DEFINE_FUNC_PTR(Application_Instance)
TApplication Application_Instance() {
GET_FUNC_ADDR(Application_Instance)
return (TApplication)MySyscall(pApplication_Instance, 0 ,0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0);
}
```
----
##### 默认的实例类

*无需手动调用创建和释放。*
Expand Down Expand Up @@ -127,19 +83,19 @@ Printer = Printer_Instance();
```c
typedef void(*SYSCALL0)();
typedef void(*SYSCALL1)(intptr_t);
typedef void(*SYSCALL2)(intptr_t, uintptr_t);
typedef void(*SYSCALL3)(intptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL4)(intptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL5)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL6)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL7)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL8)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL9)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL10)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL11)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*SYSCALL12)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL0)();
typedef void(*ESYSCALL1)(intptr_t);
typedef void(*ESYSCALL2)(intptr_t, uintptr_t);
typedef void(*ESYSCALL3)(intptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL4)(intptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL5)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL6)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL7)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL8)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL9)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL10)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL11)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
typedef void(*ESYSCALL12)(intptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
// 回调函数原型
Expand All @@ -154,19 +110,19 @@ static void* LCLAPI doEventCallbackProc(void* f, void* args, long argCount) {
getParamOf(index, args)
switch (argCount) {
case 0: ((SYSCALL0) (f))(); break;
case 1: ((SYSCALL1) (f))(_A_(0)); break;
case 2: ((SYSCALL2) (f))(_A_(0), _A_(1)); break;
case 3: ((SYSCALL3) (f))(_A_(0), _A_(1), _A_(2)); break;
case 4: ((SYSCALL4) (f))(_A_(0), _A_(1), _A_(2), _A_(2)); break;
case 5: ((SYSCALL5) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4)); break;
case 6: ((SYSCALL6) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5)); break;
case 7: ((SYSCALL7) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6)); break;
case 8: ((SYSCALL8) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7)); break;
case 9: ((SYSCALL9) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8)); break;
case 10: ((SYSCALL10)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9)); break;
case 11: ((SYSCALL11)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10)); break;
case 12: ((SYSCALL12)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10), _A_(11)); break;
case 0: ((ESYSCALL0) (f))(); break;
case 1: ((ESYSCALL1) (f))(_A_(0)); break;
case 2: ((ESYSCALL2) (f))(_A_(0), _A_(1)); break;
case 3: ((ESYSCALL3) (f))(_A_(0), _A_(1), _A_(2)); break;
case 4: ((ESYSCALL4) (f))(_A_(0), _A_(1), _A_(2), _A_(2)); break;
case 5: ((ESYSCALL5) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4)); break;
case 6: ((ESYSCALL6) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5)); break;
case 7: ((ESYSCALL7) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6)); break;
case 8: ((ESYSCALL8) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7)); break;
case 9: ((ESYSCALL9) (f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8)); break;
case 10: ((ESYSCALL10)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9)); break;
case 11: ((ESYSCALL11)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10)); break;
case 12: ((ESYSCALL12)(f))(_A_(0), _A_(1), _A_(2), _A_(3), _A_(4), _A_(5), _A_(6), _A_(7), _A_(8), _A_(9), _A_(10), _A_(11)); break;
}
return NULL;
}
Expand Down Expand Up @@ -293,8 +249,6 @@ static void un_init_lib_lcl() {
### c语言调用liblcl示例

```c
// main.c : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "liblcl.h"

Expand Down
Loading

0 comments on commit 8af1366

Please sign in to comment.