字符串
JScript 和 VBScript 中的字符串属于 BSTR 类型。这些是 Unicode 字符串,即每个字符的代码占用 2 个字节。最后一个字符后跟一个终止符(两个零字节),第一个字符前面是一个 4 字节数字,其中包含以字节为单位的字符串长度(不包括字符串末尾的零字节)。一个脚本字符串变量持有一个指向这样一个字符串的指针,它是字符串的第一个字符的地址(即包含字符串长度的字节仍然是"幕后"的)。字符串可以通过三种方式传递给函数:
- 输入字符串:w,s,z。以 s 或 z 形式传递的字符串会被复制并转换为相关编码。API 函数接收指向此类副本的指针。一旦函数返回,用于复制的内存就会被释放。在w的情况下,函数接收指向原始(Unicode)字符串的指针。
- 输出字符串:W,S,Z。对于这三种类型,您都传递了一个指向字符串原始位置的指针。S 和 Z 字符串之前已转换为相关编码,但不进行复制。当函数返回时,S 和 Z 字符串的内容被转换回 Unicode 编码,并测量它们的长度。W 仅测量字符串的长度。长度(以字节为单位)记录在字符串的前面。例如,在脚本中进一步连接此字符串和其他字符串时,需要最后一个操作来避免故障。由于输出字符串与所有输出参数一样,旨在由被调用函数写入,因此请确保其长度足够。
- 指针:p。这是最简单的方法。在这里,您传递一个指向原始字符串的指针,而不进行转换。函数返回后,不进行任何转换或长度校正。因此,如果函数向该字符串写入了一些内容,则该数据将保持不变。这可能看起来与 w 相同,但有区别。声明为 p 的参数不仅接受字符串变量,还接受数字变量。
返回字符串有两种方式:
- p 表示我们得到一个数值变量,其中包含一个指向 API 函数返回的字符串的指针。
- w、s 和 z 意味着我们得到一个字符串变量,其中包含一个指向 API 函数返回的字符串副本的指针。作为 s 和 z 返回的字符串将通过转换进行复制。原始字符串不会被释放,因为 DWX 不知道如何为字符串分配内存。如果您担心这样会引起内存泄漏,请使用 p 类型作为返回值,使用 StrGet 将字符串读取到变量中,然后按照函数文档推荐的方式释放原始字符串。
采用字符串参数的 API 函数通常存在两种变体,例如 MessageBoxA 和 MessageBoxW。在脚本中使用 Unicode 版本(名称末尾带有 "W" 的那些)似乎更合理,因为这样可以避免与 Unicode 之间的转换。
使用字符串作为内存缓冲区可能是一种可靠的技术,也可能不是,这取决于脚本引擎在内部如何处理字符串。因此,我建议使用 MemAlloc 而不是 Space。