📝 docs(tsl): align agent-facing guidance
This commit is contained in:
@@ -14,6 +14,14 @@
|
||||
|
||||
回答“普通函数怎么写已经清楚后,外部 DLL、函数指针、多线程这些系统交互能力应该去哪里查”。
|
||||
|
||||
## Agent 外部调用/线程判断流程
|
||||
|
||||
1. 先判断要声明外部函数、绑定函数指针,还是处理线程相关能力。
|
||||
2. 外部函数声明只照已验证的调用约定、`external` 和可选 `name` 形态写。
|
||||
3. DLL 名优先写字面量或已验证类常量,不要拼接表达式。
|
||||
4. 函数指针包装和线程相关能力只照本页已验证边界写。
|
||||
5. 没有已验证代码块时不要发明外部调用/线程写法。
|
||||
|
||||
## 必须记住的规则
|
||||
|
||||
- 当前解释器接受 `function Name(...): Type; stdcall|cdecl; external "dll" [name "symbol"];` 这类外部函数声明。
|
||||
@@ -24,6 +32,7 @@
|
||||
- 当前已验证的 DLL 名写法包括字面量字符串和类常量字符串;不要把字符串拼接表达式直接当成稳定写法。
|
||||
- `MakeInstance(ThisFunction(Func), "cdecl", 0)` 当前可以把 TSL 函数包装成 C 调用约定函数指针。
|
||||
- `MakeInstance(..., "cdecl", 1)` 当前在 `Win64` 下已经拿到最小线程正例,可以直接交给 `CreateThread`。
|
||||
- 外部库名和调用约定要按目标平台选择;不要把 Windows 的 `kernel32.dll` 示例直接复制到 Linux,或把 Linux 的 `.so` 示例直接复制到 Windows。
|
||||
- 当前页的线程示例是 Windows 专题,用到了 `kernel32.dll`。
|
||||
|
||||
## 已验证语法
|
||||
@@ -46,6 +55,32 @@ end.
|
||||
- 说明当前解释器接受 `stdcall` + `external "dll" name "symbol"` 这类外部函数声明骨架
|
||||
- 也说明 TSL 里的函数名可以和 DLL 导出名不同,再通过 `name "ExportName"` 绑定
|
||||
|
||||
代码块身份:已验证输出片段
|
||||
|
||||
```text
|
||||
1
|
||||
```
|
||||
|
||||
Linux / POSIX 环境的同类最小骨架:
|
||||
|
||||
代码块身份:已验证可执行示例
|
||||
|
||||
```tsl
|
||||
program test;
|
||||
function getpid(): integer; cdecl; external "libc.so.6";
|
||||
begin
|
||||
WriteLn(getpid() > 0);
|
||||
end.
|
||||
```
|
||||
|
||||
代码块身份:已验证输出片段
|
||||
|
||||
```text
|
||||
1
|
||||
```
|
||||
|
||||
这段只说明 Linux / POSIX 目标下可以用 `.so` 库名声明外部函数;生成代码时仍要先判断用户的目标平台。
|
||||
|
||||
当本地函数名和 DLL 导出名一致时,`name` 可以省略:
|
||||
|
||||
代码块身份:已验证可执行示例
|
||||
|
||||
Reference in New Issue
Block a user