为您推荐:
精华内容
最热下载
问答
回复次数:7






vector<string>怎么用

2011-08-11 12:32 balladgood  |  浏览 3077 次
我有更好的答案

1条回答

2011-08-11 12:43 frog3211  | 四级  最快回答
#include<string>
#include <vector>
#include <iostream>
using namespace std;

void main()
{
vector<string> vec;//定义个一个字符串容器
string str;
str = "abc";
vec.push_back(str);//把字符串str压进容器
vec.push_back("def");//把字符串"def"压进容器
vec.push_back("123");
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<endl;//打印容器的内容
}
vec.pop_back();//取出容器中最后一个
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<endl;//打印容器的内容
}
}
追问:
有没有一次初始化的方法,而不用push_back
追答:
用这个也行哦
vec.resize(4,"abc");
一次性有4个abc
标题:求教一个vector<string>指针问题
[只看楼主]   [收藏]
dong820729
Rank: 2
等 级:论坛游民
帖 子:11
专家分:29
注 册:2009-12-21
结帖率: 50%
   已结贴   问题点数:20  回复次数:11   
     
求教一个vector<string>指针问题
该题目为c++primer的习题:编写程序定义一个vector对象,其每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容及其相应的长度。

我的程序如下:

#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786) 
using namespace std;
int main()
{
    string str;
    vector<string*> psvec;//为何这里用string*类型,不能用vector<string>*呢?
    while(cin>>str)
    {
        string *ps=new string;//为何这里要动态创建string,不能直接psvec->push_back(str)?
        *ps=str;//这里为何用*ps=str,不能使用ps=&str?
        psvec.push_back(ps);/*在这里我们把ps给psvec,那么psvec保存的应该是string*类型,
                              下面的for循环显然使用了该类型的begin(),end()操作,
                              为什么可以这样用?*/
    }
    for(vector<string*>::iterator iter=psvec.begin();iter!=psvec.end();++iter)
    {
        cout<<**iter<<" "<<(*iter)->size()<<endl;
        delete *iter;/*1.为何要释放*iter?
                       2.为何不是释放iter?
                       3.我们动态创建的是ps,为何不是释放ps?
                       4.我在网上找的答案是在这个for循环外另起一个同样的循环释放*iter,我在这里释放有何不可?
                         我在这里释放,编译也可通过,为何?*/
    }
    return 0;
}


此题给我的问题颇多,希望各位大神能给出详细解答!
先行谢过!
搜索更多相关主题的帖子:  string   指针   vector  
  2010-03-01 16:24
   
 
cnfarer
Rank: 20 Rank: 20 Rank: 20 Rank: 20 Rank: 20
等 级:版主
威 望: 178
帖 子:3294
专家分:21129
注 册:2010-1-19
   得分:10 
     
是否正确,望高手斧正!
#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string*> psvec;//vector<T> T是类型,而vector<T>*是指向一个vector的指针
    while(cin>>str)
    {
        string *ps=new string;//str不是string*类型,同时str的地址是不变的
        *ps=str;//*ps=str,ps=&str你认为它们是一样的吗?
        psvec.push_back(ps);/*在这里我们把ps给psvec,那么psvec保存的应该是string*类型,
                              下面的for循环显然使用了该类型的begin(),end()操作,
                              但begin(),end()返回的不是string* 而是string**  */
    }
    for(vector<string*>::iterator iter=psvec.begin();iter!=psvec.end();++iter)
    {
        cout<<**iter<<" "<<(*iter)->size()<<endl;
        delete *iter;/*  *iter就是ps  再用一个循环释放与这个没有本质差别*/
    }
    return 0;
}

★★★★★为人民服务★★★★★
  2010-03-02 07:47
   
 
cnfarer
Rank: 20 Rank: 20 Rank: 20 Rank: 20 Rank: 20
等 级:版主
威 望: 178
帖 子:3294
专家分:21129
注 册:2010-1-19
   得分:2 
     
实际上你可以用vector<string>来处理这个问题,不必用vector<string*>

#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string> psvec;
    while(cin>>str)
    {
        psvec.push_back(str);
    }
    for(vector<string>::iterator iter=psvec.begin();iter!=psvec.end();++iter)
    {
        cout<<*iter<<" "<<iter->size()<<endl;
    }
    return 0;
}

[  本帖最后由 cnfarer 于 2010-3-2 08:03 编辑 ]

★★★★★为人民服务★★★★★
  2010-03-02 07:58
   
 
dong820729
Rank: 2
等 级:论坛游民
帖 子:11
专家分:29
注 册:2009-12-21
   得分:0 
     
还有些疑惑:ps在这里应该是一个string类型的动态指针,那么*ps=str表示对ps解引用操作保存的是str的值,而ps=&str表示ps保存的是str的地址,那么对ps进行解引用应该也是得到的str的值啊。所以我不明白,为什么只能用*ps=str而不能使用ps=&str。事实上,我试过把*ps=str改成ps=&str,确实出现一堆错误,请问这两者有何区别,谢谢!
  2010-03-02 09:12
   
 
秀痘魔导士
Rank: 9 Rank: 9 Rank: 9
等 级:蜘蛛侠
威 望: 6
帖 子:250
专家分:1150
注 册:2009-12-23
   得分:1 
     
以下是引用dong820729在2010-3-2 09:12:19的发言:

还有些疑惑:ps在这里应该是一个string类型的动态指针,那么*ps=str表示对ps解引用操作保存的是str的值,而ps=&str表示ps保存的是str的地址,那么对ps进行解引用应该也是得到的str的值啊。所以我不明白,为什么只能用 ...
编译成功,没有问题
  2010-03-02 11:26
   
 
秀痘魔导士
Rank: 9 Rank: 9 Rank: 9
等 级:蜘蛛侠
威 望: 6
帖 子:250
专家分:1150
注 册:2009-12-23
   得分:1 
     
以下是引用cnfarer在2010-3-2 07:47:58的发言:

是否正确,望高手斧正!
#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string*> psvec;//vector<T>  ...
delete *iter这边不对,*iter是string的指针。
  2010-03-02 11:27
   
 
