关于C#:拥有PCWSTR并需要将其作为WCHAR []

Have a PCWSTR and need it to be a WCHAR[]

我正在从我下载的某些代码中重写C方法。该方法最初将PCWSTR作为参数,然后提示用户输入文件名。我修改了该方法以采用两个参数(均为PCWSTR),而不提示用户。我已经在其他地方生成了文件列表。我正在尝试使用迭代文件列表的方法中的两个参数调用新的(修改的)方法。

原始方法使用StringCBGetsW命令提示用户输入。像这样...

1
2
3
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是同一事物的两个不同名称:它们基本上是const wchar_t*typedef

LPCWSTR中的初始L是一些旧前缀,用以下P读取,表示"长指针"。我从来没有在16位时代(从Windows 95和Win32开始)对Windows进行编程,但是我的理解是在16位Windows中,存在诸如近指针,远指针或长指针之类的东西。现在我们只有一种类型的指针,因此可以省略L前缀。

P代表" pointer "。
C代表" constant "。
W代表WCHAR / wchar_t,最后但并非最不重要的是,STR部分代表" string "。

因此,解码这种"匈牙利符号",PCWSTR表示const wchar_t*
基本上,它是指向以NUL终止的只读wchar_t Unicode UTF-16字符串的指针。

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

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

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

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

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