将字符串解析为 LPCWSTR

Posted

技术标签:

【中文标题】将字符串解析为 LPCWSTR【英文标题】:Parse string to LPCWSTR 【发布时间】:2014-01-04 23:22:55 【问题描述】:

我正在使用 boost-filesystem 来搜索具体路径中的所有文件。 我还想检索此文件的创建数据、上次打开和上次更新,以便在 Windows 中工作时我需要使用 GetFileTime(这需要 HANDLE,我将通过 CreateFile 函数获取。

关键是通过提升文件系统我得到一个字符串,例如

字符串文件名="C:\Users\MyUser\Desktop\PDN.pdf";

我需要将此字符串转换为 LPCWSTR。

因此我做了几次尝试都失败了,例如:

HANDLE hFile = CreateFile((LPCWSTR)fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

但是当这样做时,它成功了:

HANDLE hFile = CreateFile(L"C:\\Users\\MyUSer\\Desktop\\PDN.pdf", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

所以我的问题是,如何使用字符串变量将字符串解析为 PWSTR? 如果可能的话(我猜不是),是否有任何函数可以改变原始路径,在其中找到另一个斜线的斜线?

非常感谢

已编辑: 这是我在这里阅读后所做的方式:

wstring 文件FullPathWstring = winAPII.stringToWstring(iter->path().string());

HANDLE hFile = CreateFile(fileFullPathWstring.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

使用函数:

wstring WinAPIIteraction::stringToWstring(string stringName)
    int len;
    int slength = (int)stringName.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, stringName.c_str(), slength, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, stringName.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;

【问题讨论】:

string 更可能是 LPCSTRwstringLPCWSTR - 这是 UNICODE 和 ANSI 的混合。最好保持一致。 你为什么不使用 wchar_t* fileName = "C:\\Users\\MyUSer\\Desktop\\PDN.pdf" ? 【参考方案1】:

您可以使用MultibyteToWideChar() 函数来执行实际的转换(MSDN page)。无需添加斜杠 - 它们只是转义序列,在您的程序代码中表示单个 '\'

【讨论】:

非常感谢,我用过这种方式,效果很好:)【参考方案2】:

最简单的解决方案:

wstring filename="C:\Users\MyUser\Desktop\PDN.pdf";
HANDLE hFile = CreateFile(
    fileName.c_str(), // std::wstring::c_str returns wchar_t*
    GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

【讨论】:

非常感谢!它有效,但最后我使用了其他方法。但是效果真的很好:)【参考方案3】:

为此使用来自 ATL 的 CA2W:

string filename="C:\Users\MyUser\Desktop\PDN.pdf";
HANDLE hFile = CreateFile(CA2W(fileName.c_str()), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

【讨论】:

【参考方案4】:

我知道已经很晚了,但这是我用来将字符串转换为 LPCWSTR 的方法:

typedef long long long64;
/**Don´t forget to use delete*/
LPCWSTR convStringToLPCWSTR(string String)

    char *cString = &String[0u];
    long64 size = strlen(cString);
    wchar_t* wString = new wchar_t[size];
    for (long64 i = 0; i < size; i++)
    
        wString[i] = cString[i];
    
    wString[size] = 0; //important, otherwise Windows will print whatever next in memmory until it finds a zero.
    return wString;

【讨论】:

返回一些必须删除的东西 = 不好的做法。

以上是关于将字符串解析为 LPCWSTR的主要内容,如果未能解决你的问题,请参考以下文章

LPCWSTR 和char数组的转换

怎么转化为LPCWSTR

不能从const char *转换为LPCWSTR

Win32程序:与"LPCWSTR"类型的形参不兼容

从 C++ 传递函数指针以由 C# 调用 - 函数参数包括宽字符字符串 (LPCWSTR)

char*转LPCWSTR解决方案(转)