【问题标题】:Converting 'const char*' to 'LPCTSTR' for CreateDirectory将 CreateDirectory 的 'const char*' 转换为 'LPCTSTR'
【发布时间】:2013-01-17 01:49:05
【问题描述】:
#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. 下一步是将今天的日期设置为字符串或字符,并将其与文件路径连接起来。这会改变我执行第 1 步的方式吗?
  3. 我不擅长数据类型和转换,对 5 岁的孩子有什么好的解释吗?

【问题讨论】:

  • 我不想把这个告诉你,但 C++ 并不适合 5 岁的孩子。 :(
  • API 编程也不是。

标签: c++ c2664


【解决方案1】:

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

CreateDirectory()TCHAR* 作为输入。如果定义了UNICODE,则TCHAR 映射到wchar_t,否则它映射到char。如果您需要坚持使用std::string,但又不想让您的代码UNICODE-aware,那么请改用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-aware,您可以这样做:

#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;
}

【讨论】:

  • 你的最后一个例子有效。这会导致更多的问题。什么是 wstring? “L”有什么作用? CreateDirectoryW() 是另一种可用方法还是对现有方法的修改?
  • 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】:

如果您不构建 Unicode 可执行文件,则在 std::string 上调用 c_str() 将生成一个 const char*(也称为非 Unicode LPCTSTR),您可以将其传递给 CreateDirectory()。

代码如下所示:

CreateDirectory(FilePath.c_str(), NULL):

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

如果您必须追加到FilePath,我建议您继续使用std::string 或使用Microsoft 的CString 来进行字符串操作,因为这比使用C 方式和处理原始字符* 更容易.我个人会使用std::string,除非您已经在使用 CString 的 MFC 应用程序中。

【讨论】:

  • 这给了我和以前一样的错误:指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast
  • 这意味着您正在为 Unicode 编译,这意味着 CreateDirectory() 正在映射到 CreateDirectoryW(),它以 wchar_t* 作为输入。您不能将std::string 数据传递给CreateDirectoryW(),它们不兼容。您必须改用std::wstring,使用MultiByteToWideChar()std::string 数据转换为wchar_t*,或者改用CreateDirectoryA()
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多