我正在从下载的一些代码中重写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 ...我知道有更简单的方法可以在文件中移动和复制,这是我尝试使用程序进行此操作的原因。

最佳答案

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

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

PCWSTRLPCWSTR是同一事物的两个不同名称:它们基本上是typedefconst 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_t Unicode UTF-16字符串的指针。

这些信息足以解决您的问题吗?

如果您有一个wchar_t字符串缓冲区,并且需要一个PCWSTR函数,则只需将缓冲区的名称(对应其第一个字符的地址)传递给该函数:

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


有时-通常用于输出字符串参数-您可能还需要指定目标字符串缓冲区的大小(即“容量”)。
如果使用字符计数来表示此大小(在本例中为wchar_t s),则通常的Win32匈牙利表示法为cch(“字符数”);否则,如果要以字节表示大小,则通常的前缀为cb(“字节数”)。
因此,如果您具有StringCchCopy()之类的功能,那么从Cch部分您知道大小以字符(wchar_t s)表示。

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

09-27 08:23