Вопрос

Я использую библиотеку и отправляю мне std::wstring от одной из его функций, а другая библиотека, которая требует _TCHAR [] быть отправленным на это. Как я могу это преобразовать?

Это было полезно?

Решение

Предполагая, что вы используете сборку Unicode, STD :: WSTRING.C_STR () - это то, что вам нужно. Обратите внимание, что C_STR () гарантирует, что строка, которую она возвращается, является NULL-LANCHING.

например

void func(const wchar_t str[])
{
}

std::wstring src;
func(src.c_str());

Если вы используете BoneCode Unicode, вам нужно будет преобразовать строку Unicode в строку безкодных Unicode через WideChartoMultibyte..

Другие советы

В виде @Zach пила сказал, если вы строите только для Unicode, вы можете уйти с std::wstring.c_str(), но консультично было бы лучше определить tstring (а » typedef за std::basic_string<TCHAR>) Итак, вы можете безопасно использовать этот вид строки безупречно со всеми функциями Windows и библиотеки, которые ожидают TCHARс1.

Для дополнительного удовольствия вы должны определить также все другие объекты, связанные с String C ++ для TCHARS и создание функций преобразования std::string/std::wstring <=> tstring.

К счастью, эта работа уже сделана; видеть здесь и здесь.


  1. На самом деле никакая компилирующая функция библиотеки не может ожидать TCHAR *, поскольку TCHARS решается как charили wchar_tS в компиляционное время, но у вас есть идея.

Использовать Макросы конвертации строки ATL и MFC. Отказ Это работает независимо от того, собираете ли вы в _UNICODE или режим ANSI.

Вы можете использовать эти макросы, даже если вы не используете MFC. Просто включайте два заголовки ATL, показанные в этом примере:

#include <string>

#include <Windows.h>

#include <AtlBase.h>
#include <AtlConv.h>

int main()
{
    std::wstring myString = L"Hello, World!";

    // Here is an ATL string conversion macro:
    CW2T pszT(myString.c_str());

    // pszT is now an object which can be used anywhere a `const TCHAR*`
    // is required. For example:
    ::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);

    return 0;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top