Преобразование 'const char*' в 'LPCTSTR' для CreateDirectory

#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. Я ужасен в типах данных и преобразованиях, есть ли хорошее объяснение для пятилетних детей?

2 ответа

Решение

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, вызов c_str() на std::string приведет к const char* (известный как не Unicode LPCTSTR), который вы можете передать CreateDirectory().

Код будет выглядеть так:

CreateDirectory(FilePath.c_str(), NULL):

Обратите внимание, что это приведет к ошибке компиляции, если вы попытаетесь создать исполняемый файл Unicode.

Если вам нужно добавить к FilePath Я бы порекомендовал вам либо продолжать использовать std::string или использовать Microsoft CString делать манипуляции со строками, так как это менее болезненно, чем делать это способом C и манипулировать необработанным символом *. Лично я бы использовал std::string если вы уже не в приложении MFC, которое использует CString.

Другие вопросы по тегам