YStudio Y++

DLL / 系统 API(`.yp`)

Y++ / YStudio 开发文档 · 一点滴

在工程中声明 Windows / DLL 导出函数,供 .yc别名调用。结构体仍放 .yt

运行时通过 LoadLibrary + GetProcAddress 解析导出,不需要导入 .lib

第三方插件更推荐不用 .yp.yc加载DLL取导出函数调用函数Ex 即可,无需 @模块。见 third-party-dll.md
本文主要覆盖 系统 API 与「希望用中文别名」的静态声明。

新建

工程树 → 源代码 → 右键 → 新建 API 文件(后缀 .yp)。

语法

库名:多种写法(系统 API 可省略库名)

逻辑 GetWindowRect(整数 窗口句柄, &矩形 框) 取窗口矩形   // 系统 API:自动在 user32 等中查找
@"gdi32.dll"                          // 可选:登记库
gdi32 整数 GetDeviceCaps(...) 取设备能力   // 库短名
@模块 g_插件模块                       // 从 global.yc 里 加载DLL 的全局句柄取导出(仅当你坚持用 .yp 别名时)
整数 GetTickCount() 取启动毫秒 @"kernel32.dll"  // 别名后写库

同一文件里用 @"user32.dll" 切一次库后,后面的声明可以不加短名前缀(跟当前库)。

返回类型可省略 = 无

user32 DestroyWindow(整数 窗口句柄) 销毁窗口
无 DestroyWindow(整数 窗口句柄) 销毁窗口   // 显式写「无」也可以

声明函数

[库短名] [返回类型] API导出名(类型 参数, ...) 别名 [@"库.dll"]
部分 含义
库短名 可选;gdi32 等同 gdi32.dll
返回类型 可省略;省略=无返回值
API导出名 DLL 真实导出名
参数 见下表
别名 Y++ 中调用的名字

结构体引用(与回调、C 指针的区别)

三种等价写法(仅自定义 .yt 类型,编组为 Win 结构指针,类似 RECT*):

&矩形 框
矩形 &框
引用 矩形 框

数组 / 字节缓冲(传给 DLL 的连续内存)

写法 传给 DLL .yc
字节 缓冲[] BYTE*(空则 nullptr 字节 缓冲[](对应字节数组缓冲)
字节集 缓冲 BYTE*(同上) 字节集 亦可(勿再写 []
整数 表[] / 长整数 表[] long long* 同左
短整数 表[] long long*(与 .yc 短整数数组元素一致) 短整数 表[]
小数 表[] / 双浮点 表[] double* 同左
单浮点 表[] float* 单浮点 表[]
逻辑 表[] int* 逻辑 表[]

不支持 []文本 / 文本A、结构体引用(&类型)、子程序指针

' .yp — 字节数组形参
kernel32 逻辑 ReadFile(整数 句柄, 字节 缓冲[], 整数 要读, 整数 已读指针) 读取数据

' .yc
字节 缓冲[]
重定义尺寸(缓冲, 4096)   ' 或按你们工程里的扩容写法
整数 已读 = 0
读取数据(h, 缓冲, 取数组成员数(缓冲), DLL_整数指针(已读))

说明: - 请写 类型 名[](与普通变量一致),例如 字节 字节数组[] - 字节 字节数组(无 [])只是单个字节,不是数组 - 整数[] 元素是 64 位;若 DLL 要的是 32 位 int*,请继续用地址缓冲手段

C / Win Y++ .yp
RECT* / POINT* 等结构指针 &矩形 / &坐标点(须先在 .yt 定义)
LPCWSTR / wchar_t* 文本
LPCSTR / char*(窄字符) 文本A
int / INT_PTR / 句柄 整数(或长整数等)
BOOL 逻辑
BYTE* / 字节数组 字节 名[](或 字节集
int64_t* / 元素数组 整数 名[]
函数指针回调 子程序指针 名不要&

说明:当前 & / 引用 不是任意 int*,而是「指向 .yt 结构体」的出入参。

裸指针请用支持库 DLL支持 命令转成地址,再交给 .yp 里声明为 整数 的形参:

命令 用途
DLL_文本指针W(文本) LPCWSTR 地址
DLL_文本指针A(文本) → UTF-8 LPCSTR 地址(TLS 缓冲)
DLL_整数指针(整数变量) int* / 出参地址(调用后直接读该变量)

完整对照(含字节集指针、const、结构嵌套、库名省略、按地址 Call):dll-pointers.md
第三方插件(加载路径、出参、long*、回调、类封装):third-party-dll.md

// .yp
kernel32 整数 lstrlenW(整数 串指针) 宽串长度指针
kernel32 逻辑 GetExitCodeProcess(整数 进程, 整数 退出码指针) 取进程退出码指针

// .yc
整数 n = 宽串长度指针(DLL_文本指针W("hello"))
整数 code = 0
取进程退出码指针(取当前进程(), DLL_整数指针(code))

Y++ 没有 string 关键字,字符串用 文本(宽字符)或 文本A(窄字符)。

子程序指针(回调)不要加 &

逻辑 EnumWindows(子程序指针 回调, 整数 参数) 枚举窗口

与支持库命令同名时,工程 .yp 别名优先

.yc 调用

矩形 r
如果 (取窗口矩形(主窗口.句柄, r))
    消息框(0, "宽=" + 到文本(r.right - r.left), "标题", 0)

从 C 声明一键转换

打开 .yp 后:工程树或编辑器右键 → API 转 Y++ 声明…