quickwin 1.3.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.en.md +18 -24
  2. package/README.md +17 -23
  3. package/examples/PdfCanvas.js +8 -37
  4. package/examples/PdfCanvas.tsx +11 -41
  5. package/examples/exec_server.js +20155 -1420
  6. package/examples/exec_server.tsx +489 -0
  7. package/examples/exec_server_worker.js +383 -33
  8. package/examples/exec_server_worker.ts +408 -30
  9. package/examples/pdf_preview2.js +25 -82
  10. package/examples/pdf_preview2.ts +27 -84
  11. package/examples/pdf_viewer.js +1424 -1180
  12. package/examples/pdf_viewer.tsx +16 -67
  13. package/examples/setres.js +22 -47
  14. package/examples/setres.ts +23 -57
  15. package/examples/test_gallery.js +1418 -1075
  16. package/examples/test_react_lazy.js +1391 -1059
  17. package/examples/test_react_listbox.js +1390 -1058
  18. package/examples/test_root_window.js +1384 -1052
  19. package/examples/test_tab.js +1391 -1059
  20. package/lib/abort.js +70 -0
  21. package/lib/abort.ts +69 -0
  22. package/lib/certs.js +219 -0
  23. package/lib/certs.ts +229 -0
  24. package/lib/exec-log.js +15 -0
  25. package/lib/exec-log.ts +30 -0
  26. package/lib/fetch.js +88 -7
  27. package/lib/fetch.ts +73 -7
  28. package/lib/ffi/bind.js +441 -0
  29. package/lib/ffi/bind.ts +539 -0
  30. package/lib/ffi/ctype.js +194 -0
  31. package/lib/ffi/ctype.ts +369 -0
  32. package/lib/ffi/index.js +6 -0
  33. package/lib/ffi/index.ts +6 -0
  34. package/lib/ffi/struct.js +490 -0
  35. package/lib/ffi/struct.ts +753 -0
  36. package/lib/http-common.js +43 -5
  37. package/lib/http-common.ts +48 -6
  38. package/lib/http-server.js +187 -29
  39. package/lib/http-server.ts +177 -26
  40. package/lib/react-qw/components/DateTimePicker.js +18 -37
  41. package/lib/react-qw/components/Input.js +3 -10
  42. package/lib/react-qw/components/Link.js +6 -19
  43. package/lib/react-qw/components/ListView.js +50 -154
  44. package/lib/react-qw/components/PathPicker.js +28 -88
  45. package/lib/react-qw/components/ScrollView.js +15 -8
  46. package/lib/react-qw/components/Slider.js +2 -1
  47. package/lib/react-qw/components/Tab.js +6 -22
  48. package/lib/react-qw/components/Tooltip.js +10 -21
  49. package/lib/react-qw/components/TreeView.js +8 -31
  50. package/lib/react-qw/index.js +5 -3
  51. package/lib/react-qw/index.ts +8 -3
  52. package/lib/react-qw/nmhdr.js +3 -24
  53. package/lib/react-qw/nmhdr.ts +5 -30
  54. package/lib/react-qw/props.js +7 -2
  55. package/lib/react-qw/props.ts +7 -3
  56. package/lib/react-qw/reconciler.js +23 -13
  57. package/lib/react-qw/reconciler.ts +22 -13
  58. package/lib/text-measure.js +20 -23
  59. package/lib/text-measure.ts +22 -26
  60. package/lib/websocket.js +44 -4
  61. package/lib/websocket.ts +40 -4
  62. package/lib/windows/advapi32.js +53 -0
  63. package/lib/windows/advapi32.ts +64 -0
  64. package/lib/windows/comctl32.js +18 -0
  65. package/lib/windows/comctl32.ts +19 -0
  66. package/lib/windows/comdlg32.js +8 -0
  67. package/lib/windows/comdlg32.ts +10 -0
  68. package/lib/windows/gdi32.js +392 -0
  69. package/lib/windows/gdi32.ts +420 -0
  70. package/lib/windows/kernel32.js +262 -0
  71. package/lib/windows/kernel32.ts +291 -0
  72. package/lib/windows/msimg32.js +38 -0
  73. package/lib/windows/msimg32.ts +45 -0
  74. package/lib/windows/ntdll.js +9 -0
  75. package/lib/windows/ntdll.ts +11 -0
  76. package/lib/windows/ole32.js +7 -0
  77. package/lib/windows/ole32.ts +9 -0
  78. package/lib/windows/psapi.js +32 -0
  79. package/lib/windows/psapi.ts +37 -0
  80. package/lib/windows/shell32.js +13 -0
  81. package/lib/windows/shell32.ts +16 -0
  82. package/lib/windows/structs.js +519 -0
  83. package/lib/windows/structs.ts +566 -0
  84. package/lib/windows/user32.js +572 -0
  85. package/lib/windows/user32.ts +607 -0
  86. package/lib/windows/version.js +29 -0
  87. package/lib/windows/version.ts +35 -0
  88. package/lib/windows/winspool.js +71 -0
  89. package/lib/windows/winspool.ts +80 -0
  90. package/package.json +1 -1
  91. package/quickwin.d.ts +31 -40
  92. package/quickwin_const.d.ts +137 -0
  93. package/qwin-nowasm-x86.exe +0 -0
  94. package/qwin-nowasm.exe +0 -0
  95. package/qwin-x86.exe +0 -0
  96. package/qwin.exe +0 -0
  97. package/test/bench_ffi_callraw.js +236 -0
  98. package/test/bench_ffi_callraw.ts +236 -0
  99. package/test/bench_ffi_overhead.js +139 -0
  100. package/test/bench_ffi_overhead.ts +141 -0
  101. package/test/bench_sendmessage.js +104 -0
  102. package/test/bench_sendmessage.ts +100 -0
  103. package/test/bench_sendmessage_nonnull.js +187 -0
  104. package/test/bench_sendmessage_nonnull.ts +188 -0
  105. package/test/run.js +19 -4
  106. package/test/run.ts +20 -5
  107. package/test/test_basic_fetch.js +29 -0
  108. package/test/test_basic_fetch.ts +26 -0
  109. package/test/test_ffi.js +27 -45
  110. package/test/test_ffi.ts +35 -54
  111. package/test/test_ffi_abi.js +290 -0
  112. package/test/test_ffi_abi.ts +274 -0
  113. package/test/test_ffi_array.js +116 -0
  114. package/test/test_ffi_array.ts +141 -0
  115. package/test/test_ffi_bind.js +620 -8
  116. package/test/test_ffi_bind.ts +630 -8
  117. package/test/test_ffi_struct.js +632 -88
  118. package/test/test_ffi_struct.ts +666 -91
  119. package/test/test_ffi_struct_layout.js +495 -0
  120. package/test/test_ffi_struct_layout.ts +543 -0
  121. package/test/test_ffi_user32.js +103 -0
  122. package/test/test_ffi_user32.ts +113 -0
  123. package/test/test_ffi_windows.js +101 -0
  124. package/test/test_ffi_windows.ts +113 -0
  125. package/test/test_files.js +102 -0
  126. package/test/test_files.ts +121 -0
  127. package/test/test_gdi_draw.js +681 -0
  128. package/test/test_gdi_draw.ts +725 -0
  129. package/test/test_helper.js +8 -1
  130. package/test/test_helper.ts +9 -1
  131. package/test/test_http_import.js +18 -0
  132. package/test/test_http_import.ts +19 -0
  133. package/test/test_http_server.js +73 -1
  134. package/test/test_http_server.ts +75 -1
  135. package/test/test_ipv6.js +2 -2
  136. package/test/test_ipv6.ts +2 -2
  137. package/test/test_net_fetch.js +74 -11
  138. package/test/test_net_fetch.ts +73 -10
  139. package/test/test_net_websocket.js +1 -1
  140. package/test/test_net_websocket.ts +1 -1
  141. package/test/test_printer.js +137 -0
  142. package/test/test_printer.ts +148 -0
  143. package/test/test_proc.js +141 -0
  144. package/test/test_proc.ts +163 -0
  145. package/test/test_react_complex.js +1401 -1069
  146. package/test/test_react_counter.js +1391 -1059
  147. package/test/test_react_flex.js +1411 -1072
  148. package/test/test_react_hidden.js +1394 -1062
  149. package/test/test_react_listview_link.js +1391 -1059
  150. package/test/test_react_notify.js +18638 -0
  151. package/test/test_react_render.js +1391 -1059
  152. package/test/test_registry.js +74 -0
  153. package/test/test_registry.ts +95 -0
  154. package/test/test_sysinfo.js +122 -0
  155. package/test/test_sysinfo.ts +141 -0
  156. package/test/test_wolfssl_read.js +45 -43
  157. package/test/test_wolfssl_read.ts +42 -40
  158. package/test/test_worker_net.js +35 -17
  159. package/test/test_worker_net.ts +27 -15
  160. package/tsconfig.json +1 -1
  161. package/examples/exec_server.ts +0 -80
  162. package/lib/ffi-bind.js +0 -85
  163. package/lib/ffi-bind.ts +0 -170
  164. package/lib/ffi-struct.js +0 -224
  165. package/lib/ffi-struct.ts +0 -239
  166. package/lib/win-common-structs.js +0 -39
  167. package/lib/win-common-structs.ts +0 -41
