将'const char*'转换为 CreateDirectory 的'LPCTSTR'

Converting 'const char*' to 'LPCTSTR' for CreateDirectory

本文关键字:CreateDirectory LPCTSTR char const 转换      更新时间:2023-10-16
#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;
}

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

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

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

CreateDirectory()接受TCHAR*作为输入。如果定义了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;
}

要使代码支持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;
}

然而,基于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;
}

如果您不构建Unicode可执行文件,在std::string上调用c_str()将导致const char*(又称非Unicode LPCTSTR),您可以将其传递给CreateDirectory()。

代码应该是这样的:

CreateDirectory(FilePath.c_str(), NULL):

请注意,如果你试图构建一个Unicode可执行文件,这将导致编译错误。

如果你必须添加到FilePath,我建议你要么继续使用std::string,要么使用微软的CString来做字符串操作,因为这比用C的方式和处理原始char*要少一些痛苦。我个人会使用std::string,除非你已经在使用CString的MFC应用程序。