输入参数和返回值的类型
m — 有符号 64 位整数 — INT64、LONGLONG、...
q — 无符号 64 位整数 — UINT64、ULONGLONG、...
l — 有符号 32 位整数 — LONG、INT、BOOL、...
u — 无符号32 位整数 — ULONG、UINT、DWORD、...
h — 句柄 — HANDLE、HWND、HMODULE、HINSTANCE、HICON、... — 32 位 (x86) 或 64 位 (x64) 整数。
p — 指针;对于数字,它与u (x86) 或q (x64) 相同,但也可用于传递对象 (IDispatch *) 或字符串。
n — 有符号 16 位整数 — SHORT
t — 无符号 16 位整数 — USHORT、WORD、WCHAR、OLECHAR、...
c — 有符号 8 位整数 — CHAR
b — 无符号 8 位整数 — UCHAR, BYTE, ...
f — 单精度浮点数(32 位) — FLOAT
d — 双精度浮点数(64 位) — DOUBLE
w — Unicode 字符串 — BSTR , LPWSTR, LPOLESTR, OLECHAR *, WCHAR *, ...
s — ANSI/Windows 字符串(默认代码页) — LPSTR, LPCSTR, CHAR *, ...
z — OEM/DOS 字符串(默认代码页) — LPSTR, LPCSTR, CHAR *, ...
v — 指向 VARIANT 结构的指针。
备注
- 在 这里 阅读更多关于字符串类型的信息。
- 除了句柄和指针之外,还有其他类型会随着进程的位数而改变其位数。例如:LRESULT、LPARAM、WPARAM、SIZE_T。它们也应该作为 h 或 p 类型传递和返回,这样无论脚本解释器的位数如何,您的代码都可以正常工作。
- 对应 m 和 q 的脚本类型是 VT_I8 和 VT_UI8,但 JScript 和 VBScript 不支持它们,这限制了您可以在脚本中使用 64 位整数执行的操作。只要函数返回的值允许这样做,DynamicWrapperX 就会将其转换为 VT_I4(32 位有符号整数)或 VT_R8(双精度浮点数)类型。由于 VT_R8 的尾数只有 53 位,所以它不能代表 64 位整数范围内的每一个数字。在这种情况下,返回 VT_I8 或 VT_UI8。您对这些类型所能做的就是将它们作为参数传递给其他方法,或者通过 WScript.Echo 或 MsgBox 显示它们的值,无法进行任何计算。
- 当一个大整数作为 VT_R8 返回,并且您想在消息框中查看它的值时,它可能无法正确显示,因为浮点数的字符串表示中小数点后的位数是有限的。因此,例如,如果号码是 9223372036854775808,则在消息框中您可能会看到 9,22337203685478E+18 而不是 9,223372036854775808E+18。但是,变量中的实际数值没有四舍五入,并且保持准确。
- 如果 64 位整数的值不适合任何可用的数字类型,您可以以字符串格式、十进制或十六进制(带有 0x 前缀)指定它。
DWX.Register("lib.dll", "func", "i=m") DWX.func("0xFFFFFFFFFFFFFFFF") DWX.func("-0x7FFFFFFFFFFFFFFF") DWX.func("18446744073709551615") DWX.func("-9223372036854775807")
输出参数
M — 指向指定数字的指针(它在内存中的地址) — LONGLONG *, PLONGLONG, ...
Q — 同上 — ULONGLONG *, PULONGLONG, ...
L — 同上 — LONG *, LPLONG, ...
H — 同上 — HANDLE *, PHANDLE, LPHANDLE, ...
U — 同上 — ULONG *, LPDWORD, ...
P — 同上
N — 同上 — SHORT *
T — 同上 — USHORT *, LPWORD, WCHAR *, OLECHAR *, ...
C — 同上 — CHAR *, ...
B — 同上 — UCHAR *, LPBYTE, ...
F — 同上 — FLOAT *, PFLOAT
D — 同上 — DOUBLE *, PDOUBLE
W— 输出 Unicode 字符串
S — 输出 ANSI 字符串
Z — 输出 OEM 字符串
备注
- 上面的输出类型可以在脚本语言中使用,通过引用将参数传递给方法,就像 VBScript 所做的那样。在这种情况下,DynamicWrapperX 可以获得指向参数值的指针,然后将其传递给已注册的函数,以便函数可以更改该地址处的值。如果参数是按值传递的,就像在 JScript 中一样,它们会被复制,因此无法找到并更改原始参数。在这种情况下,您可以通过 MemAlloc 在内存中分配一块缓冲区,将返回的指针提供给函数(作为 p 类型),并在调用函数后使用 NumGet 读取它放入缓冲区的数字。
- 一些脚本引擎还在将字符串传递给方法之前复制字符串,在这种情况下,对字符串使用输出类型也没有任何意义。解决方案与上述类似:将一块内存缓冲区作为类型 p 传递,然后通过 StrGet 读取它放入的字符串。