Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2015, 13:57   #1
N1ka
Новичок
Джуниор
 
Регистрация: 24.11.2015
Сообщений: 4
Радость Конвертация wstring-строки

C++, VS2015, win32, unicode

Имеется ветор строк:

Код:
 std::vector<std::wstring> v;
При данной конвертации..

Код:
(LPTSTR) ( getVectorElement(Index).c_str() );
..указывает на следующую строку в "библиотечном" файле xstring

Код:
const value_type *_Myptr() const
{ // determine current pointer to buffer for nonmutable string
return (this->_BUF_SIZE <= this->_Myres
? _STD addressof(*this->_Bx._Ptr)
: this->_Bx._Buf);
}
Вопросы:
Как правильно конвертировать строки в тип LPTSTR и другие типы?
Уже пробовала использовать функцию int WideCharToMultiByte(), безрезультатно.
Пожалуйста, можно поподробней о конвертации строк.
Где и какие способы лучше использовать.
N1ka вне форума Ответить с цитированием
Старый 24.11.2015, 20:44   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
Как правильно конвертировать строки в тип LPTSTR и другие типы?
LPCTSTR в зависимости от настроек проекта может быть как юникодовой строкой,так и ansi. Т.е. если у тебя используются юникодовые строки, то getVectorElement(Index).c_str() уже имеет тип LPCTSTR.
Если по умолчанию используются ansi строки, то чтобы преобразовать из WCHAR* в CHAR* можно использовать WideCharToMultiByte.

Цитата:
Уже пробовала использовать функцию int WideCharToMultiByte(), безрезультатно.
Приведи свой код, у тебя значит где-то ошибка.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 24.11.2015, 20:55   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

там скорее всего дело в том что требуется не константная строка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.11.2015, 11:26   #4
N1ka
Новичок
Джуниор
 
Регистрация: 24.11.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
LPCTSTR в зависимости от настроек проекта может быть как юникодовой строкой,так и ansi. Т.е. если у тебя используются юникодовые строки, то getVectorElement(Index).c_str() уже имеет тип LPCTSTR.
Если по умолчанию используются ansi строки, то чтобы преобразовать из WCHAR* в CHAR* можно использовать WideCharToMultiByte.


Приведи свой код, у тебя значит где-то ошибка.
Спасибо за ответ, стало более понятными типы в winapi

Вот функции для перевода. Все также выдает ошибку , указанную выше.

Код:
std::string OutText::wstrtostr(const std::wstring &wstr)
	{
		// Convert a Unicode string to an ASCII string
		std::string strTo;
		char *szTo = new char[wstr.length() + 1];
		szTo[wstr.size()] = '\0';
		WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, szTo, (int)wstr.length(), NULL, NULL);
		strTo = szTo;
		delete[] szTo;
		return strTo;
	}
	std::wstring OutText::strtowstr(const std::string &str)
	{
		// Convert an ASCII string to a Unicode String
		std::wstring wstrTo;
		wchar_t *wszTo = new wchar_t[str.length() + 1];
		wszTo[str.size()] = L'\0';
		MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wszTo, (int)str.length());
		wstrTo = wszTo;
		delete[] wszTo;
		return wstrTo;
	}
вот так вызываю функцию.
Код:
std::string b = wstrtostr(lb.getVectorIteam(id.getSelIndex()).c_str());
N1ka вне форума Ответить с цитированием
Старый 27.11.2015, 11:43   #5
N1ka
Новичок
Джуниор
 
Регистрация: 24.11.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Приведи свой код, у тебя значит где-то ошибка.

Подскажите, возможно, это из-за того что у меня вектор в одном классе, а использования его элементов в другом:

Код:
//AddInList.h_________________________________________________

namespace Program {
	class AddInList
	{
public:
std::vector<std::wstring> v;                      //вектор
std::vector<std::wstring>::iterator it;           //итератор

void setVectorIteam(std::wstring iteam, int i);   //функция заполняет вектор
std::wstring getVectorIteam(int SelIndex);      //функция выдает элемент вектора
};
Код:
//OutText.cpp_____________________________________________________

#include "AddInList.h"
using Program::AddInList;

namespace Program {
	class OutText
	{

        AddInList lb;       //Объект класса AddInList

void OutText::func6() {   //фун-ция, которая использует элементы вектора

	std::string b = wstrtostr(lb.getVectorIteam(id.getSelIndex()).c_str());

//функция wstrtostr  (раннее высланная)  описана в классе OutText

}
};
N1ka вне форума Ответить с цитированием
Старый 27.11.2015, 11:47   #6
N1ka
Новичок
Джуниор
 
Регистрация: 24.11.2015
Сообщений: 4
По умолчанию

не стала присылать полные версии классов дабы не запутать Вас
Так же добавлю, что вектор заполняется правильно, проверяла через дебагер заполнение верное.
N1ka вне форума Ответить с цитированием
Старый 27.11.2015, 14:12   #7
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Метод wstrtostr у меня корректно работает. Видимо проблема с вектором и доступом к его элементам. Надо смотреть, что содержится в lb на момент вызова метода wstrtostr.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 27.11.2015, 14:42   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а какая ошибка?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Конвертация строки в двумерный массив целочисленных значений alexelev Помощь студентам 5 01.07.2013 00:11
Строки / Файлы / Конвертация madmaniac Visual C++ 8 25.02.2012 00:28
MinGW g++ и wstring Пепел Феникса Общие вопросы C/C++ 1 29.07.2011 03:15
Конвертация строки CString из Юникода в ANSI Moorindal15 Помощь студентам 0 26.04.2011 18:06
list<wstring> ? artush1984 Общие вопросы C/C++ 4 12.02.2010 15:05