std :: строка разговора с PCWSTR - PullRequest
0 голосов
/ 06 февраля 2020

Я получаю информацию от пользователя и сохраняю ее в переменных std :: string следующим образом:

std::string username;
std::string domain;
std::string hash_ntlm;
std::string process_name;

std::cout << "\n\tUsername: ";
std::getline(std::cin, username);
std::cout << "\tDomain: ";
std::getline(std::cin, domain);
std::cout << "\tNTLM Hash: ";
std::getline(std::cin, hash_ntlm);
std::cout << "\tProcess: ";
std::getline(std::cin, process_name);
std::cout << "\n";

К сожалению, мне приходится работать с функциями, которые получают аргументы с типом данных PCWSTR, как показано ниже:

bool Function(ProcessCreateType arg_type, PCWSTR arg_command_Line, DWORD arg_process_flags, HANDLE arg_user_token, DWORD arg_logon_flags,  PCWSTR arg_user, PCWSTR arg_domain, PCWSTR arg_password, PPROCESS_INFORMATION arg_process_infos, BOOL arg_auto_close_handle)

Но когда я переопределяю переменные с типом данных PCWSTR, я не могу получить их с помощью std :: getline (std :: cin, domain); или я не могу передать им переменную std :: string, даже вызвав метод c_str (). Как я должен исправить эту проблему работы с PCWSTR и std :: string.

1 Ответ

0 голосов
/ 06 февраля 2020

Я так понимаю, вы читаете файл ansi / utf8. Так что с:

inline std::wstring to_wide(const char* ps) { return std::wstring(boost::locale::conv::utf_to_utf<wchar_t>(ps)); }
inline std::wstring to_wide(const std::string& str) { return to_wide(str.c_str()); }
inline std::string to_narrow(const CString& str) { return std::string(boost::locale::conv::utf_to_utf<char>((LPCTSTR)str)); }
inline std::string to_narrow(const wchar_t* ps) { return std::string(boost::locale::conv::utf_to_utf<char>(ps)); }
inline std::string to_narrow(const std::wstring& str) { return to_narrow(str.c_str()); }

Вы можете конвертировать между многобайтовым и юникодом. У меня есть xml и другие файлы ansi / utf8, которые необходимо представить как LPCTSTR и тому подобное.

cCtrl.SetWindowText(to_wide(a_std_string).c_ctr());

Это означает компиляцию с boost. Есть много других способов. Но я считаю это самым простым.

ОБНОВЛЕНИЕ:

После Ссылка Виктора . Похоже, с помощью C ++ 11 вы можете использовать стандартную библиотеку lib. В тот день это было повышение. Но я бы go по тому же принципу и создал бы линейные лайнеры, как я сделал с boost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...