首页
学习
活动
专区
圈层
工具
发布

史上最最靠谱,又双叒叒(ruò,zhuó)简单的基于MSXML的XML解析指南-C++

史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++ 最近做C++相关的项目,遇到同时使用COM和MSXML来解析XML文件中信息的问题,这类问题如果做MFC开发也会经常用到。...附 VS Project镜像: SimpleParser4MSXML-cpp: C++语言写的MSXML的简单使用示例, COM 和 MFC 开发中比较常用。...导入xml内容: VARIANT_BOOL bSuccess = false; iXMLDoc->loadXML(CComBSTR(src), &bSuccess); 注: BSTR字符串是用于COM组件对象模型的字符串格式...BSTR类型的变量是一个指针, 指向字符串的第一个字符处。 如何选取节点,and取节点属性有哪些方法?.../updated.xml 参考资料: IXMLDOMElement接口 Using the MSXML Parser MFC C++ XML Parse - Using MSXML 如何:各种字符串类型之间转换

1K20

BSTR LPSTR LPWSTR CString VARIANT COleVariant variant t CC

一、BSTR、LPSTR和LPWSTR 在Visual C++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。...在VC++中,还有类似的字符串类型,如LPTSTR、 LPCTSTR等,它们的含义如图2所示。...方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。...; 二、从其它包含字符串的变量中获取指向该字符串的指针 CString变量 str = “2008北京奥运”; buf = (LPSTR)(LPCTSTR)str; BSTR类型的_variant_t变量...当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 [“hi there”])或传递到 CString 对象。 CString 对象将自动转换成 LPCTSTR。

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    使用MSHTML解析HTML页面

    最近在写一个爬虫项目,本来打算用C/C++来实现,在网上查找有关资料的时候发现了微软的这个MSHTML库,最后发现在解析动态页面的时候它的表现实在是太差:在项目中需要像浏览器那样,执行JavaScript...中的数组,将HTML字符串写到数组中。...函数有三个参数,第一个参数表示数组中元素类型,一般给VT_VARIANT表示它是一个自动类型,第二个参数数组元素起始位置的下标,对于VC来说,数组元素总是从0开始,所以这个位置一般给0,第三个参数是数组的维数...调用接口的write方法,将接口与HTML字符串绑定 经过这样几步就可以利用这个接口来访问HTML中的元素了,下面是它的详细代码: IHTMLDocument2* CreateIHTMLDocument2...CComVariant类型的数组,并提供一个数组元素个数作为参数。

    4K30

    使用 WPADPAC 和 JScript在win11中进行远程代码执行1

    释放 BSTR 也与大多数对象不同,因为在调用 SysFreeString 时,它不是直接释放 BSTR,而是首先将字符串放入由 OleAut32.dll 控制的缓存中。...如果 Array.sort 的输入数组中的元素数大于 Array.length / 2,JsArrayStringHeapSort(如果未指定比较函数则由 Array.sort 调用)将分配一个相同大小的临时缓冲区作为当前数组中的元素数...然后它将尝试检索从 0 到 Array.length 的每个数组索引的相应元素,如果该元素存在,则将其添加到缓冲区并转换为字符串。...已经提到该数组将具有与当前输入数组中的元素数相同的大小(准确地说,它将是元素数 + 1)。...指向字符串 VAR 的指针被写入偏移量 0。 在偏移量 8 处,写入数组中当前元素的索引 根据原始 VAR 类型,在偏移量 40 处写入 0 或 1 看临时缓冲区的结构,很多我们并没有直接控制。

    8.2K950

    Internet Explorer漏洞分析(三)——VBScript Scripting Engine初探

    开始,数组元素个数为n+1(Dim array_name(n))。...图6 传递给函数的参数有二——cDims对应维数,VAR对应n。cDims应介于1-64: ? 图7 先来看一维数组的创建: ? 图8 为rgsabound结构各字段赋值: ?...图10 为数组元素赋值则直接将该元素所在内存偏移传递给vbscript!AssignVar: ? 图11 ---- 下面来看看二维数组(Dim stu_name(2,3))创建过程: ?...图12 可以看到数组各维大小于内存中并列存储,之后调用VAR::PvarGetTypeVal逐一读取为rgsabound中cElements字段赋值: ?...图21 GetVarType函数调用PvarGetVarVal——判断类型值是否为0x4A或0x0C: ? 图22 之后与0x09进行比较,若不是则直接返回对象进而获取vt值: ?

    1.1K10

    COM学习(四)——COM中的数据类型

    但是根据那套规则,只能识别接口,并调用没有参数和返回类型的接口,毕竟不同语言里面的基本数据类型不同,可能在VC++中char * 就表示字符串,而在Java或者c#中string是一个对象,二者的内存结构不同...HRESULT类型: 在COM中接口的返回值强制定义为该类型,用于表示当前执行的状态是完成或者是出错,这个类型一般在VC中使用,别的语言在调用时根据接口的这个值来确定接下来该如何进行。...BSTR COM中规定了一种通用的字符串类型BSTR,查看BSTR的定义如下: typedef /* [wire_marshal] */ OLECHAR *BSTR; typedef WCHAR OLECHAR...VARIANT 万能类型 现代编程语言一般有强类型的语言和弱类型的语言,强类型的像C/C++、Java这样的,必须在使用前定义变量类型,而弱类型像Python这样的可以直接定义变量而不用管它的类型,甚至可以写出像...,它其实是一个巨大的联合体,将所有C/C++的基本类型都包含进来,甚至包含了像BSTR, 这样的COM中使用的类型。

    1.3K30

    sizeof与strlen的区别

    所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节 str2是一个字符型数组。...C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"absde"占的总空间。"...该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。...sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址, 如: fun(char [8]) fun(char []...) 都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小 如果想在函数内知道数组的大小, 需要这样做: 进入函数后用memcpy拷贝出来

    86730

    C++基础(六).多态(1)

    前言 C++语言是C语言的拓展,C语言是面向过程的,C++在C的基础上增加了面向对象的方法 什么是面向对象呢,面向对象就是将数据和对数据的加工方法打包在一起,进行模块化的调用,通过方法来进行数据交换的一种设计方法...Tip: 本人关于程序的认知,可以参看前面写的 一个运维人员的编程思维 面向对象的程序设计有四个主要特点: 抽象 封装 继承 多态 下面就通过C++来对面向对象的核心特性进行分享 前面的一篇中使用友元函数的方式实现.../复制被加对象内容 return bstr; //将新构造的对象进行返回 } STR STR::operator = (const STR &str) //对此类的赋值运算符进行重载 {...o' emacs@ubuntu:~/c++$ gtx str.x str.cpp emacs@ubuntu:~/c++$ ..../str.x helloworldworld helloworld emacs@ubuntu:~/c++$ 编译执行过程中没有报错,从结果来看,符合预期 ---- const 限定 使用字符串进行构造的过程中要对字符串的内容使用

    38110

    【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    默认返回值 : C 中, 如果没有标明返回值类型, 默认的返回值不是 void, 是 int 类型; -- void参数 : C 语言中参数是void, 传入参数不会出错, C++中传入参数会出错,...A = 0; 在第10行, extern A 在第一行, 那么A的作用域就扩展为从第一行到文件末尾; -- 多文件 : 在任意文件中定义了 int A = 0; 在本文件中声明 extern A, 那么从当前位置到文件末尾都可以使用该变量...函数参数的传值调用和传址调用 (1) 传值调用 和 传址调用 传值调用 : 以传值的方式将参数传递给函数, 不能直接修改主函数中变量的值, 仅仅是将副本传递给了函数; 传址调用 : 将 变量的指针 传递给函数...sizeof(int) * i 个字节; 将数组赋值给指针的途径 :  -- 将数组第一个元素地址赋值给指针变量 : p = &a[0]; -- 将数组地址赋值给指针变量 : p = a; 指针 和 数组...; a = p 和 a++ 会报错; 数组参数 :  -- 形参指针 : 将数组传作为参数传递给函数的时候, 传递的是数组的首地址, 传递地址, 形参是指针; 数组参数示例 :  -- 函数参数是数组

    4.2K20

    C++中strlen()和sizeof()的区别

    参考链接: C++ strlen() 一、sizeof  sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等...当数组名作为参数传入时,实际上数组就退化成指针了。     它的功能是:返回字符串的长度。...该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。...sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸  9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,  如:  fun(char [8])  fun(char [...])  都等价于 fun(char *)  在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小  如果想在函数内知道数组的大小, 需要这样做:  进入函数后用memcpy拷贝出来

    1.1K20

    sizeof和strlen的区别(strlen和sizeof的用法)

    所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节 str2是一个字符型数组。...C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串”absde”占的总空间。”...该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。...sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址, 如: fun(char [8]) fun(char [...]) 都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小 如果想在函数内知道数组的大小, 需要这样做: 进入函数后用memcpy拷贝出来

    1K20

    《C++Primer》第六章 函数

    局部对象 在C++语言中,名字有作用域,对象有生命周期lifetime: 名字的作用域是程序文本的一部分,名字在其中可见 对象的生命周期是程序执行过程中该对象存在的一段时间 函数体是一个语句块,形参和函数体内部定义的变量统称为局部变量...熟悉C语言的程序员常常使用指针类型的形参访问函数外部的对象,在C+++中建议使用引用类型的形参来替代指针。 2....10个元素,实际上不一定 1.管理指针形参三种常用的技术 使用标记指定数组长度: 典型的就是C风格字符串,函数在处理C风格字符串时遇到空字符就停止。...传递多维数组 C++中多维数组本质上是数组的数组,真正传递的是指向数组首元素的指针,首元素本身就是一个数组。...int matrix[][10], int rowSize) {/*...*/} main处理命令行选项 // 第二个形参是一个数组,它的元素是指向C风格字符串的指针 // 第一个形参表示数组中字符串的数量

    81310

    C 语言实现面向对象第一步--对象模型

    也可以考虑使用普通类(plain class)(也就是常说的 C With Class)、泛型编程和独立的函数(就像数学、C,以及 Fortran 中那样)作为解决问题的方案。 当然,OOP !...感兴趣的可以去看下源码(学习分支):https://github.com/sogou/workflow/tree/study 当然了,这里我选择了模仿 C++ 对象模型,在《Inside the C++...我们需要一个创建对象和回收资源的方法,可以抄抄 C++ 的作业,C++ 中构造对象使用的是new运算符,new运算符完成了 内存分配 + 调用类构造函数两件事。...new()方法必须知道当前正在创建的是什么类型的对象,在 C++ 中,编译器会自动识别,并生成对应的汇编。 但是在 C 中我们只能手动将类型相关的信息作为参数。..._String 变量取地址赋值给定义在 string.h 的 StringNew // StringNew 就相当于构造字符串的类模板了,以后需要将这个指针传递给 new 函数 const void *

    1.2K10

    【愚公系列】软考中级-软件设计师 012-程序设计语言基础知识(概述)

    C++语言:C++是一种基于C语言的高级编程语言,它扩展了C语言的功能,引入了面向对象编程的概念。C++广泛应用于游戏开发、嵌入式系统等领域。...字符串:字符串是由字符组成的序列,在许多程序设计语言中都是作为一种特殊的数据类型存在。集合类型:集合类型是一种可以存储多个元素的数据类型,例如列表、集合、字典等。...数组(Arrays):用于存储和处理一组相同类型的数据元素的数据结构。数组提供了通过索引访问和操作元素的功能。结构(Structures):用于组织和管理多个相关数据的复合数据类型。...结构可以包含不同类型的数据成员,并且可以自定义操作和行为。类(Classes):面向对象编程中的基本概念,用于定义对象的属性和行为。类可以有多个对象实例,并且可以继承和扩展其他类。...数据传输可以通过传值或传引用的方式进行,具体取决于编程语言的规定。赋值:赋值是将数据存储到变量中的过程。在程序设计语言中,赋值操作使用赋值符号(通常是等号)将右侧的数据值赋给左侧的变量。

    45911

    HarmonyOS 开发实践——跨语言的复杂参数类型传递

    "add"和"sub"方法,传递这个数组作为参数,并将结果存储在result1和result2变量中。   ...并将解析后的结果存储在 myMap 变量中    auto myMap = nlohmann::json::parse(jsonStr.c_str());    // 从 myMap 对象中获取名为 "...arr" 的数组,并取其第三个元素(索引为2),并将结果存储在 val 变量中。   ...类型的数据通过传入文件在沙箱中的路径来实现 Native C++ 与 ArkTS 之间的传递,这里例举了 HEIC 格式的图片进行传递,其他格式可以先通过传入的文件路径获取 pixelmap,然后使用...首先在 ArkTS 侧将文件路径以字符串的方式传给 Native C++ 侧,Native C++ 侧获取传入的文件路径,通过 heif_context_read_from_file 从应用沙箱中读取

    44020

    WMI技术介绍和应用——VC开发WMI应用的基本步骤

    但是各种语言对WMI的控制能力是不同的,比如脚本语言只能用来从WMI获取数据或者接收事件通知。而C++还可以编写WMI提供者和发送消息。...和脚本语言相比,C++对WMI有强大的控制和定制性,当然也具有更大的复杂性。本文将主要讲述使用VC如何搭建一个使用WMI的框架。...在WMI Consumers层,我们发现,C++程序是直接和WMI COM API进行交互。所以我们要先初始化COM组件库。...是不允许一个进程去访问另一个进程的中的对象。...在我定义的类中,我将该步骤封装成一个纯虚函数Excute,继承CWMI的类将实现具体的工作。 清理          我们在使用完以上的代理和实例后,我们要释放它们,并且最后要释放COM库。

    1.5K40

    C++日新月异的未来代码:C++11(上)

    C++98 中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定 struct Point { int _x; int _y; }; int main() { int x1 =...中的容器基本都是支持 initializer_list 初始化的,这初始化的方式和上面的隐式类型不同,具体方式如下: 首先要知道 initializer_list 主要有这三个成员 创建一个临时数组(存储在栈上...),包含元素 {1, 2, 3} 生成一个 initializer_list 对象,该对象引用临时数组(内部保存数组的起始地址和长度) initializer_list 引用临时数组(不拥有其内存...vector 还接收着的话会造成悬空引用 因此 initializer_list 的存在还是很有必要的: 在 C++11 之前,若想让函数接收一个类似 {1, 2, 3} 的初始化列表作为参数,需要通过数组或容器...这避免了对字符串内容的深拷贝,直接转移资源所有权,提升效率 移动赋值: 在 main 函数中,先创建了 string 对象 ret2 ,然后 ret2 = func(); ,这里func() 返回一个临时对象

    13610

    Go 语言知识总结

    数组是定长且有序的相同类型元素的集合。...数组是值类型,赋值或传参时会发生值拷贝,要使用引用拷贝需用指针。 使用内建函数len()和cap()获取到的都是数组长度。...通道实现原理 通道创建时是在堆中创建了一个结构体,并返回指针,所以通道是引用类型。 通道结构体中主要包含:缓冲区循环数组,发送索引、接收索引、互斥锁、接收和发送的协程队列等。...在中心缓存与系统内存之间增加一层堆内存,作为系统内存的抽象。 小对象、中对象、大对象的分配策略差异化处理,平衡内存利用率和分配效率。...Len() 返回数组、切片、字符串等类型值的长度。 Index() 返回数组、切片、字符串等类型值的元素值反射信息。

    39211
    领券