【问题标题】:How to concatenate char* and LPWSTR string?如何连接 char* 和 LPWSTR 字符串?
【发布时间】:2014-12-25 09:13:43
【问题描述】:

我想使用 MoveFile 函数,这个函数使用两个 LPWSTR 参数,但我有一个 char* 和 LWSTR,如何连接它们?

//move file
    LPWSTR latestFile = L"test.SPL";
    char*  spoolFolder = "C:\\Windows\\System32\\spool\PRINTERS\\";
    LPWSTR fileToMove = spoolFolder + latestFile;
    BOOL moved = MoveFile(latestFile, L"C:\\UnprocessedFiles\\" + latestFile);

【问题讨论】:

  • 除此之外,还有一个更根本的问题:您不能依赖 spool 文件夹始终位于该位置 - 对于初学者来说,Windows 目录可能位于另一个驱动器上。

标签: c++ windows string-concatenation lpwstr


【解决方案1】:

为了澄清,LPWSTR 是wchar_t* 的类型定义。您可以使用wcscat_s 连接这种形式的字符串。您的一个 char* 字符串应该只是更改为相同类型,因为您将它作为一个简单的文字(只需在文字前面加上 L 并更改声明的类型)。但是,由于您将其标记为 C++,因此您可以使用 std::wstring 类更简单地完成所有这些操作。

【讨论】:

    【解决方案2】:
    std::wstring latestFile = wstring("test.SPL");
    std::wstring spoolFolder = wstring("C:\\Windows\\System32\\spool\PRINTERS\\");
    std::wstring fileToMove = spoolFolder + latestFile; 
    BOOL moved = MoveFile(latestFile.c_str(), fileToMove.c_str());
    

    实际上,LPWSTR 只是 w_char* 的 typdef。因此,如果您咨询 MSDN,您会看到:

    typded wchar_t* LPWSTR;
    

    这里的 w_char* 意味着您的字符串将被编码为 UNICODE 而不是 ANSI 方案。所以在 Windows 下,一个 UNICODE 字符串将是一个 UTF16 字符串(每个字符 2 个字节)。

    std::wstring 也是 std::basic_string<wchar_t,char_traits<>> 的 typedef,因此通过将输入声明为 wstring 并调用wasting.c_str() 就可以了。

    【讨论】:

    • 最好解释一下为什么这些代码行解决了 OP 问题。
    • std::wstring("test.SPL") 不起作用。事实上,标准库中不存在该构造函数。也许您想使用std::wstring(std::begin(myStr), std::end(myStr));,或者更简单地说,只是在字符串文字前面放一个L。此外,您对 std 前缀的使用不一致,并且您忘记在第二个字符串中转义反斜杠。也许提一下使用原始字符串来避免最后一个问题会很有用。
    • 对于 Windows 来说 UTF16 应该是 UTF-16LE 吗?
    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多