将 CreateDirectory 的“const char*”转换为“LPCTSTR”

Pro*_*OXO 5 c++ c2664

#include "stdafx.h"
#include <string>
#include <windows.h>
using namespace std;

int main()
{
    string FilePath = "C:\\Documents and Settings\\whatever";
    CreateDirectory(FilePath, NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:错误 C2664:“CreateDirectory”:无法将参数 1 从“const char *”转换为“LPCTSTR”

  1. 我如何进行这种转换?
  2. 下一步是将今天的日期设置为字符串或字符并将其与文件路径连接起来。这会改变我执行第 1 步的方式吗?
  3. 我对数据类型和转换很糟糕,对于 5 岁的孩子有好的解释吗?

Rem*_*eau 5

std::string是一个保存基于数据的类char。要将std::string数据传递给 API 函数,您必须使用其c_str()方法来获取char*指向字符串实际数据的指针。

CreateDirectory()以 aTCHAR*作为输入。如果UNICODE已定义,TCHAR则映射到wchar_t,否则映射到char。如果您需要坚持std::string但不想让您的代码UNICODE感知,请改用CreateDirectoryA(),例如:

#include "stdafx.h"
#include <string>
#include <windows.h>

int main()
{
    std::string FilePath = "C:\\Documents and Settings\\whatever";
    CreateDirectoryA(FilePath.c_str(), NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

要使此代码TCHAR具有感知能力,您可以这样做:

#include "stdafx.h"
#include <string>
#include <windows.h>

int main()
{
    std::basic_string<TCHAR> FilePath = TEXT("C:\\Documents and Settings\\whatever");
    CreateDirectory(FilePath.c_str(), NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,基于 Ansi 的操作系统版本早已消亡,现在一切都是 Unicode。 TCHAR不应再在新代码中使用:

#include "stdafx.h"
#include <string>
#include <windows.h>

int main()
{
    std::wstring FilePath = L"C:\\Documents and Settings\\whatever";
    CreateDirectoryW(FilePath.c_str(), NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • `std::string` 保存基于 `char` 的字符串。`std::wstring` 保存基于 `wchar_t` 的字符串。两者都是“std::basic_string”的特化。“L”告诉编译器以宽(“wchar_t”)格式而不是窄(“char”)格式存储文字。给自己找一本好的 C++ 书,它涵盖了这些内容。至于“CreateDirectory()”,它实际上是一个预编译器宏,如果定义了“UNICODE”,则映射到“CreateDirectoryW()”,否则映射到“CreateDirectoryA()”。请参阅“winbase.h”中的声明。大多数处理字符串数据的 Win32 API 函数都有可用的 A/W 版本。 (2认同)