cnfarer
Rank: 20 Rank: 20 Rank: 20 Rank: 20 Rank: 20
等 级:版主
威 望: 178
帖 子:3294
专家分:21129
注 册:2010-1-19
   得分:3 
     
回复 4楼 dong820729
*ps=str是赋值(将str的内容复制到ps所指向的地址空间)!而ps=&str是改变了ps指向的内存空间的地址,不再是申请到地址了,而是str的地址!

★★★★★为人民服务★★★★★
  2010-03-02 14:13
   
 
cnfarer
Rank: 20 Rank: 20 Rank: 20 Rank: 20 Rank: 20
等 级:版主
威 望: 178
帖 子:3294
专家分:21129
注 册:2010-1-19
   得分:1 
     
而string本身就应该是个指针,所以ps=&str以后,肯定要出错的

★★★★★为人民服务★★★★★
  2010-03-02 14:21
   
 
cnfarer
Rank: 20 Rank: 20 Rank: 20 Rank: 20 Rank: 20
等 级:版主
威 望: 178
帖 子:3294
专家分:21129
注 册:2010-1-19
   得分:0 
     
回复 6楼 秀痘魔导士
你可以delete **iter啊

★★★★★为人民服务★★★★★
  2010-03-02 14:24
   
 
秀痘魔导士
Rank: 9 Rank: 9 Rank: 9
等 级:蜘蛛侠
威 望: 6
帖 子:250
专家分:1150
注 册:2009-12-23
   得分:0 
     
以下是引用cnfarer在2010-3-2 14:24:47的发言:

你可以delete **iter啊
刚开始没仔细看,你写的没什么问题。我刚开始是看成了*iter你指代str的~

[  本帖最后由 秀痘魔导士 于 2010-3-2 14:34 编辑 ]
标题:求教一个vector<string>指针问题
[只看楼主]   [收藏]
秀痘魔导士
Rank: 9 Rank: 9 Rank: 9
等 级:蜘蛛侠
威 望: 6
帖 子:250
专家分:1150
注 册:2009-12-23
   得分:2 
     
以下是引用cnfarer在2010-3-2 14:21:36的发言:

而string本身就应该是个指针,所以ps=&str以后,肯定要出错的
ps指向str的地址空间,不会报错的。str就算你没初始化,一般编译器会给你一个默认值。只不过那样产生内存泄露,编译器是不会理会这个的

[  本帖最后由 秀痘魔导士 于 2010-3-2 14:35 编辑 ]
  2010-03-02 14:30
   
 
cnfarer
Rank: 20 Rank: 20 Rank: 20 Rank: 20 Rank: 20
等 级:版主
威 望: 178
帖 子:3294
专家分:21129
注 册:2010-1-19
   得分:0 
     
回复 11楼 秀痘魔导士
编译通过就行的话,就简单多了!




