Как связать из std :: wstring _tchar []?
-
09-10-2019 - |
Вопрос
Я использую библиотеку и отправляю мне 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 ++ для TCHAR
S и создание функций преобразования std::string
/std::wstring
<=> tstring
.
К счастью, эта работа уже сделана; видеть здесь и здесь.
- На самом деле никакая компилирующая функция библиотеки не может ожидать
TCHAR *
, посколькуTCHAR
S решается какchar
илиwchar_t
S в компиляционное время, но у вас есть идея.
Использовать Макросы конвертации строки 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;
}