Nic*_*k O 0 c++ string winapi wchar-t lpcwstr
我正在从我下载的一些代码中重写一个C++方法.该方法最初将PCWSTR作为参数,然后提示用户输入文件名.我修改了方法以获取两个参数(均为PCWSTR)而不是提示用户.我已经在其他地方生成了文件列表.我试图用我的迭代文件列表的方法中的两个参数调用我的新(修改)方法.
原始方法使用StringCBGetsW命令提示用户输入.像这样...
HRESULT tst=S_OK; //these are at the top of the method
WCHAR fname[85] = {0}; //these are at the top of the method
tst = StringCbGetsW(fname,sizeof(fname));
Run Code Online (Sandbox Code Playgroud)
wchar fname被传递给另一个迭代方法.当我看到那个方法时,它说它是LPCWSTR类型; 我假设它可以取代WCHAR.
但它不能做的就是采用该方法获得的PCWSTR.我的最终目标是尝试不提示用户输入文件名,而是取代之前在另一种方法中迭代的文件名.
TL;博士.我有一个PCWSTR,它需要转换为WCHAR.我不知道WCHAR []是什么或如何用它做什么.包括尝试做printf以查看它是什么.
PS ...我知道有更简单的方法来移动和复制文件,有一个原因我试图使用程序来完成这项工作.
首先,让我们尝试清楚一些Windows特定类型.
WCHAR是一个typedef wchar_t.
在使用Microsoft Visual C++的Windows上,它是一个16位字符类型(可用于Unicode UTF-16字符串).
PCWSTR并且LPCWSTR是同一件事的两个不同的名字:它们基本上typedef是为了const wchar_t*.
初始L输入LPCWSTR是一些遗留前缀,用以下内容读取P,代表"长指针".我从来没有在16位时代编写Windows(我从Windows 95和Win32开始),但我的理解是在16位Windows中有一些像近指针和远点指针.现在我们只有一种类型的指针,因此L可以省略前缀.
该P代表"指针".
该C代表"不变".
该W代表WCHAR/ wchar_t,以及最后但并非最不重要的,STR部分代表"字符串".
因此,解码这种"匈牙利表示法" PCWSTR意味着const wchar_t*.
基本上,它是指向只读NUL终止的wchar_tUnicode UTF-16字符串的指针.
这些信息足以让您解决问题吗?
如果你有一个wchar_t字符串缓冲区和一个需要a的函数PCWSTR,你可以只将缓冲区的名称(对应第一个字符的地址)传递给函数:
WCHAR buffer[100];
DoSomething(buffer, ...); // DoSomething(PCWSTR ....)
Run Code Online (Sandbox Code Playgroud)
有时 - 通常用于输出字符串参数 - 您可能还需要指定目标字符串缓冲区的大小(即"容量").
如果使用字符计数(在本例中为wchar_ts)表示此大小,则通常的Win32匈牙利表示法是cch("字符数"); 否则,如果你想要以字节表示的大小,那么通常的前缀是cb("字节数").
因此,如果您有类似的功能StringCchCopy(),那么从Cch您知道的部分大小以字符表示wchar_t.
请注意,您可以使用s _countof()来获取缓冲区的大小wchar_t.
例如,在上面的代码片段中_countof(buffer) == 100,由于buffer是100 wchar_t秒; 相反,sizeof(buffer) == 200由于每个wchar_t字节大小为2个字节== 16位,因此总缓冲区大小以字节为单位100 [wchar_t] * 2 [bytes/wchar_t] = 200 [bytes].