Объединить два массива WCHAR_T в переполнении стека

Работа с этими безумными строками и массивами вызывает у меня головную боль …

Вот мой код до сих пор

wchar_t mypath[MAX_PATH];
wchar_t temppath[MAX_PATH];

GetModuleFileName(0, mypath, MAX_PATH);
GetTempPath(MAX_PATH, temppath);
CreateDirectory(???, NULL);

Первые две функции Windows API используют переменную LPWSTR. Третий использует LPCWSTR. В чем главное отличие? Получив путь к каталогу TEMP, я хочу создать внутри него новый каталог с именем «test». Это означает, что мне нужно добавить (L «test») к моей переменной «temppath». Может кто-нибудь дать мне несколько советов о том, как использовать эти массивы. Это то, что делает C ++ болью. Почему не все могут просто остановиться на одном типе данных для строк. Чем полезен wchar_t? Это так сложно использовать и манипулировать.

Спасибо, парни!

1

Решение

использование PathCombine(), например:

wchar_t temppath[MAX_PATH+1] = {0};
GetTempPath(MAX_PATH, temppath);

wchar_t mypath[MAX_PATH+8] = {0};
PathCombineW(mypath, temppath, L"test");

CreateDirectoryW(mypath, NULL);
4

Другие решения

Первые две функции Windows API используют переменную LPWSTR. Третий использует LPCWSTR. В чем главное отличие?

LPCWSTR это const версия LPWSTR:

  • От LPCWSTR:

    typedef const wchar_t* LPCWSTR;
    
  • От LPWSTR:

    typedef wchar_t* LPWSTR, *PWSTR;
    

Я хочу создать новый каталог внутри него под названием «тест». Это означает, что мне нужно добавить (L «test») к моей переменной «temppath».

Использовать std::wostringstream:

std::wostringstream wos;
wos << temppath  << L"\\test";
std::wstring fullpath(wos.str());

или просто std::wstring (как предложено Крисом в комментариях):

std::wstring fullpath(std::wstring(temppath) + L"\\test");

произвести каскадную версию. Тогда используйте c_str() в качестве аргумента CreateDirectory():

if (CreateDirectory(fullpath.c_str(), NULL) ||
ERROR_ALREADY_EXISTS == GetLastError())
{
// Directory created or already existed.
}
else
{
// Failed to create directory.
}
5

По вопросам рекламы [email protected]