iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >VBS字符串如何在内部实现
  • 256
分享到

VBS字符串如何在内部实现

2023-06-08 10:06:08 256人浏览 薄情痞子
摘要

小编给大家分享一下VBS字符串如何在内部实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!VBS 是基于微软的 ActiveX/COM 技术实现的,而 COM 对

小编给大家分享一下VBS字符串如何在内部实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!



VBS 是基于微软的 ActiveX/COM 技术实现的,而 COM 对象为了做到支持任何语言,定义了一系列通用的数据类型,微软称之为自动化对象类型(Automation data types),其中之一就是 BSTR。VBS 在内部是以 BSTR 来表示字符串的,BSTR 在 WTypes.h 中定义:

复制代码 代码如下:


typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef OLECHAR *BSTR;

从定义可以看出,BSTR 是指向 wchar_t 类型(也就是 C 语言中的 Unicode)的指针,但是 BSTR 并不是普通的 wchar_t 指针。标准 BSTR 指向一个有长度前缀和 NUL 结束符的 wchar_t 数组。BSTR 的前4字节是一个表示字符串长度的前缀。BSTR 长度域的值是字符串的字节数,并且不包括 NUL 结束符。常用的 BSTR 处理函数请参考 MSDN 文档。

理论说的有点抽象,下面用代码来说明:

复制代码 代码如下:


str = "Hello" & Chr(0) & "world"


这是一句很简单的 VBS 代码,但是 VBScript 解释器在内部做了什么呢?其实就是初始化了一个 BSTR 变量(不考虑字符串连接过程):

复制代码 代码如下:



BSTR str = SysAllocStringLen(L"Hello\0world", 11);为了更清楚地了解 BSTR 的结构,我们换一种写法:


wchar_t arr[] = {22,0,'H','e','l','l','\0','w','o','r','l','d','\0'};
BSTR str = &arr[2];这个 BSTR 在内存中的结构为:

00000000 16 00 00 00 48 00 65 00 6C 00 6C 00 6F 00 00 00
00000010 77 00 6F 00 72 00 6C 00 64 00 00 00


橙色表示四个字节的长度前缀。红色高亮表示 BSTR 指针的当前指向,蓝色高亮表示字符串中的 Chr(0) 字符,绿色高亮表示 BSTR 的结束字符 NUL(该字符是 SysAllocStringLen 函数加上去的,因为是 Unicode,所以要占两个字节)。也就是说,如果不考虑前面四个字节,BSTR 就是 C 语言中的 null-terminated string。

再看一段 VBS 代码:

MsgBox Len(str)用 MsgBox 来显示刚才定义的字符串长度,VBScript 解释器内部又做了什么呢?是不是像 C 语言标准库函数 strlen 一样,遍历整个字符串,以 NUL 作为字符串结束的标识呢?

复制代码 代码如下:



size_t strlen (const char * str)
{
const char *eos = str;
while( *eos++ ) ;
return( (int)(eos - str - 1) );
}


答案显然是否定的,因为字符串中含有 Chr(0),如果像 strlen 这样实现,那么就会被 Chr(0) 截断,Len 函数应该返回5才对,然而实际上返回的是11这个正确的数字。

VBS 的 Len 函数内部应该是这么实现的:

复制代码 代码如下:



size_t Len(const BSTR str)
{
return SysStringLen(str);
}


或者不调用 windows api,由于 BSTR 前4个字节前缀表示字符串的字节数(不包括结尾的 BUL 字符),所以只要移动一下指针就行了:

复制代码 代码如下:



size_t Len(const BSTR str)
{
return *((int *)str - 1) / 2;
}


可以看出,由于 BSTR 的长度可以通过前缀取得,并不需要以 NUL 来作为字符串结束符,也就是说,VBS 字符串是 binary safe (二进制安全)的。

那么为什么下面的代码只能显示 Hello 呢?

MsgBox str这看起来好像和上面说的矛盾,其实不然。VBS 字符串的确是兼容 Chr(0) 字符的,MsgBox 之所以会被 Chr(0) 截断,是因为 MsgBox 在内部调用了 MessageBox 函数,而该函数是以 NUL 作为字符串结束符的。

复制代码 代码如下:



int MsgBox(const BSTR str)
{
return MessageBoxW(NULL, str, L"", 0);
}