@@ -0,0 +1,35 @@
1
+ // version.dll 绑定(文件版本资源——exe/dll「属性 → 详细信息」的数据;品牌约定见
2
+ // lib/windows/user32.ts 头注释):
3
+ // - 读取三段式:Size 拿缓冲大小与句柄 → Info 读进缓冲 → VerQueryValue 在缓冲内
4
+ // 查询子块(lplpBuffer 回写的指针指向缓冲内部,跟进读用 ffi.readByte 拼值)
5
+ // - 位宽无关:句柄/指针出参槽一律 <BYTE>ptr 收 PAB(4/8) + DataView / os.arch 分支读回
6
+ import { bind, type CodecMap } from '../ffi/bind.js'
7
+
8
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
9
+ const b = <const S extends string, const LE extends CodecMap = {}>(name: string, sig: S, encoders?: LE) =>
10
+ bind('version.dll', name, sig, encoders)
11
+
12
+ /** 取文件版本资源大小
13
+ * @returns 字节数(0 = 文件无版本资源)
14
+ * @param args_0 lptstrFilename 文件路径(禁空)
15
+ * @param args_1 lpdwHandle 出参槽(Info 步的入参句柄,MSDN 恒 0 但仍须传),
16
+ * PtrArrayBuffer(4) + Uint32Array 读回 */
17
+ export const GetFileVersionInfoSize = /*@__PURE__*/ b('GetFileVersionInfoSizeW',
18
+ '<WCHAR>ptr! <BYTE>ptr -> u32')
19
+ /** 读版本资源进缓冲
20
+ * @returns 成功 → 非 0
21
+ * @param args_0 lptstrFilename 文件路径(禁空)
22
+ * @param args_1 dwHandle Size 步读回的句柄(恒 0)
23
+ * @param args_2 dwLen 缓冲字节数(= Size 返回值)
24
+ * @param args_3 lpData 接收缓冲(PtrArrayBuffer(dwLen)) */
25
+ export const GetFileVersionInfo = /*@__PURE__*/ b('GetFileVersionInfoW',
26
+ '<WCHAR>ptr! u32 u32 <BYTE>ptr -> i32')
27
+ /** 在版本资源缓冲内查询子块
28
+ * @returns 成功 → 非 0
29
+ * @param args_0 pBlock Info 步的资源缓冲(PtrArrayBuffer 直传)
30
+ * @param args_1 lpszSubBlock 子块路径(禁空):'\\' = 根块 VS_FIXEDFILEINFO、
31
+ * '\\StringFileInfo\\040904B0\\FileVersion' 等字符串表项
32
+ * @param args_2 lplpBuffer 出参槽(块内偏移指针写回),PtrArrayBuffer(8)
33
+ * @param args_3 puLen 出参槽(块字节数,VS_FIXEDFILEINFO = 52),PtrArrayBuffer(4) */
34
+ export const VerQueryValue = /*@__PURE__*/ b('VerQueryValueW',
35
+ '<BYTE>ptr <WCHAR>ptr! <BYTE>ptr <BYTE>ptr -> i32')
@@ -0,0 +1,71 @@
1
+ // winspool.drv 绑定(打印后台处理:枚举 / 能力查询 / 原始作业链;品牌约定见
2
+ // lib/windows/user32.ts 头注释):
3
+ // - 打印机句柄(OpenPrinter 的 HPRINTER* 出参槽写回)位宽无关:出参槽 = <BYTE>ptr
4
+ // 收 PtrArrayBuffer(8) + readPtr 读回 number,作业链句柄位 <>ptr 收宽(批 5 HKey 同型)
5
+ // - 结构位按方向分流(结构定义见 ./structs.ts):DOC_INFO_1W 纯入参位注册 encoder →
6
+ // 对象直传;PRINTER_INFO_2W 出参数组不注册 → structArray(PRINTER_INFO_2W).decode
7
+ // (buf, count) 读回(缓冲尾部含字符串,须显式 count),指针字段跟进读字符串
8
+ // - 枚举标注:DeviceCap 是单选查询位标枚举;PrinterEnum 是 LOCAL|CONNECTIONS 可组合
9
+ // flags → 裸 u32 + JSDoc(组合 OR 结果不是枚举成员,位标枚举反而传不进)
10
+ import { bind } from '../ffi/bind.js';
11
+ import { DOC_INFO_1W } from './structs.js';
12
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
13
+ const b = (name, sig, encoders) => bind('winspool.drv', name, sig, encoders);
14
+ /** 枚举打印队列(Level=2 → PRINTER_INFO_2W 数组);两段式:先
15
+ * NULL+cbBuf 0 拿 pcbNeeded,再按需分配缓冲重调
16
+ * @returns 成功 → 非 0
17
+ * @param args_0 dwFlags 枚举范围:gui.PrinterEnum.LOCAL(0x2) 本地 | CONNECTIONS(0x4)
18
+ * 已连接,组合 OR 传裸数(可组合 flags 不标枚举)
19
+ * @param args_1 pName 服务器名(仅 Level=4/5/6 用),本地枚举传 NULL
20
+ * @param args_2 dwLevel 信息级别,取 2(PRINTER_INFO_2W)
21
+ * @param args_3 pPrinterInfo 出参缓冲(PtrArrayBuffer(pcbNeeded))
22
+ * @param args_4 cbBuf 缓冲字节数
23
+ * @param args_5 pcbNeeded 出参槽(需求字节数)PtrArrayBuffer(4)
24
+ * @param args_6 pcReturned 出参槽(返回条数)PtrArrayBuffer(4) */
25
+ export const EnumPrinters = /*@__PURE__*/ b('EnumPrintersW', 'u32 <WCHAR>ptr u32 <BYTE>ptr u32 <BYTE>ptr <BYTE>ptr -> i32');
26
+ /** 取默认打印机名
27
+ * @returns 成功 → 非 0,0 = 失败(缓冲不足时 pcchBuffer 带回所需长度)
28
+ * @param args_0 pszBuffer 出参缓冲,WCHAR.alloc(n)、WCHAR.decode 读回
29
+ * @param args_1 pcchBuffer 出入长度槽(入 = 缓冲 WCHAR 容量,出 = 实际长度),PtrArrayBuffer(4) */
30
+ export const GetDefaultPrinter = /*@__PURE__*/ b('GetDefaultPrinterW', '<BYTE>ptr <BYTE>ptr -> i32');
31
+ /** 查设备能力;nCapability 单选 gui.DeviceCap.*
32
+ * @returns 返回值随能力(数值能力 = 数值,
33
+ * -1 = 失败)
34
+ * @param args_0 pDevice 打印机名(禁空)
35
+ * @param args_1 pPort 端口名,传 NULL 用打印机配置端口
36
+ * @param args_2 nCapability 能力码(gui.DeviceCap.HORZRES 等单选)
37
+ * @param args_3 pOutput 字符串列表型能力的缓冲;数值型查询传 NULL
38
+ * @param args_4 pDevmode DEVMODE,传 NULL */
39
+ export const DeviceCapabilities = /*@__PURE__*/ b('DeviceCapabilitiesW', '<WCHAR>ptr! <WCHAR>ptr u32@DeviceCap <BYTE>ptr <>ptr -> i32');
40
+ /** 打开打印机对象(不产生打印作业)
41
+ * @returns 成功 → 非 0,hPrinter 写回
42
+ * @param args_0 pPrinterName 打印机名(禁空)
43
+ * @param args_1 phPrinter 出参槽(句柄写回),PtrArrayBuffer(8) + readPtr 读回
44
+ * @param args_2 pDefault 默认值(Datatype/DevMode/DesiredAccess),传 NULL 全默认 */
45
+ export const OpenPrinter = /*@__PURE__*/ b('OpenPrinterW', '<WCHAR>ptr! <BYTE>ptr <>ptr -> i32');
46
+ /** 关闭打印机句柄
47
+ * @returns 成功 → 非 0 */
48
+ export const ClosePrinter = /*@__PURE__*/ b('ClosePrinter', '<>ptr -> i32');
49
+ /** 起打印作业
50
+ * @returns 作业 id(0 = 失败)
51
+ * @param args_0 hPrinter 打印机句柄
52
+ * @param args_1 dwLevel 固定 1(DOC_INFO_1W)
53
+ * @param args_2 pDocInfo DOC_INFO_1W 对象(指针字段收裸地址 number:WCHAR.encode(s).ptr,
54
+ * PAB 须在调用返回前保持引用) */
55
+ export const StartDocPrinter = /*@__PURE__*/ b('StartDocPrinterW', '<>ptr u32 <DOC_INFO_1W>ptr -> u32', { DOC_INFO_1W });
56
+ /** 结束打印作业(提交)
57
+ * @returns 成功 → 非 0 */
58
+ export const EndDocPrinter = /*@__PURE__*/ b('EndDocPrinter', '<>ptr -> i32');
59
+ /** 起页
60
+ * @returns 成功 → 非 0 */
61
+ export const StartPagePrinter = /*@__PURE__*/ b('StartPagePrinter', '<>ptr -> i32');
62
+ /** 结束页
63
+ * @returns 成功 → 非 0 */
64
+ export const EndPagePrinter = /*@__PURE__*/ b('EndPagePrinter', '<>ptr -> i32');
65
+ /** 写作业数据(RAW 直写 spooler)
66
+ * @returns 成功 → 非 0
67
+ * @param args_0 hPrinter 打印机句柄
68
+ * @param args_1 lpBuffer 数据缓冲(<BYTE>ptr,PtrArrayBuffer)
69
+ * @param args_2 nNumberOfBytesToWrite 写入字节数
70
+ * @param args_3 lpNumberOfBytesWritten 出参槽,PtrArrayBuffer(4) 读实际写入字节数 */
71
+ export const WritePrinter = /*@__PURE__*/ b('WritePrinter', '<>ptr <BYTE>ptr u32 <BYTE>ptr -> i32');
@@ -0,0 +1,80 @@
1
+ // winspool.drv 绑定(打印后台处理:枚举 / 能力查询 / 原始作业链;品牌约定见
2
+ // lib/windows/user32.ts 头注释):
3
+ // - 打印机句柄(OpenPrinter 的 HPRINTER* 出参槽写回)位宽无关:出参槽 = <BYTE>ptr
4
+ // 收 PtrArrayBuffer(8) + readPtr 读回 number,作业链句柄位 <>ptr 收宽(批 5 HKey 同型)
5
+ // - 结构位按方向分流(结构定义见 ./structs.ts):DOC_INFO_1W 纯入参位注册 encoder →
6
+ // 对象直传;PRINTER_INFO_2W 出参数组不注册 → structArray(PRINTER_INFO_2W).decode
7
+ // (buf, count) 读回(缓冲尾部含字符串,须显式 count),指针字段跟进读字符串
8
+ // - 枚举标注:DeviceCap 是单选查询位标枚举;PrinterEnum 是 LOCAL|CONNECTIONS 可组合
9
+ // flags → 裸 u32 + JSDoc(组合 OR 结果不是枚举成员,位标枚举反而传不进)
10
+ import { bind, type CodecMap } from '../ffi/bind.js'
11
+ import { DOC_INFO_1W } from './structs.js'
12
+
13
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
14
+ const b = <const S extends string, const LE extends CodecMap = {}>(name: string, sig: S, encoders?: LE) =>
15
+ bind('winspool.drv', name, sig, encoders)
16
+
17
+ /** 枚举打印队列(Level=2 → PRINTER_INFO_2W 数组);两段式:先
18
+ * NULL+cbBuf 0 拿 pcbNeeded,再按需分配缓冲重调
19
+ * @returns 成功 → 非 0
20
+ * @param args_0 dwFlags 枚举范围:gui.PrinterEnum.LOCAL(0x2) 本地 | CONNECTIONS(0x4)
21
+ * 已连接,组合 OR 传裸数(可组合 flags 不标枚举)
22
+ * @param args_1 pName 服务器名(仅 Level=4/5/6 用),本地枚举传 NULL
23
+ * @param args_2 dwLevel 信息级别,取 2(PRINTER_INFO_2W)
24
+ * @param args_3 pPrinterInfo 出参缓冲(PtrArrayBuffer(pcbNeeded))
25
+ * @param args_4 cbBuf 缓冲字节数
26
+ * @param args_5 pcbNeeded 出参槽(需求字节数)PtrArrayBuffer(4)
27
+ * @param args_6 pcReturned 出参槽(返回条数)PtrArrayBuffer(4) */
28
+ export const EnumPrinters = /*@__PURE__*/ b('EnumPrintersW',
29
+ 'u32 <WCHAR>ptr u32 <BYTE>ptr u32 <BYTE>ptr <BYTE>ptr -> i32')
30
+
31
+ /** 取默认打印机名
32
+ * @returns 成功 → 非 0,0 = 失败(缓冲不足时 pcchBuffer 带回所需长度)
33
+ * @param args_0 pszBuffer 出参缓冲,WCHAR.alloc(n)、WCHAR.decode 读回
34
+ * @param args_1 pcchBuffer 出入长度槽(入 = 缓冲 WCHAR 容量,出 = 实际长度),PtrArrayBuffer(4) */
35
+ export const GetDefaultPrinter = /*@__PURE__*/ b('GetDefaultPrinterW', '<BYTE>ptr <BYTE>ptr -> i32')
36
+
37
+ /** 查设备能力;nCapability 单选 gui.DeviceCap.*
38
+ * @returns 返回值随能力(数值能力 = 数值,
39
+ * -1 = 失败)
40
+ * @param args_0 pDevice 打印机名(禁空)
41
+ * @param args_1 pPort 端口名,传 NULL 用打印机配置端口
42
+ * @param args_2 nCapability 能力码(gui.DeviceCap.HORZRES 等单选)
43
+ * @param args_3 pOutput 字符串列表型能力的缓冲;数值型查询传 NULL
44
+ * @param args_4 pDevmode DEVMODE,传 NULL */
45
+ export const DeviceCapabilities = /*@__PURE__*/ b('DeviceCapabilitiesW',
46
+ '<WCHAR>ptr! <WCHAR>ptr u32@DeviceCap <BYTE>ptr <>ptr -> i32')
47
+
48
+ /** 打开打印机对象(不产生打印作业)
49
+ * @returns 成功 → 非 0,hPrinter 写回
50
+ * @param args_0 pPrinterName 打印机名(禁空)
51
+ * @param args_1 phPrinter 出参槽(句柄写回),PtrArrayBuffer(8) + readPtr 读回
52
+ * @param args_2 pDefault 默认值(Datatype/DevMode/DesiredAccess),传 NULL 全默认 */
53
+ export const OpenPrinter = /*@__PURE__*/ b('OpenPrinterW', '<WCHAR>ptr! <BYTE>ptr <>ptr -> i32')
54
+ /** 关闭打印机句柄
55
+ * @returns 成功 → 非 0 */
56
+ export const ClosePrinter = /*@__PURE__*/ b('ClosePrinter', '<>ptr -> i32')
57
+ /** 起打印作业
58
+ * @returns 作业 id(0 = 失败)
59
+ * @param args_0 hPrinter 打印机句柄
60
+ * @param args_1 dwLevel 固定 1(DOC_INFO_1W)
61
+ * @param args_2 pDocInfo DOC_INFO_1W 对象(指针字段收裸地址 number:WCHAR.encode(s).ptr,
62
+ * PAB 须在调用返回前保持引用) */
63
+ export const StartDocPrinter = /*@__PURE__*/ b('StartDocPrinterW', '<>ptr u32 <DOC_INFO_1W>ptr -> u32',
64
+ { DOC_INFO_1W })
65
+ /** 结束打印作业(提交)
66
+ * @returns 成功 → 非 0 */
67
+ export const EndDocPrinter = /*@__PURE__*/ b('EndDocPrinter', '<>ptr -> i32')
68
+ /** 起页
69
+ * @returns 成功 → 非 0 */
70
+ export const StartPagePrinter = /*@__PURE__*/ b('StartPagePrinter', '<>ptr -> i32')
71
+ /** 结束页
72
+ * @returns 成功 → 非 0 */
73
+ export const EndPagePrinter = /*@__PURE__*/ b('EndPagePrinter', '<>ptr -> i32')
74
+ /** 写作业数据(RAW 直写 spooler)
75
+ * @returns 成功 → 非 0
76
+ * @param args_0 hPrinter 打印机句柄
77
+ * @param args_1 lpBuffer 数据缓冲(<BYTE>ptr,PtrArrayBuffer)
78
+ * @param args_2 nNumberOfBytesToWrite 写入字节数
79
+ * @param args_3 lpNumberOfBytesWritten 出参槽,PtrArrayBuffer(4) 读实际写入字节数 */
80
+ export const WritePrinter = /*@__PURE__*/ b('WritePrinter', '<>ptr <BYTE>ptr u32 <BYTE>ptr -> i32')
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "quickwin",
4
- "version": "1.3.0",
4
+ "version": "2.1.0",
5
5
  "description": "QuickJS Win32 runtime — GUI, networking, WASM, FFI, and more",