收起
展开全文
zangchaodotcnatgmail 2015-09-19 14:29:50
  • Unicode_String Ansi_String 内核字符串操作 string unicode 字符串 内核

    typedef struct _UNICODE_STRING { USHORT Length;//字节数,不是字符数 一定要* sizeof(WCHAR) USHORT MaximumLength;//字节数,不是字符数 一定要* sizeof(WCHAR) PWSTR Buffer;//非零结尾,中间也可能含有零 }...
    typedef struct _UNICODE_STRING {
      USHORT  Length;//字节数,不是字符数 一定要* sizeof(WCHAR)
      USHORT  MaximumLength;//字节数,不是字符数 一定要* sizeof(WCHAR)
      PWSTR  Buffer;//非零结尾,中间也可能含有零
    } UNICODE_STRING, *PUNICODE_STRING;

    //常用函数
    RtlInitUnicodeString(&uStr1, str1);//注意 这个函数并不是将str1拷贝到uStr1.buffer 而是将buffer指向str1 所以如果这个buffer是程序员为它分配的 那么不能释放 也不能为它分配 一是BSOD 二是内存泄露
    RtlCopyUnicodeString(&uStr1, &uStr2);//需要注意这里copy uStr1的buffer必须自己分配 如果后面跟着的是常量 
    RtlAppendUnicodeToString(&uStr1, str1);//注意 uStr1的buffer必须自己分配
    RtlAppendUnicodeStringToString(&uStr1, &uStr2);//注意 uStr1的buffer必须自己分配
    RtlCompareUnicodeString(&uStr1, &uStr2, TRUE/FALSE);//比较 TRUE 指定大小写
    RtlAnsiStringToUnicodeString(&uStr1, &aStr1, TRUE/FALSE);// TRUE 指定buffer系统分配 如果是TRUE 则用后需要调用RtlFreeUnicodeString
    RtlFreeUnicodeString(&uStr1);


    这些函数调用时系统会自动检测是否超过buffer 相对来说安全一些

    #include <ntstrsafe.h> 
    RtlUnicodeStringInit(&uStr1, str1);
    RtlUnicodeStringCopy(&uStr1, &uStr2);
    RtlUnicodeStringCat(&uStr1, &uStr2);
    #define NTSTRSAFE_UNICODE_STRING_MAX_CCH    (0xffff / sizeof(wchar_t))  (32767个字符)
    



    快速初始化一个UnicodeString字符串

    DECLARE_CONST_UNICODE_STRING(ustrTest,L”Hello, world!”);
    //这个等同于
    UNICODE_STRING ustrTest = {0};
    WCHAR *szHello = L”Hello, world!”;
    RtlInitUnicodeString(&ustrTest, szHello);
    //Length:wcslen(szHello)*sizeof(WCHAR)
    //MaximumLength:(wcslen(szHello)+1)*sizeof(WCHAR);

    初始化方式:栈上buffer
    UNICODE_STRING ustrTest = {0};
    WCHAR szHello[512] = L”Hello, world!”;
    //Length:wcslen(szHello)*sizeof(WCHAR)
    //MaximumLength:(wcslen(szHello)+1)*sizeof(WCHAR);
    RtlInitUnicodeString(&ustrTest, szHello);
    

    或者
    UNICODE_STRING ustrTest = {0};
    WCHAR szHello[512] = L”Hello, world!”;
    ustrTest.Buffer = szHello;
    ustrTest.Length = wcslen(L”hello,world!”)*sizeof(WCHAR);
    ustrTest.MaximumLength = sizeof(szHello);

    初始化方式:堆上buffer
    UNICODE_STRING ustrTest = {0};
    ULONG ulLength = (wcslen(L"Hello world") + 1)*sizeof(WCHAR);
    ustrTest.Buffer = ExAllocatePoolWithTag(PagedPool, MAX_PATH*sizeof(WCHAR), 'POCU');
    if (ustrTest.Buffer == NULL)
    {
    	return;
    }
    RtlZeroMemory(ustrTest.Buffer, MAX_PATH*sizeof(WCHAR));
    wcscpy(ustrTest.Buffer, L"Hello, world");//必须使用内存拷贝类函数
    ustrTest.Length = ulLength;
    ustrTest.MaximumLength = MAX_PATH*sizeof(WCHAR);
    DbgPrint("%wZ\n", &ustrTest);
    ExFreePool(ustrTest.Buffer);//这样释放就没有问题啦

    下个这个演示了UnicodeString的一个蓝屏
    UNICODE_STRING ustrTest = {0};
    ustrTest.Buffer = ExAllocatePoolWithTag(PagedPool, 
    		(wcslen(L"Nice to meet u") + 1)*sizeof(WCHAR), 'POCU');
    if (ustrTest.Buffer == NULL)
    {
    	return;
    }
    RtlZeroMemory(ustrTest.Buffer, (wcslen(L"Hello, world") + 1)*sizeof(WCHAR));
    RtlInitUnicodeString(&ustrTest, L”Hello, world”);//这个时候userTest.buffer指向了hello wolrd的地址 导致了内存泄露 在下面调用ExFree的时候还会蓝屏
    DbgPrint("%wZ\n", & ustrTest);
    ExFreePool(ustrTest.Buffer); //蓝屏 释放常量区内存

    UNICODE_STRING常见问题
    计算length的时候,少了*sizeof(WCHAR)
    计算字符数的时候,少了/sizeof(WCHAR)
    使用了wcscmp/wcscpy等函数操作
    更长远的说,缓冲大小长度问题,就是驱动容易出错的问题
    WCHAR wszPath[MAX_PATH];
    MAX_PATH? MAX_PATH 在windows上是260  在linux是256
    sizeof(wszPath)或者MAX_PATH*sizeof(WCHAR) 这才是字符长度
    MAX_PATH*2? 也是可以的


    使用Copy Append时目标的buffer不是自行分配的 必定失败 如下:
    	RtlInitUnicodeString(&uStr1, L"hello"); //直接将L"hello"字符串的指针赋给了uStr.Buffer;
    	RtlInitUnicodeString(&uStr2, L"Goodbye");
    
    
    	DbgPrint("%ws\n", L"hello world");
    	DbgPrint("uStr1=%wZ\n", &uStr1);
    	DbgPrint("uStr2=%wZ\n", &uStr2);
    
    
    	RtlInitAnsiString(&aStr1, "Ansi to unicode");
    	DbgPrint("aStr1=%Z\n", &aStr1);
    
    
    	RtlCopyUnicodeString(&uStr3, &uStr1);
    	DbgPrint("uStr3=%wZ\n", &uStr3);//失败
    
    
    	RtlAppendUnicodeToString(&uStr1, L"world");
    	DbgPrint("uStr1=%wZ\n", &uStr1);//失败
    
    
    	RtlAppendUnicodeStringToString(&uStr1, &uStr2);
    	DbgPrint("uStr1=%wZ\n", &uStr1);//失败
    


    缓冲大小的判断
    //处理应用层的read()函数

    NTSTATUS DispatchRead (
        IN PDEVICE_OBJECT	pDevObj,
        IN PIRP	pIrp) 
    {
    	NTSTATUS 	status = STATUS_SUCCESS;
    	PVOID 	userBuffer = NULL;
    	ULONG 	xferSize = 0;
    
    
    	//获取IRP堆栈的当前位置
    	PIO_STACK_LOCATION pIrpStack =
    		IoGetCurrentIrpStackLocation( pIrp );
    	//获取传输的字节数和缓冲
    	xferSize = pIrpStack->Parameters.Read.Length;
    	userBuffer = pIrp->AssociatedIrp.SystemBuffer;	
    	//从驱动中读数据
    	RtlCopyMemory( userBuffer, L"Hello, world",
    	    xferSize );
    	//填写IRP中的完成状态,结束IRP操作,不向下层发送
    	pIrp->IoStatus.Status = status;
    	pIrp->IoStatus.Information = xferSize;
    	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
    	return status;
    }



    字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花
    样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*、WCHAR*、ANSI_STRING、
    UNICODE_STRING。当然,内核里使用频率最多的是 UNICODE_STRING,其次是 WCHAR*,再
    次是 CHAR*,而 ANSI_STRING,则几乎没见过有什么内核函数使用。
    但其实这四种字符串也不是完全独立的,ANSI_STRING可以看成是CHAR*的安全性扩展,
    UNICODE_STRING 可以看成是 WCHAR*的安全性扩展。CHAR* , 可以 理解成 成 CHAR  数组, 本
    质上来说 是一个地址, 它 的有效长度是多少?不知道 。 字符串 有多长?不清楚 , 遇到\0  就
    当成是 字符串 的 结尾。综上所述,CHAR*的安全性是非常糟糕的,如果内核使用 CHAR*作为
    主要字符串,那么会非常不稳定。WCHAR*和 和 CHAR* 类似 ,和 和 CHAR* 的唯一不同在于 一个
    WCHAR 占 占 2  个字节,而一个 CHAR 只占 1 个字节。所以,WCHAR* 的安全性也是非常糟糕
    的。微软为了安全性着想,推出了这两种字符串的扩展集,ANSI_STRING和UNICODE_STRING。
    ANSI_STRING 和 UNICODE_STRING 都是结构体,定义如下:
    typedef struct _ANSI_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PCHAR Buffer;
    } ANSI_STRING, *PANSI_STRING;
    typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWCHAR Buffer;
    } UNICODE_STRING, *PUNICODE_STRING;


    可以看到,ANSI_STRING 和 UNICODE_STRING 的结构体大小是一样的,唯一不同在于第
    三个成员,他们分别对应 CHAR*和 WCHAR*。它们的第一和第二个成员分别代表字符串的长
    度和内存的有效长度。比如 BUFFER 的长度是 260 字节,而 BUFFER 只是一个单词”FUCK”,
    则 ANSI_STRING 的 Length=4、MaximumLength=260;UNICODE_STRING 的 Length=8、
    MaximumLength=260。另外需要注意的是,CHAR*和 和 WCHAR* 都是以 0  结尾的 (CHAR*以 以 1
    个\0  结尾 ,WCHAR*以 以 2  个\0  结尾 ),但 但 ANSI_STRING 和 和 UNICODE_STRING  不一定以 以 0  结
    尾。 因为 有了长度的说明,就不需要用特殊标识符来表示结尾了。 。 有些自以为是 的人直接把
    ANSI_STRING 或 或 UNICODE_STRING 的 的 BUFFER  当作字符串用,是极端错误的。
    在内核里,大部分的 C 语言字符串函数都是可以用的,无论是宽版的还是窄版的。比如
    内核里可以照样使用 strcpy 和 wcscpy,但某些字符串函数签名可能要加上一个下划线。比
    如 strlwr 要写成_strlwr。ANSI_STRING 和 UNICODE_STRING 有一套专门的字符串函数(在此
    页面:http://msdn.microsoft.com/en-us/library/windows/hardware/ff563638(v=vs.85).aspx),如
    果需要查询怎么使用,就用浏览器打开,搜索 AnsiString 或者 UnicodeString,并点击进去查
    看说明即可。


    下面的来直张帆的书
    下面举几个关于 UNICODE_STRING 的例子(以下代码借用了张帆写的示例,特此声明感
    谢)。1. 字符串初始化、2. 字符串拷贝 、3. 字符串比较 、4. 字符串变大写 、5. 字符串与整型相
    互转化 、6. ANSI_STRING  字符串与 UNICODE_STRING  字符串相互转换。
    //1.字符串初始化
    
    
    VOID StringInitTest()
    {
    	//(1)用 RtlInitAnsiString 初始化字符串
    	ANSI_STRING AnsiString1;
    	CHAR * string1= "hello";
    	//初始化 ANSI_STRING 字符串
    
    
    	RtlInitAnsiString(&AnsiString1,string1);
    	KdPrint(("AnsiString1:%Z\n",&AnsiString1));//打印 hello
    	string1[0]='H';
    	string1[1]='E';
    	string1[2]='L';
    	string1[3]='L';
    	string1[4]='O';
    	//改变 string1,AnsiString1 同样会导致变化
    	KdPrint(("AnsiString1:%Z\n",&AnsiString1));//打印 HELLO
    	//(2)程序员自己初始化字符串
    	#define BUFFER_SIZE 1024
    	UNICODE_STRING UnicodeString1 = {0};
    	//设置缓冲区大小
    	UnicodeString1.MaximumLength = BUFFER_SIZE;
    	//分配内存
    	UnicodeString1.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);
    	WCHAR* wideString = L"hello";
    	//设置字符长度,因为是宽字符,所以是字符长度的 2 倍
    	UnicodeString1.Length = 2*wcslen(wideString);
    	//保证缓冲区足够大,否则程序终止
    	ASSERT(UnicodeString1.MaximumLength>=UnicodeString1.Length);
    	//内存拷贝,
    	RtlCopyMemory(UnicodeString1.Buffer,wideString,UnicodeString1.Length);
    	//设置字符长度
    	UnicodeString1.Length = 2*wcslen(wideString);
    	KdPrint(("UnicodeString:%wZ\n",&UnicodeString1));
    	//清理内存
    	ExFreePool(UnicodeString1.Buffer);
    	UnicodeString1.Buffer = NULL;
    	UnicodeString1.Length = UnicodeString1.MaximumLength = 0;
    }
    //2.字符串拷贝
    VOID StringCopyTest()
    {
    	//初始化 UnicodeString1
    	UNICODE_STRING UnicodeString1;
    	RtlInitUnicodeString(&UnicodeString1,L"Hello World");
    	//初始化 UnicodeString2
    	UNICODE_STRING UnicodeString2={0};
    	UnicodeString2.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);
    	UnicodeString2.MaximumLength = BUFFER_SIZE;
    	//将初始化 UnicodeString2 拷贝到 UnicodeString1
    	RtlCopyUnicodeString(&UnicodeString2,&UnicodeString1);
    	//分别显示 UnicodeString1 和 UnicodeString2
    
    
    	KdPrint(("UnicodeString1:%wZ\n",&UnicodeString1));
    	KdPrint(("UnicodeString2:%wZ\n",&UnicodeString2));
    	//销毁 UnicodeString2
    	//注意!!UnicodeString1 不用销毁
    	RtlFreeUnicodeString(&UnicodeString2);
    }
    //3.字符串比较
    VOID StringCompareTest()
    {
    	//初始化 UnicodeString1
    	UNICODE_STRING UnicodeString1;
    	RtlInitUnicodeString(&UnicodeString1,L"Hello World");
    	//初始化 UnicodeString2
    	UNICODE_STRING UnicodeString2;
    	RtlInitUnicodeString(&UnicodeString1,L"Hello");
    	if (RtlEqualUnicodeString(&UnicodeString1,&UnicodeString2,TRUE))
    		KdPrint(("UnicodeString1 and UnicodeString2 are equal\n"));
    	else
    		KdPrint(("UnicodeString1 and UnicodeString2 are NOT equal\n"));
    }
    //4.字符串变大写
    VOID StringToUpperTest()
    {
    	//初始化 UnicodeString1
    	UNICODE_STRING UnicodeString1;
    	UNICODE_STRING UnicodeString2;
    	RtlInitUnicodeString(&UnicodeString1,L"Hello World");
    	//变化前
    	DbgPrint("UnicodeString1:%wZ\n",&UnicodeString1);
    	//变大写
    	RtlUpcaseUnicodeString(&UnicodeString2,&UnicodeString1,TRUE);
    	//变化后
    	DbgPrint("UnicodeString2:%wZ\n",&UnicodeString2);
    	//销毁 UnicodeString2(UnicodeString1 不用销毁)
    	RtlFreeUnicodeString(&UnicodeString2);
    }
    //5.字符串与整型相互转化
    VOID StringToIntegerTest()
    {
    	//(1)字符串转换成数字
    	//初始化 UnicodeString1
    	UNICODE_STRING UnicodeString1;
    	RtlInitUnicodeString(&UnicodeString1,L"-100");
    	ULONG lNumber;
    
    
    	NTSTATUS nStatus = RtlUnicodeStringToInteger(&UnicodeString1,10,&lNumber);
    	if ( NT_SUCCESS(nStatus))
    	{
    		KdPrint(("Conver to integer succussfully!\n"));
    		KdPrint(("Result:%d\n",lNumber));
    	}
    	else
    	{
    		KdPrint(("Conver to integer unsuccessfully!\n"));
    	
    	}
    	//(2)数字转换成字符串
    	//初始化 UnicodeString2
    	UNICODE_STRING UnicodeString2={0};
    	UnicodeString2.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);
    	UnicodeString2.MaximumLength = BUFFER_SIZE;
    	nStatus = RtlIntegerToUnicodeString(200,10,&UnicodeString2);
    	if ( NT_SUCCESS(nStatus))
    	{
    		KdPrint(("Conver to string succussfully!\n"));
    		KdPrint(("Result:%wZ\n",&UnicodeString2));
    	}
    	else
    	{
    		KdPrint(("Conver to string unsuccessfully!\n"));
    	}
    	//销毁 UnicodeString2
    	//注意!!UnicodeString1 不用销毁
    	RtlFreeUnicodeString(&UnicodeString2);
    }
    //6. ANSI_STRING 字符串与 UNICODE_STRING 字符串相互转换
    VOID StringConverTest()
    {
    	//(1)将 UNICODE_STRING 字符串转换成 ANSI_STRING 字符串
    	//初始化 UnicodeString1
    	UNICODE_STRING UnicodeString1;
    	RtlInitUnicodeString(&UnicodeString1,L"Hello World");
    	ANSI_STRING AnsiString1;
    	NTSTATUS nStatus = RtlUnicodeStringToAnsiString(&AnsiString1,&UnicodeString1,TRUE);
    	if ( NT_SUCCESS(nStatus))
    	{
    		KdPrint(("Conver succussfully!\n"));
    		KdPrint(("Result:%Z\n",&AnsiString1));
    	}
    	else
    
    
    	{
    			KdPrint(("Conver unsuccessfully!\n"));
    	}
    	//销毁 AnsiString1
    	RtlFreeAnsiString(&AnsiString1);
    	//(2)将 ANSI_STRING 字符串转换成 UNICODE_STRING 字符串
    	//初始化 AnsiString2
    	ANSI_STRING AnsiString2;
    	RtlInitString(&AnsiString2,"Hello World");
    	UNICODE_STRING UnicodeString2;
    	nStatus = RtlAnsiStringToUnicodeString(&UnicodeString2,&AnsiString2,TRUE);
    	if ( NT_SUCCESS(nStatus))
    	{
    		KdPrint(("Conver succussfully!\n"));
    		KdPrint(("Result:%wZ\n",&UnicodeString2));
    	}
    	else
    	{
    		KdPrint(("Conver unsuccessfully!\n"));
    	}
    	//销毁 UnicodeString2
    	RtlFreeUnicodeString(&UnicodeString2);
    }
    


    下面三个来自TA

    //UNICODE_STRINGz 转换为 CHAR*
    //输入 UNICODE_STRING 的指针,输出窄字符串,BUFFER 需要已经分配好空间
    VOID UnicodeToChar(PUNICODE_STRING dst, char *src)
    {
    	ANSI_STRING string;
    	RtlUnicodeStringToAnsiString(&string,dst, TRUE);
    	strcpy(src,string.Buffer);
    	RtlFreeAnsiString(&string);
    }
    
    
    //WCHAR*转换为 CHAR*
    //输入宽字符串首地址,输出窄字符串,BUFFER 需要已经分配好空间
    VOID WcharToChar(PWCHAR src, PCHAR dst)
    {
    	UNICODE_STRING uString;
    	ANSI_STRING aString;
    	RtlInitUnicodeString(&uString,src);
    	RtlUnicodeStringToAnsiString(&aString,&uString,TRUE);
    	strcpy(dst,aString.Buffer);
    	RtlFreeAnsiString(&aString);
    }
    
    
    
    
    //CHAR*转 WCHAR*
    //输入窄字符串首地址,输出宽字符串,BUFFER 需要已经分配好空间
    VOID CharToWchar(PCHAR src, PWCHAR dst)
    {
    	UNICODE_STRING uString;
    	ANSI_STRING aString;
    	RtlInitAnsiString(&aString,src);
    	RtlAnsiStringToUnicodeString(&uString,&aString,TRUE);
    	wcscpy(dst,uString.Buffer);
    	RtlFreeUnicodeString(&uString);
    }
    



    CharToUnicode(CHAR*转 UNICODE_STRING)函数怎么写?


    //待定
    VOID CharToUnicode(PCHAR src,PUNICODE_STRING dst)
    {
    	ANSI_STRING aString;
    	RtlInitAnsiString(&aString,src);
    	RtlAnsiStringToUnicodeString(dst,&aString,FALSE);
    }


    下面还有用于安全开发的,转来的

    一、前言

           大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关。c/c++语言运行库提供的标准字符串操作函数(strcpy, strcat, sprintf等)不能阻止在超出字符串尾端的写入。

           基于Windows XP SP1以及随后的操作系统的Windows DDK版本提供了安全字符串函数(safe string functions)。这类函数被设计的目的是用来取代相同功能的c/c++标准函数和其它微软提供的库函数。这类函数具有以下特征:

    • 每个函数以目标缓冲区所占的字节大小作为其一个输入参数,因此可以保证在写入时不会超出缓冲区末端。
    • 每个函数的输出字符串均以NULL结尾(null-terminate),即使该函数可能会对正确的结果进行截断。
    • 所有函数均有返回值,类型为NTSTATUS,只有返回STATUS_SUCCESS时,操作结果才正确。
    • 每个函数均有两种类型的版本,按字节或者按字符数。例如,RtlStringCbCatWRtlStringCchCatW
    • 每个函数均有支持双字节的unicode字符(以W作为后缀)和单字节的ANSI字符(以A作为后缀)的版本。例如:RtlStringCbCatWRtlStringCbCatA
    • 大部分函数有提供扩展版本的函数(以Ex作为后缀),例如,RtlStringCbCatWRtlStringCbCatExW

    二、如何在内核驱动代码中引入安全字符串函数

        有两种方式可以引入安全字符串函数:

    l        以内联的方式引入,包含在ntstrsafe.h中

    l        在链接时以库的方式引入

    其中,如果代码需要在系统为Windows XP及以后版本运行时,可以使用内联的方式;如果代码需要运行在早于Windows XP时,则必须使用链接库的方式。

    以内联方式引入

    只需包含头文件即可

    #include <ntstrsafe.h>

    以链接库的方式

    1. 在包含头文件之前先定义宏

    #define NTSTRSAFE_LIB

    #include <ntstrsafe.h>

    1. 在项目的sources文件中,添加一TARGETLIBS条目如下: $(DDK_LIB_PATH)\ntstrsafe.lib.

    在默认情况下,当引入了安全字符串函数后,那些被取代的c/c++运行库函数将变得无效,编译是会报错,提示需要使用安全字符串函数。

        如果还希望继续使用c/c++运行库函数,即在使用安全字符串函数的时候,c/c++运行库函数还可以继续使用,则需要在包含ntstrsafe.h之前先定义宏NTSTRSAFE_NO_DEPRECATE

    #define NTSTRSAFE_NO_DEPRECATE

    The maximum number of characters that any ANSI or Unicode string can contain is STRSAFE_MAX_CCH. This constant is defined in ntstrsafe.h.

    字符串最长长度为STRSAFE_MAX_CCH,该宏在ntstrsafe.h中定义。另外,如果一个字符串需要被转换成UNICODE_STRING结构,则该字符串长度不能超过65535.

    三、内核模式安全字符串函数概述

        下表概述了可以在内核驱动中使用的安全字符串函数,并指明了它们用来何种类型的c/c++运行库函数。

    说明:

    函数名含有Cb的是以字节数为单位,含有Cch的是以字符数为单位。

    函数名

    作用

    取代

    RtlStringCbCat 
    RtlStringCbCatEx 
    RtlStringCchCat 
    RtlStringCchCatEx

    将源字符串连接到目的字符串的末尾

    strcat
    wcscat

    RtlStringCbCatN 
    RtlStringCbCatNEx 
    RtlStringCchCatN 
    RtlStringCchCatNEx

    将源字符串指定数目的字符连接到目的字符串的末尾

    strncat
    wcsncat

    RtlStringCbCopy 
    RtlStringCbCopyEx 
    RtlStringCchCopy 
    RtlStringCchCopyEx

    将源字符串拷贝到目的字符串

    strcpy
    wcscpy

    RtlStringCbCopyN 
    RtlStringCbCopyNEx 
    RtlStringCchCopyN 
    RtlStringCchCopyNEx

    将源字符串指定数目的字符拷贝到目的字符串

    strncpy
    wcsncpy

    RtlStringCbLength 
    RtlStringCchLength

    确定字符串的长度

    strlen
    wcslen

    RtlStringCbPrintf 
    RtlStringCbPrintfEx 
    RtlStringCchPrintf 
    RtlStringCchPrintfEx

    格式化输出

    sprintf
    swprintf
    _snprintf
    _snwprintf

    RtlStringCbVPrintf 
    RtlStringCbVPrintfEx 
    RtlStringCchVPrintf 
    RtlStringCchVPrintfEx

    可变格式化输出

    vsprintf
    vswprintf
    _vsnprintf
    _vsnwprintf

    各个函数的作用可以通过它所取代的c/c++函数可以大概看出,具体用法请查阅DDK帮助文档。

    http://www.cppblog.com/aurain/archive/2009/09/27/97363.html

    展开全文
    zhuhuibeishadiao 2016-04-02 21:06:09
  • string和basic_string的关系 C++

    string和basic_string的关系 &emsp写这篇博客的原因是在一个项目中看到str.find("abc") != std::string::npos这么一句代码,在印象中,find返回值不是这么复杂啊,就开始了查看MSDN之路,才发现string不是那么单纯...

    string和basic_string的关系

      写这篇博客的原因是在一个项目中看到str.find("abc") != std::string::npos这么一句代码,在印象中,find返回值不是这么复杂,如果没找到返回值是-1,直接和-1做判断就可以str.find("abc") != -1,之后就开始了查看MSDN之路,才发现string不是那么单纯。如果要把标准C++ string转换成C style string可以用成员函数basic_string::c_str()。c style string可以简单的理解为char类型数组以’\0’结尾,例如char *cStr = "cstr";或者char cStr1[] = "cstr";,char cStr1[5] = "cstr";\\由于c style string结尾有'\0'因此如果要明确数组大小的话,需要比字符串中字符个数多1。

    摘要

      简单来说basic_string是一个模版类,string是模版形参为char的basci_string模版类的类型定义,即typedef

    typedef basic_string<char, char_traits<char>, allocator<char> >
        string;

    而npos,是初始化为-1表示没有找到:

    static const size_type npos = -1;
    • basic_string

        basic_string是类模版,并且是容器类模版,basic_string类模版的对象管理的序列是标准的C++ 字符串,basic_string包括string、wstring、u16string和u32string)。标准C++ 字符串类是一个容器,因此可以像操作其他普通类型一样,对C++ string类进行操作,例如比较,迭代,STL算法等。
        basic_string的声明如下:

      template <clase CharType, class Traits = char_traits<CharType>, class Allocator = allocator<CharType>>

      实际在VS2013中,右键std::string转到定义处,再右键basic_string转到声明,会发现basic_string是在一个xstring文件中,不知道是什么文件,没有文件类型拓展名。xstring文件中basic_string的声明如下:

      template<class _Elem,
      class _Traits = char_traits<_Elem>,
      class _Ax = allocator<_Elem> >
      class basic_string;

      其中:
        CharType:表示存在字符串中的单个字符的数据类型,也就是字符串找那个单个元素的类型。类型定义string表示元素类型为char,类型定义wstring表示元素类型为wchar_t,类型定义u16string表示元素类型为char16_t,类型定义u32string表示元素类型为char32_t。
        Traits:trait也是一个类模版,这一部分应该是和STL封装相关的部门,还没有研究这么深入;默认是char_traits
        Allocator:同样是和STL相关的部分;默认是allocator

    • string
      string其实是形参为char的basic_string类模版的一个别名

      typedef basic_string<char, char_traits<char>, allocator<char> >
      string;

    参考连接:
    basic_string参考
    https://msdn.microsoft.com/en-us/library/syxtdd4f(v=vs.120).aspx
    string参考https://msdn.microsoft.com/en-us/library/y4k49tt9(v=vs.120).aspx


    这里只单纯的记下string和basic_string的区别,深究起来里面有很多东西,比如c style string和标准C++ string的区别,已经为什么微软要定义一个basic_string模版类,这里面都很有文章,由于展开比较大,暂不做研究。
    https://blog.codingnow.com/2013/09/cstring.html这个博客下面的评论比较有意思

    展开全文
    robot8me 2017-12-03 11:44:29
  • python pymysql转义方法escape_string使用说明及报错解决方法

    文章目录1. 按2. 说明2.1. 为什么要转义?2.2. 后期使用需要反转义吗? 1. 按 pymysql中有专门的转义方法,导入语法...注意:v1.0.0及以上请使用from pymysql.converters import escape_string,否则将抛出ImportError:

    1. 按

    pymysql中有专门的转义方法,导入语法如下:

    # v1.0.0及以上
    from pymysql.converters import escape_string
    
    # v0.10.1及以下
    from pymysql import escape_string
    

    注意:v1.0.0及以上请使用from pymysql.converters import escape_string,否则将抛出ImportError: cannot import name 'escape_string' from 'pymysql' (F:\Program Files\Python39\lib\site-packages\pymysql\__init__.py)
    异常,详情请查看:PyMySQL/blob/master/CHANGELOG.md#v100

    使用时只需要先将特定的字符串进行转义,然后再将转义后的字符串插入到数据库中即可,转义方法使用实例如下:

    s = r'D:\视频教程\大数据\【开课吧】廖雪峰 · 2019大数据分析\开课吧介绍'
    es = escape_string(s)
    

    2. 说明

    2.1. 为什么要转义?

    如果将含有特殊字符\的字符串直接插入到MySQL数据库中,则可能会出现\丢失或者其他问题。
    如直接插入r'D:\视频教程\大数据\【开课吧】廖雪峰 · 2019大数据分析\开课吧介绍',则在数据库中实际存储的是D:视频教程大数据【开课吧】廖雪峰 · 2019大数据分析开课吧介绍,而通过escape_string方法转义后再插入到数据库中,则实际存储的效果才是我们想要的。
    在这里插入图片描述

    2.2. 后期使用需要反转义吗?

    我们将转移后的字符串插入数据库后,再从数据库读取并保存到到Python的内存变量是不需要再进行反转义的,因为会帮我们自动进行反转义。

    如下图实际案例所示,从数据库中读取到的是元组,后面再使用该元组里的字符串进行某些操作(如打印操作)时会自动进行一次反转义操作,因此我们无需再额外进行反转义
    在这里插入图片描述

    关于Python中路径的字符串标准写法可以参考:Python将str转换为路径类型?中的测试案例,通过测试案例进行揣摩,毕竟实践是检验真理的唯一标准。

    展开全文
    COCO56 2020-07-18 16:29:14
  • undefined reference to 'std::basic_string 等出现一大串此类undefined referenct 的问题情况

    在使用gcc 遍历Linux 时候...undefined reference to std::basic_string<char, std::char_traits<char>, std::allocator<char> >::s ize() const' undefined reference tostd::basic_string<...
    zhouying8023 2020-04-23 10:25:19
  • C++报错解决:what(): basic_string::_S_construct null not valid

    terminate called after throwing an instance of 'std::... what(): basic_string::_S_construct null not valid 出现这个错误是因为用空指针初始化string,比如说: string str(NULL); string str2(nullptr); ...
    zhangpeterx 2019-08-13 21:27:27
  • error C2668: “std::to_string”: 对重载函数的调用不明确

    error C2668: “*****”: ...我遇上的是to_string函数出现这个问题,to_string就是用来把数字类型的变量装换为字符串类型,他在头文件中的重载函数有很多:随便选一个就可以,在参数前强制类型转换即可。 inline st...
    derbi123123 2020-04-27 11:44:54
  • undefined reference to cv::imread(std::__cxx11::basic_string C++

    /home/project/src/tasks.cpp:361: undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' 原因: 注意...
    qq_29695701 2019-04-11 16:32:43
  • 不能将参数 1 从“char”转换为“const std::basic_string<_Elem,_Traits,_Ax> &” 如何解决? c++

    string v; is_str>>k; is_str>>v; vec_1.push_back(v); map_1.insert(hash_map,vector<string>>::value_type(k,vec_1)); } int i, j; for (i = 0; i <vec_1.size() ; i++) { for(j = 0;j ...
    weixin_43552948 2019-05-04 00:43:31
  • 一箭双雕解决python3.5下type_string()不能输出中文字符和windows7下pyperclip.paste()不能 粘贴问题

    原来的基本思路是使用PyUserInput库(中的pykeyboard)向窗口发送中文字符,但是在调试过程发现PyKeyboard().type_string ("中文“)这样的语句根本不能发送成功,运行后光标处无中文字符出现。如果用英文,数字都可以...
    killvirus007 2019-04-24 17:04:34
  • 语法解析错误: syntax error, unexpected 'app' (T_STRING)

    那个userHouseModel文件有错误,我复制了代码内容,到userHouseModel1,然后把两个名字互换传上去就可以了
    html_css_js_php 2019-09-21 21:15:30
  • 编译报错:undefined reference to `std::__cxx11::basic_string c++编译环境

    此错产生原因为:c++11与旧的c++库函数实现存在差异,当本地的c++代码动态库为旧版本c++库所实现,而编译器g++5,gcc5将其解释为std::__cxx11,就会出现未定义...gcc -v,g++ -v 2、安装相应版本编译器 sudo apt-...
    qq_34113993 2019-11-25 20:43:45
  • -报错:ERROR ITMS-4236: "Invalid value 'v1.0.0' for bundle_short_version_string" at So

    ERROR ITMS-4236: "Invalid value 'v1.0.0' for bundle_short_version_string" at SoftwareAssets 解决方法: 我的Version设置为了v1.0.0,而正确的格式是:x.x.x,不能带前面的v,因此改为1.0.0就没有这个问题了
    lllkey 2016-12-23 11:10:49
  • 报错std::__1::basic_string, std::__1::char_traits, std::__1::allocator<char> >:: 报错

    报错提示入下:"std::__1::basic_string, std::__1::allocator >::at(unsigned long) const", referenced from: 如图: 解决方法:将工程里任一个.m的文件在后缀名修改为.mm文件即可解决 分析:我也是听说...
    chen_gp_x 2016-09-20 11:03:46
  • Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)

    nxg_string.c文件中包含了很多常用的字符串操作方法,具体我们就不讲解了,主要简单来看下Nginx的字符串数据结构 数据结构定义 ngx_str_t 字符串结构 /** * 字符串结构 */ typedef struct { size_t len; //字符...
    initphp 2016-02-17 18:50:12
  • error LNK2019: 无法解析的外部符号 "class std::vector<class std::basic_string,struct std::char_traits... vs2010

    error LNK2019: 无法解析的外部符号 "class std::vector,class std::allocator >,class std::allocator,class std::allocator > > > __cdecl Public_Func::... std::basic_string,class std::allocator >,class std
    xiao_lxl 2015-05-19 10:22:37
  • php 解析 xml simplexml_load_string()返回的是一个对象

     需要和一个合作方做个url验证。... 当时看文档的时候我心想这还不简单,直接file_get_contents($url)不就OK 了,但是真正做的时候才发现不是那么一回事,我把file_get_contents获取的结果v
    superhosts 2012-10-25 14:46:51
  • 无法解析的外部符号 "__int64 google::protobuf::internal::empty_string_once_init_ caffe protobuf

    error LNK2001: 无法解析的外部符号 "__int64 google::protobuf::internal::empty_string_once_init_" (?empty_string_once_init_@internal@protobuf@google@@3_JA) D:\VS_PROJECT\caffe\caffe\
    Quincuntial 2016-01-27 12:00:52
  • "std::__1::basic_string, std::__1::char_traits, std::__1::allocator<char> >::__init(char 芝麻信用

    这是我在接入芝麻信用的时候碰到的问题  Undefined symbols for ... "std::__1::basic_string, std::__1::allocator >::__init(char const*, unsigned long)", referenced from:  CAliSecXURL::enc
    asuno_1 2016-07-04 00:52:58
  • syntax error, unexpected ''&expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NU

    : syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in  D:\xampp\htdocs\empmanage\emp.php  on line  20
    jaray 2013-02-18 17:02:54
  • ROS服务中存在string类型变量,如何给string类型变量赋值及取值 ROS 服务

    string name --- string rename 我们这个服务目的为,客户端向服务端发送name字节,然后服务端回复客户端rename字节。 先来看一下服务端的代码: std::stringstream ss; ss << "hello"; res.rename = ss....
    qq_25105061 2019-08-31 21:47:12
  • 执行_search时报错

    ES版本:7.3.2 1.在学习Elasticsearch的_search命令时报错,返回信息如下: { "error": { "root_cause": [ { "type": "parsing_exception", "reason": "Unknown key for a V...
    zhoubingzb 2020-02-06 19:29:54
  • terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

    terminate called after throwing an instance of 'std::out_of_range'what(): basic_string::substr:__pos Aborted (core dumped) 内存读取越界。 解释1:for example:const std::string sTest( "test" );sTest...
    weixin_33941350 2018-07-22 13:05:00
  • std::string::substr std string substr

    std::string::substr Defined in header <string> - 定义于头文件 <string>...primitive [ˈprɪmətɪv]:adj. 原始的,远古的,简单的,粗糙的 n. 原始人 simultaneously [ˌsɪmlˈteɪniə
    chengyq116 2020-02-25 21:04:47
  • C++/C++11中std::string用法

    C++/C++11中std::string使用汇总 #include "string.hpp" #include <string> #include <iostream> #include <cctype> #include <cstddef> // std::size_t #include <fstream> /* ...
    leixihua 2019-07-13 18:19:42
  • Glib学习(5) 字符串 Strings glib GString

    学过面向对象语言的同学一定都知道String类,一定知道这个类对字符串的操作是多麽的方便,但是c语言中是没有这个类,甚至没有类的概念,但是glib帮我们做的这个“类” GString 除了使用gchar *进行字符串处理以
    andylauren 2016-05-14 16:45:16
  • error LNK2005: "public: __thiscall std::basic_string……already defined in…… string properties struct class

    msvcprtd.lib(MSVCP80D.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (?...$char_traits@D@std@@V?$alloc
    Jaogoy 2007-05-23 23:01:00
  • 关于std::string出现在_M_dispose发生SIGABRT错误的问题

    因此,该错误的直接原因在于,本程序的std::string在释放时,通过字符串位置计算字符串头部数据(一个共享的string data区域)时,把头部数据的大小搞错了。 再次注意:这肯定不是std::string的bug。你可以看到,in...
    superarhow 2014-06-11 16:17:05
  • C++/C++11中std::string用法汇总

    C++/C++11中std::string用法汇总
    fengbingchun 2017-03-16 10:00:34
  • 使用STRINGN_TO_NPVARIANT和STRINGZ_TO_NPVARIANT 注意的事项 插件 NPAPI utf8 浏览器

    Initialize v to a variant of type NPVariantType_String with the value being an NPString holding the UTF-8 string value val. STRINGN_TO_NPVARIANT() Initialize v to a varia
    skylin19840101 2014-09-24 12:51:14
  • 空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 1,342,050
    精华内容 536,820
    热门标签
    关键字:

    v_string