也就是说,如果 VBS 内置的函数或者 COM 组件的某些方法在其内部实现中调的 Windows API 的字符串参数是以 NUL 作为结束符的话,就会被 Chr(0) 字符截断。

以上是“VBS字符串如何在内部实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: VBS字符串如何在内部实现

本文链接: https://www.lsjlt.com/news/253400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • VBS字符串如何在内部实现
    小编给大家分享一下VBS字符串如何在内部实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!VBS 是基于微软的 ActiveX/COM 技术实现的,而 COM 对...
    99+
    2023-06-08
  • vbs如何实现字符串操作
    这篇文章给大家分享的是有关vbs如何实现字符串操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。str="a|b|c|d" 要求写一段小程序得出: a|b|c|d b|c|d|a c|d|a|...
    99+
    2023-06-08
  • 如何在vbs中获取字符串
    这篇文章给大家介绍如何在vbs中获取字符串,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实例代码x="编程网是什么样的网站" y = right(x,&nbs...
    99+
    2023-06-08
  • jQuery如何实现字符串全部替换
    这篇文章主要为大家展示了“jQuery如何实现字符串全部替换”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现字符串全部替换”这篇文章吧。大家都...
    99+
    2024-04-02
  • vbs如何用指定字符串替换指定内容
    这篇文章主要介绍vbs如何用指定字符串替换指定内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:@echo off setlocal enabledelayedexpansion set file= set...
    99+
    2023-06-08
  • vbs如何实现字符统计功能
    这篇文章主要为大家展示了“vbs如何实现字符统计功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vbs如何实现字符统计功能”这篇文章吧。字符统计功能模块 代码如下:Sub TongJi() S...
    99+
    2023-06-08
  • sql字符串转数字如何实现
    在SQL中,可以使用CAST或CONVERT函数将字符串转换为数字。以下是两种方法的示例: 使用CAST函数: SELECT C...
    99+
    2024-04-09
    sql
  • sqlserver字符串转数字如何实现
    在 SQL Server 中,可以使用 CAST 或 CONVERT 函数将字符串转换为数字。以下是一些示例: 使用 CAST 函...
    99+
    2024-05-13
    sql
  • VBS怎么实现将字符串写入剪切板
    本篇内容主要讲解“VBS怎么实现将字符串写入剪切板”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VBS怎么实现将字符串写入剪切板”吧!函数代码: 复制代码 代码如下:Sub CopyString...
    99+
    2023-06-08
  • python如何实现字符串转字节
    这篇文章主要介绍了python如何实现字符串转字节,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。字符串转字节将一个字符串转换成字节类型In&...
    99+
    2024-04-02
  • C#如何实现字符串搜索
    小编给大家分享一下C#如何实现字符串搜索,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、正则表达式简介正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正...
    99+
    2023-06-18
  • MySQL如何实现字符串连接
    这篇文章主要介绍了MySQL如何实现字符串连接,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。字符串连接命令: concat(str...
    99+
    2024-04-02
  • javascript如何实现反转字符串
    这篇文章将为大家详细讲解有关javascript如何实现反转字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。javascript实现反转字符串的方法:1...
    99+
    2024-04-02
  • JavaScript如何实现字符串插值
    这篇文章主要为大家展示了“JavaScript如何实现字符串插值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何实现字符串插值”这篇文章吧...
    99+
    2024-04-02
  • Shell字符串截取如何实现
    这篇文章主要讲解了“Shell字符串截取如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shell字符串截取如何实现”吧!Shell 截取字符串通常有两种方式:从指定位置开始截取和从指...
    99+
    2023-06-09
  • 如何在Python中提取字符串的内容
    今天就跟大家聊聊有关如何在Python中提取字符串的内容,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研...
    99+
    2023-06-15
  • shell如何实现字符串操作
    小编给大家分享一下shell如何实现字符串操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:工作中字符串操作举例 filename='/home...
    99+
    2023-06-09
  • shell如何实现字符串替换
    小编给大家分享一下shell如何实现字符串替换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!字符串替换${string//pat...
    99+
    2024-04-02
  • Go如何实现字符串比较
    这篇“Go如何实现字符串比较”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Go如何实现字符串比较”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入主题吧。##...
    99+
    2023-06-29
  • Java如何实现截取字符串
    文章目录 0 写在前面1 .substring()2 split()+正则表达式3 StringUtils.substring()4 写在最后 0 写在前面 在实际工作...
    99+
    2023-09-11
    java 正则表达式 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作