6
6
  "bin": {
7
7
  "quickwin": "qwin.exe",
package/quickwin.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  /// <reference path="quickwin_const.d.ts" />
2
+ /// <reference path="quickwin_enum_map.d.ts" />
2
3
  interface ImportMeta {
3
4
  url: string
4
5
  }
@@ -358,6 +359,7 @@ declare module "sock" {
358
359
  function accept(sock: SockHandle): { handle: SockHandle; addr: string; port: number } | null;
359
360
  /** getsockname(sock) — 返回本地绑定地址 { addr, port }(port=0 自动分配后可用它查询实际端口) */
360
361
  function getsockname(sock: SockHandle): { addr: string; port: number } | null;
362
+ /** send(sock, buf, flags?) — 返回实际送出字节数;非阻塞缓冲满返回 0(入队等 FD_WRITE 重发);真错误返回 -1 */
361
363
  function send(sock: SockHandle, buf: ArrayBuffer, flags?: number): number;
362
364
  function recv(sock: SockHandle, size?: number, flags?: number): ArrayBuffer | null;
363
365
  function closesocket(sock: SockHandle): void;
@@ -377,6 +379,16 @@ declare module "wolfssl" {
377
379
  function wolfSSL_CTX_new(method: WOLFSSL_METHOD): WOLFSSL_CTX | null;
378
380
  function wolfSSL_CTX_free(ctx: WOLFSSL_CTX): void;
379
381
  function wolfSSL_CTX_set_verify(ctx: WOLFSSL_CTX, mode: VerifyMode): number;
382
+ function wolfSSL_CTX_load_verify_locations(ctx: WOLFSSL_CTX, file: string, path?: string): number;
383
+ function wolfSSL_check_domain_name(ssl: WOLFSSL, name: string): number;
384
+ /** Add a PEM to the process-wide trusted CA store (fixed capacity).
385
+ * Returns the new entry count (1..8), or -1 on empty PEM / full store;
386
+ * the caller decides whether -1 is fatal. Entries are applied by
387
+ * loadTrustedCerts() at handshake setup time, not retroactively. */
388
+ function addTrustedCA(pem: string): number;
389
+ /** Load the OS CA store plus every entry of the trusted CA store into ctx.
390
+ * Returns how many store entries were loaded. */
391
+ function loadTrustedCerts(ctx: WOLFSSL_CTX): number;
380
392
  function wolfSSL_CTX_use_certificate_file(ctx: WOLFSSL_CTX, file: string, format?: FileType): number;
381
393
  function wolfSSL_CTX_use_PrivateKey_file(ctx: WOLFSSL_CTX, file: string, format?: FileType): number;
382
394
 
@@ -386,19 +398,23 @@ declare module "wolfssl" {
386
398
  function wolfSSL_connect(ssl: WOLFSSL): number;
387
399
  function wolfSSL_shutdown(ssl: WOLFSSL): number;
388
400
  function wolfSSL_write(ssl: WOLFSSL, buf: ArrayBuffer): number;
389
- /** 成功返回 ArrayBuffer;EOF/暂无数据/错误返回 null(区分用 wolfSSL_get_error:6=ZERO_RETURN 关闭,2=WANT_READ) */
390
- function wolfSSL_read(ssl: WOLFSSL, sz: number): ArrayBuffer | null;
401
+ /** 读入 buf(大小取 buf.byteLength),返回 wolfSSL 原始返回值:
402
+ * >0=字节数(数据在 buf[0..ret)),0=对端正常关闭,<0=错误;
403
+ * 语义用 wolfSSL_get_error(ssl, ret) 区分(2=WANT_READ 暂无数据,6=ZERO_RETURN 关闭) */
404
+ function wolfSSL_read(ssl: WOLFSSL, buf: ArrayBuffer): number;
391
405
  function wolfSSL_get_error(ssl: WOLFSSL, ret: number): number;
392
406
  function wolfSSL_UseSNI(ssl: WOLFSSL, type: SniType, name: string, len?: number): number;
393
407
 
394
408
  function wolfSSLv23_client_method(): WOLFSSL_METHOD;
395
409
  function wolfTLSv1_2_client_method(): WOLFSSL_METHOD;
396
- function wolfTLSv1_3_client_method(): WOLFSSL_METHOD;
410
+ /** 此 wolfSSL 构建禁用 TLSv1.3:返回 0(无 method 指针),调用方自行判定 */
411
+ function wolfTLSv1_3_client_method(): WOLFSSL_METHOD | 0;
397
412
 
398
413
  }
399
414
 
400
415
  declare module "win" {
401
- type HMODULE = number & { readonly __label: unique symbol };
416
+ /** 与 ffi 的 Ptr<"HMODULE"> 同型(ptrBrand string 键)——FFI 侧 <HMODULE>ptr 位(HINSTANCE 语义)直收 */
417
+ type HMODULE = number & { readonly ptrBrand: "HMODULE" };
402
418
 
403
419
  function LoadLibrary(libName: string): HMODULE | null;
404
420
  function GetProcAddress(hModule: HMODULE, procName: string): number | null;
@@ -410,11 +426,13 @@ declare module "win" {
410
426
  }
411
427
 
412
428
  declare module "gui" {
413
- type HWND = number & { readonly __label: unique symbol };
414
- type HMENU = number & { readonly __label: unique symbol };
415
- type HFONT = number & { readonly __label: unique symbol };
416
- type HICON = number & { readonly __label: unique symbol };
417
- type WNDPROC = number & { readonly __label: unique symbol };
429
+ /** 与 ffi 的 Ptr<"N"> 结构同型(ptrBrand string 键,见 lib/ffi/ctype.ts)——各句柄可在
430
+ * gui 模块与 FFI 绑定两体系间互认直传(原 unique symbol 键只有 HWND 打通) */
431
+ type HWND = number & { readonly ptrBrand: "HWND" };
432
+ type HMENU = number & { readonly ptrBrand: "HMENU" };
433
+ type HFONT = number & { readonly ptrBrand: "HFONT" };
434
+ type HICON = number & { readonly ptrBrand: "HICON" };
435
+ type WNDPROC = number & { readonly ptrBrand: "WNDPROC" };
418
436
 
419
437
  function RegisterClass(className: string, wndProc?: (hwnd: HWND, msg: number, wParam: number, lParam: number) => number): number;
420
438
  function CreateWindow(className: string, title: string, style: number, x: number, y: number, width: number, height: number, parent: HWND | null, menu: HMENU | null): HWND | null;
@@ -545,40 +563,13 @@ declare module "gui" {
545
563
  }
546
564
 
547
565
  declare module "ffi" {
548
- type TYPE_OF_FFI_TYPE_VOID = number & { readonly __label: unique symbol }
549
- type TYPE_OF_FFI_TYPE_UINT8 = number & { readonly __label: unique symbol }
550
- type TYPE_OF_FFI_TYPE_SINT8 = number & { readonly __label: unique symbol }
551
- type TYPE_OF_FFI_TYPE_UINT16 = number & { readonly __label: unique symbol }
552
- type TYPE_OF_FFI_TYPE_SINT16 = number & { readonly __label: unique symbol }
553
- type TYPE_OF_FFI_TYPE_UINT32 = number & { readonly __label: unique symbol }
554
- type TYPE_OF_FFI_TYPE_SINT32 = number & { readonly __label: unique symbol }
555
- type TYPE_OF_FFI_TYPE_UINT64 = number & { readonly __label: unique symbol }
556
- type TYPE_OF_FFI_TYPE_SINT64 = number & { readonly __label: unique symbol }
557
- type TYPE_OF_FFI_TYPE_FLOAT = number & { readonly __label: unique symbol }
558
- type TYPE_OF_FFI_TYPE_DOUBLE = number & { readonly __label: unique symbol }
559
- type TYPE_OF_FFI_TYPE_POINTER = number & { readonly __label: unique symbol }
560
-
561
- const FFI_TYPE_VOID: TYPE_OF_FFI_TYPE_VOID;
562
- const FFI_TYPE_UINT8: TYPE_OF_FFI_TYPE_UINT8;
563
- const FFI_TYPE_SINT8: TYPE_OF_FFI_TYPE_SINT8;
564
- const FFI_TYPE_UINT16: TYPE_OF_FFI_TYPE_UINT16;
565
- const FFI_TYPE_SINT16: TYPE_OF_FFI_TYPE_SINT16;
566
- const FFI_TYPE_UINT32: TYPE_OF_FFI_TYPE_UINT32;
567
- const FFI_TYPE_SINT32: TYPE_OF_FFI_TYPE_SINT32;
568
- const FFI_TYPE_UINT64: TYPE_OF_FFI_TYPE_UINT64;
569
- const FFI_TYPE_SINT64: TYPE_OF_FFI_TYPE_SINT64;
570
- const FFI_TYPE_FLOAT: TYPE_OF_FFI_TYPE_FLOAT;
571
- const FFI_TYPE_DOUBLE: TYPE_OF_FFI_TYPE_DOUBLE;
572
- const FFI_TYPE_POINTER: TYPE_OF_FFI_TYPE_POINTER;
573
-
574
- type FfiType = TYPE_OF_FFI_TYPE_VOID | TYPE_OF_FFI_TYPE_UINT8 | TYPE_OF_FFI_TYPE_SINT8 | TYPE_OF_FFI_TYPE_UINT16 | TYPE_OF_FFI_TYPE_SINT16 | TYPE_OF_FFI_TYPE_UINT32 | TYPE_OF_FFI_TYPE_SINT32 | TYPE_OF_FFI_TYPE_UINT64 | TYPE_OF_FFI_TYPE_SINT64 | TYPE_OF_FFI_TYPE_FLOAT | TYPE_OF_FFI_TYPE_DOUBLE | TYPE_OF_FFI_TYPE_POINTER;
575
- type TypeArg<T extends FfiType> = T extends Exclude<FfiType, TYPE_OF_FFI_TYPE_VOID | TYPE_OF_FFI_TYPE_POINTER> ? number : T extends TYPE_OF_FFI_TYPE_POINTER ? (ArrayBuffer | number | null) : never;
576
- type TypeArgs<T extends FfiType[], Args extends(number | null | ArrayBuffer)[] = []> = T extends [infer T1 extends FfiType, ...infer RES extends FfiType[]] ? TypeArgs<RES, [...Args, TypeArg<T1>]> : Args;
577
-
578
- function ffiCall<const T extends Exclude<FfiType, TYPE_OF_FFI_TYPE_VOID>[], const R extends FfiType>(func: number, argTypes: T, args: TypeArgs<T>, retType: R): R extends TYPE_OF_FFI_TYPE_VOID ? undefined : R extends TYPE_OF_FFI_TYPE_POINTER ? number | null : TypeArg<R>;
566
+ function ffiCall(func: number, argFrame: ArrayBuffer, retBuf: ArrayBuffer, retIsFp: 0 | 1): void;
579
567
  function bufferPtr(buf: ArrayBuffer): number;
580
568
  function readByte(ptr: number): number;
569
+ function readBytes(ptr: number, len: number): ArrayBuffer;
581
570
  function writeByte(ptr: number, value: number): void;
571
+ function closureNew(argBytes: number, retKind: number, wrapper: (frame: ArrayBuffer, retBuf: ArrayBuffer) => void): number;
572
+ function closureFree(ptr: number): void;
582
573
  }
583
574
 
584
575
 
@@ -676,6 +676,125 @@ declare module "gui" {
676
676
  SRCCOPY = 13369376, // 0xCC0020
677
677
  WHITENESS = 16711778, // 0xFF0062
678
678
  BLACKNESS = 66, // 0x42
679
+ NOTSRCCOPY = 3342344, // 0x330008
680
+ NOTSRCERASE = 1114278, // 0x1100A6
681
+ SRCERASE = 4457256, // 0x440328
682
+ SRCAND = 8913094, // 0x8800C6
683
+ SRCINVERT = 6684742, // 0x660046
684
+ SRCPAINT = 15597702, // 0xEE0086
685
+ MERGECOPY = 12583114, // 0xC000CA
686
+ MERGEPAINT = 12255782, // 0xBB0226
687
+ PATCOPY = 15728673, // 0xF00021
688
+ PATINVERT = 5898313, // 0x5A0049
689
+ PATPAINT = 16452105, // 0xFB0A09
690
+ DSTINVERT = 5570569, // 0x550009
691
+ NOP = 255, // 0xFF
692
+ }
693
+
694
+ // GDI pen styles (CreatePen iStyle)
695
+ export const enum PenStyle {
696
+ SOLID = 0, // 0x0
697
+ DASH = 1, // 0x1
698
+ DOT = 2, // 0x2
699
+ DASHDOT = 3, // 0x3
700
+ DASHDOTDOT = 4, // 0x4
701
+ NULL = 5, // 0x5
702
+ INSIDEFRAME = 6, // 0x6
703
+ }
704
+
705
+ // SetBkMode: text/bkgrnd fill mode
706
+ export const enum BackgroundMode {
707
+ OPAQUE = 2, // 0x2
708
+ TRANSPARENT = 1, // 0x1
709
+ }
710
+
711
+ // GetStockObject: shared system objects (HBRUSH/HPEN/HFONT/HPAL) — never delete
712
+ export const enum StockObject {
713
+ WHITE_BRUSH = 0, // 0x0
714
+ LTGRAY_BRUSH = 1, // 0x1
715
+ GRAY_BRUSH = 2, // 0x2
716
+ DKGRAY_BRUSH = 3, // 0x3
717
+ BLACK_BRUSH = 4, // 0x4
718
+ NULL_BRUSH = 5, // 0x5
719
+ WHITE_PEN = 6, // 0x6
720
+ BLACK_PEN = 7, // 0x7
721
+ NULL_PEN = 8, // 0x8
722
+ OEM_FIXED_FONT = 10, // 0xA
723
+ ANSI_FIXED_FONT = 11, // 0xB
724
+ ANSI_VAR_FONT = 12, // 0xC
725
+ SYSTEM_FONT = 13, // 0xD
726
+ DEVICE_DEFAULT_FONT = 14, // 0xE
727
+ DEFAULT_PALETTE = 15, // 0xF
728
+ SYSTEM_FIXED_FONT = 16, // 0x10
729
+ DEFAULT_GUI_FONT = 17, // 0x11
730
+ }
731
+
732
+ // CreateHatchBrush: hatch pattern styles
733
+ export const enum HatchStyle {
734
+ HORIZONTAL = 0, // 0x0
735
+ VERTICAL = 1, // 0x1
736
+ FDIAGONAL = 2, // 0x2
737
+ BDIAGONAL = 3, // 0x3
738
+ CROSS = 4, // 0x4
739
+ DIAGCROSS = 5, // 0x5
740
+ }
741
+
742
+ // SetPolyFillMode: polygon fill rule (nonzero winding vs even-odd)
743
+ export const enum PolyFillMode {
744
+ ALTERNATE = 1, // 0x1
745
+ WINDING = 2, // 0x2
746
+ }
747
+
748
+ // SetROP2: binary raster mode (foreground pen vs dest mix)
749
+ export const enum RasterMode {
750
+ R2_BLACK = 1, // 0x1
751
+ R2_NOTMERGEPEN = 2, // 0x2
752
+ R2_MASKNOTPEN = 3, // 0x3
753
+ R2_NOTCOPYPEN = 4, // 0x4
754
+ R2_MASKPENNOT = 5, // 0x5
755
+ R2_NOT = 6, // 0x6
756
+ R2_XORPEN = 7, // 0x7
757
+ R2_MASKPEN = 9, // 0x9
758
+ R2_NOTXORPEN = 10, // 0xA
759
+ R2_MERGENOTPEN = 12, // 0xC
760
+ R2_NOP = 11, // 0xB
761
+ R2_MERGEPENNOT = 14, // 0xE
762
+ R2_COPYPEN = 13, // 0xD
763
+ R2_MERGEPEN = 15, // 0xF
764
+ R2_WHITE = 16, // 0x10
765
+ }
766
+
767
+ // SetTextAlign: text alignment flags (combinable, pass as u32)
768
+ export const enum TextAlign {
769
+ TA_LEFT = 0, // 0x0
770
+ TA_CENTER = 6, // 0x6
771
+ TA_RIGHT = 2, // 0x2
772
+ TA_TOP = 0, // 0x0
773
+ TA_BOTTOM = 8, // 0x8
774
+ TA_BASELINE = 24, // 0x18
775
+ TA_NOUPDATECP = 0, // 0x0
776
+ TA_UPDATECP = 1, // 0x1
777
+ }
778
+
779
+ // ExtTextOut: ETO_* options (combinable, pass as u32)
780
+ export const enum TextOutOptions {
781
+ ETO_CLIPPED = 4, // 0x4
782
+ ETO_OPAQUE = 2, // 0x2
783
+ ETO_GLYPH_INDEX = 16, // 0x10
784
+ }
785
+
786
+ // SetArcDirection: arc/chord/pie sweep direction (default counterclockwise)
787
+ export const enum ArcDirection {
788
+ COUNTERCLOCKWISE = 1, // 0x1
789
+ CLOCKWISE = 2, // 0x2
790
+ }
791
+
792
+ // SetStretchBltMode: color filtering when StretchBlt scales a bitmap
793
+ export const enum StretchBltMode {
794
+ ANDSCANS = 1, // 0x1
795
+ ORSCANS = 2, // 0x2
796
+ DELETESCANS = 3, // 0x3
797
+ HALFTONE = 4, // 0x4
679
798
  }
680
799
 
681
800
  export const enum OpenFileNameFlag {
@@ -698,12 +817,28 @@ declare module "gui" {
698
817
  export const enum RegAccess {
699
818
  SET_VALUE = 2, // 0x2
700
819
  READ = 131097, // 0x20019
820
+ ALL_ACCESS = 983103, // 0xF003F
701
821
  }
702
822
 
703
823
  export const enum RegType {
704
824
  SZ = 1, // 0x1
705
825
  }
706
826
 
827
+ // File
828
+ export const enum FileCreation {
829
+ CREATE_NEW = 1, // 0x1
830
+ CREATE_ALWAYS = 2, // 0x2
831
+ OPEN_EXISTING = 3, // 0x3
832
+ OPEN_ALWAYS = 4, // 0x4
833
+ TRUNCATE_EXISTING = 5, // 0x5
834
+ }
835
+
836
+ export const enum FileSeekFrom {
837
+ BEGIN = 0, // 0x0
838
+ CURRENT = 1, // 0x1
839
+ END = 2, // 0x2
840
+ }
841
+
707
842
  // Printer
708
843
  export const enum PrinterEnum {
709
844
  LOCAL = 2, // 0x2
@@ -716,6 +851,7 @@ declare module "gui" {
716
851
  VERTRES = 10, // 0xA
717
852
  LOGPIXELSX = 88, // 0x58
718
853
  LOGPIXELSY = 90, // 0x5A
854
+ BITSPIXEL = 12, // 0xC
719
855
  }
720
856
 
721
857
  // Static controls
@@ -895,6 +1031,7 @@ declare module "wolfssl" {
895
1031
  export const enum ErrorCode {
896
1032
  WOLFSSL_ERROR_WANT_READ = 2, // 0x2
897
1033
  WOLFSSL_ERROR_WANT_WRITE = 3, // 0x3
1034
+ WOLFSSL_ERROR_ZERO_RETURN = 6, // 0x6
898
1035
  }
899
1036
 
900
1037
  }
Binary file
package/qwin-nowasm.exe CHANGED
Binary file
package/qwin-x86.exe CHANGED
Binary file
package/qwin.exe CHANGED
Binary file