0

我正在从我下载的一些代码中重写一个 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));

wchar fname被传递给更远的另一个迭代方法。当我查看该方法时,它说它是LPCWSTR类型;我假设它可以改为使用WCHAR

但它不能做的是拿方法得到的PCWSTR。我的最终目标是尽量不提示用户输入文件名,而是使用之前在另一种方法中迭代的文件名。

tl;博士。我有一个 PCWSTR,它需要转换为 WCHAR。我不知道 WCHAR [] 是什么或如何用它做任何事情。包括尝试做一个printf来看看它是什么。

PS ...我知道有更简单的方法可以移动和复制文件,我尝试使用程序来完成这项工作是有原因的。

4

1 回答 1

9

首先,让我们尝试对某些Windows 特定类型进行一些澄清。

WCHARwchar_t.
在带有 Microsoft Visual C++ 的 Windows 上,它是16 位字符类型(可用于 Unicode UTF-16 字符串)。

PCWSTRandLPCWSTR是同一事物的两个不同名称:它们基本上typedef是 s 代表const wchar_t*.

首字母LinLPCWSTR是一些遗留前缀,与以下内容一起阅读P,代表“长指针”。我从未在 16 位时代编写过 Windows(我从 Windows 95 和 Win32 开始),但我的理解是,在 16 位 Windows 中,有类似near 指针far 或 long 指针之类的东西。现在我们只有一种类型的指针,所以L前缀可以省略。

P代表“指针”。代表
常数”。代表/ ,最后但并非最不重要的是,该 部分代表"string"C
WWCHARwchar_tSTR

所以,解码这种“匈牙利符号”,PCWSTR意味着const wchar_t*
基本上,它是一个指向只读NUL终止wchar_t的 Unicode UTF-16 字符串的指针。

这些信息是否足以让您解决问题?

如果您有一个wchar_t字符串缓冲区和一个需要 a 的函数PCWSTR,您可以将缓冲区的名称(对应于其第一个字符的地址)传递给函数:

WCHAR buffer[100];
DoSomething(buffer, ...);  // DoSomething(PCWSTR ....)

有时——通常用于输出字符串参数——您可能还想指定目标字符串缓冲区的大小(即“容量”)。
如果这个大小用字符数表示(在这种情况下,以wchar_ts 为单位),通常的 Win32 匈牙利表示法是cch“字符数”);否则,如果您想要以字节表示的大小,那么通常的前缀是cb( "count of bytes" )。
所以,如果你有一个类似的函数StringCchCopy(),那么从Cch你知道的部分,大小用字符(wchar_ts)表示。

请注意,您可以使用s_countof()来获取缓冲区的大小wchar_t
例如,在上面的代码片段中,_countof(buffer) == 100, 因为buffer是 100wchar_t秒;相反,sizeof(buffer) == 200因为每个wchar_t都是 2 字节 == 16 位大小,所以以字节为单位的总缓冲区大小是100 [wchar_t] * 2 [bytes/wchar_t] = 200 [bytes]

于 2014-09-26T17:25:09.997 回答