Массив С++ TCHAR для wstring не работает в VS2010

Я хотел бы преобразовать массив TCHAR в wstring.

    TCHAR szFileName[MAX_PATH+1];
#ifdef _DEBUG
    std::string str="m:\\compiled\\data.dat";
    TCHAR *param=new TCHAR[str.size()+1];
    szFileName[str.size()]=0;
    std::copy(str.begin(),str.end(),szFileName);
#else
    //Retrieve the path to the data.dat in the same dir as our data.dll is located
    GetModuleFileName(_Module.m_hInst, szFileName, MAX_PATH+1);
    StrCpy(PathFindFileName(szFileName), _T("data.dat"));
#endif  

wstring sPath(T2W(szFileName));

Мне нужно передать szFileName функции, которая ожидает

const WCHAR *

Для полноты я указываю пустоту, которую мне нужно передать szFileName:

HRESULT CEngObj::MapFile( const WCHAR * pszTokenVal,  // Value that contains file path
                        HANDLE * phMapping,          // Pointer to file mapping handle
                        void ** ppvData )            // Pointer to the data

Однако T2W у меня не работает. Компилятор говорит that "_lpa" is not defined, и я не знаю, что делать дальше. Я пробовал другие методы преобразования, которые нашел в сети, но они тоже не сработали.


person tmighty    schedule 03.04.2013    source источник
comment
Основное правило при использовании TCHAR заключается в том, что всегда используйте функции tchar и подобные подпрограммы. std::copy не совсем правильный способ преобразования между TCHAR и std::string. Один из самых простых способов выразить LPCTSTR szFileName = _T("m:\\compiled\\data.dat"); Вам не нужен этот сложный код копирования. Если хотите вариант unicode LPCWSTR szFileName = L"m:\\compiled\\data.dat";   -  person sarat    schedule 04.04.2013


Ответы (2)


Есть такие функции

mbstowcs_s()

которые конвертируют из char* в wchar_t*.

#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

char *orig = "Hello, World!";
cout << orig << " (char *)" << endl;

// Convert to a wchar_t*
size_t origsize = strlen(orig) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
wcscat_s(wcstring, L" (wchar_t *)");
wcout << wcstring << endl;

Найдите здесь статью. и здесь для MSDN.

person bash.d    schedule 03.04.2013
comment
TCHAR определяется автоматически системными заголовочными файлами. Нет необходимости делать это самостоятельно. - person Some programmer dude; 03.04.2013
comment
@JoachimPileborg не знаю, где я это прочитал, но там это казалось жизненно важным - person bash.d; 03.04.2013
comment
Я где-то нашел решение: USES_CONVERSION; Кто-нибудь может сказать мне, что это делает? - person tmighty; 03.04.2013
comment
Это макрос. - person bash.d; 03.04.2013

Определение TCHAR различается в зависимости от того, определены определенные макросы препроцессора или нет. См., например. эту статью для возможных комбинаций.

Это означает, что TCHAR уже может быть wchar_t.

Вы можете использовать макрос _UNICODE, чтобы проверить, нужно ли вам преобразовать строку. Если вы это сделаете, вы можете использовать mbstowcs для преобразования:

std::wstring str;

#ifdef _UNICODE
    // No need to convert the string
    str = your_tchar_string;
#else
    // Need to convert the string
    // First get the length needed
    int length = mbstowcs(nullptr, your_tchar_string, 0);

    // Allocate a temporary string
    wchar_t* tmpstr = new wchar_t[length + 1];

    // Do the actual conversion
    mbstowcs(tmpstr, your_tchar_str, length + 1);

    str = tmpstr;

    // Free the temporary string
    delete[] tmpstr;
#endif
person Some programmer dude    schedule 03.04.2013