Тут могла бути ваша реклама
  • Автор теми Автор теми inferno_99
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 28.01.2009
Повідом.: 176
Типы данных

Использую функцию

GetWindowText(
HWND hWnd,
LPTSTR lpString,
int nMaxCount
);

чтобы получить текст с окна (Edit).

Подскажите как работать с этими типами - LPTSTR, LPWSTR.
Как преобразовать например в char*
 
Вот жеж блин... ПРограммисты так сказать... Куда в АДО или ОДБЦ лезть если не освоил основ языка и платформы, да еще и в МСДН забанен?
Если собераешься поддерживать более одного языка, забуть о типе чар, а лучше забудь о нем до конца жизни, ну по крайней мере до того времени как в СП не начнет на постоянной основе применяться УТФ-8
 
я бы и про wchar_t* советовал бы забыть...

И что вместо него? УТФ-8? Ну у меня как бы вызывает большие смнения что ядра современных ОС поддерживают жту кодировку, насчет виндовс - так точно...
 
И что вместо него? УТФ-8? Ну у меня как бы вызывает большие смнения что ядра современных ОС поддерживают жту кодировку, насчет виндовс - так точно...

ну вроде как во всех нормальных языках уже сто лет в обед есть нормальные строковые типы, а не указатели на строчки обрезанные нулями.
 
ну вроде как во всех нормальных языках уже сто лет в обед есть нормальные строковые типы, а не указатели на строчки обрезанные нулями.
И в C++ есть.
std::base_string<> и специализации:
1) Для char - std::string
2) Для wchar_t - std::wstring

Для получения C-строки используем метод c_str(), длины строки size() или length()

Аналогично в ATL есть ATL::CStringT и специализации
1) Для char - ATL::CString
2) Для wchar_t - ATL::CStringW
Для получения C-строки предусмотрен оператор преобразования в соотв. тип, т.е вместо сишной строки можно использовать экземпляр CStringT напрямую.
 
И в C++ есть.
std::base_string<> и специализации:
1) Для char - std::string
2) Для wchar_t - std::wstring

Для получения C-строки используем метод c_str(), длины строки size() или length()

Аналогично в ATL есть ATL::CStringT и специализации
1) Для char - ATL::CString
2) Для wchar_t - ATL::CStringW
Для получения C-строки предусмотрен оператор преобразования в соотв. тип, т.е вместо сишной строки можно использовать экземпляр CStringT напрямую.
спасибо, коллега. C++ какбе тоже нормальный язык.
в VCL (C++ Builder / Delphi) есть аналоги под названием UnicodeString и AnsiString и еще много разных стрингов.
 
ну вроде как во всех нормальных языках уже сто лет в обед есть нормальные строковые типы, а не указатели на строчки обрезанные нулями.

Колега вы наверное удивитесь узнав о том, что даже С++ имеет весьма неширокое распространение среди СП кода. В основном это чистый Си ;) Во вторых в отличии от паскаля в С++ нету нативного стрингового типа, соответственно знание что такое ВЧарТ минимум необходимо для программиста на С++. Более того ТС задал вопрос в области в которой стл малоприменима, а АЛТ (ВТЛ) неподходит по ТЗ ;)
 
та не, ну понятно, что Микрософт и другие обстоятельства принуждают к извращенному сексу с LPSTR, BSTR, BDSMSTR, но так ли сладки утехи с ними без физического принуждения?
 
Почему не работает????

char str1[50], *lpstr1;
lpstr1=str1;

GetWindowTextA(hWndEdit,lpstr1,50);
ListView_SetItemText(ListE,2,2,(LPWSTR)lpstr1);

Описание функций в МСДН:

int GetWindowText(
__in HWND hWnd,
__out LPTSTR lpString, // Хотя когда в студии пишу параметры, то пишет что надо LPWSTR
__in int nMaxCount
);

VOID ListView_SetItemText(
HWND hwnd,
int i,
int iSubItem,
LPCTSTR pszText
);
 
Почему не работает????
Описание функций в МСДН:

По качану :) Разберись что такое char, а что такое wchar_t непоняв этого не поймешь сути работы с АПИ если быть кратким то чар в вайд чар перегоняеться не приведением типов а MultiByteToWideChar. Как ее применять прочтешь в МСДН. Но советую для начала понять смісл и разницу.
 
По качану :) Разберись что такое char, а что такое wchar_t непоняв этого не поймешь сути работы с АПИ если быть кратким то чар в вайд чар перегоняеться не приведением типов а MultiByteToWideChar. Как ее применять прочтешь в МСДН. Но советую для начала понять смісл и разницу.

Я сомневаюсь, что TCу в данной ситуации что-то нужно куда-то перегонять. Понять разницу char / wide char - да, это полезно. А дальше, по-моему, следует использовать TCHAR и родственные типы/функции, пока не окажется, что где-то нужно явно работать и с ANSI, и с Unicode одновременно, что бывает, по-моему, редко.
 
Ну дык
Код:
char str1[50], *lpstr1; // Явно указан многобайтный тип (char)
lpstr1=str1; // Зачем это присвоение?

GetWindowTextA(hWndEdit,lpstr1,50); // Явно вызываешь многобайтную функцию (т.е. для типа char)
ListView_SetItemText(ListE,2,2,(LPWSTR)lpstr1); // А вот тут ты явно приводишь указатели
// но строки то не преобразовываются!
// Или используй MultibyteToWideChar() или, что более правильно,
// используй строки типа TCHAR[] или CString.

У тебя
Код:
VOID ListView_SetItemText(
HWND hwnd,
int i,
int iSubItem,
LPCTSTR pszText
);
разворачивается препроцессором в
Код:
VOID ListView_SetItemText(
HWND hwnd,
int i,
int iSubItem,
wchar_t * pszText
);

так как у тебя объявлена директива _UNICODE.
 
Я сомневаюсь, что TCу в данной ситуации что-то нужно куда-то перегонять. Понять разницу char / wide char - да, это полезно. А дальше, по-моему, следует использовать TCHAR и родственные типы/функции, пока не окажется, что где-то нужно явно работать и с ANSI, и с Unicode одновременно, что бывает, по-моему, редко.

Ну дык я и не спорю собственно :) Он спросил почему неработает, я написал почему и как приводить.
Здаеться мне вся проблема в том, что 50% преподователей в вузах вообще не знаю что такое wchar_t, 20% слышали о нем, но как использовать не знают, еще 20% знают о нем. но уверены что многоязыковая поддержка для десктопных приложений это зло, и зря народ вбохал кучу бабок в разработку юникодных ядер, ну и 10% адекватных...

Так вот, ТС, если ты не хочешь заморачиваться на мелкософтовские штучки, пиши так:
Код:
wchar_t str1[50], *lpstr1;
lpstr1=str1;

GetWindowTextW(hWndEdit,lpstr1,50);
ListView_SetItemTextW(ListE,2,2,lpstr1);
или в мелкософтовском стиле:
Код:
TCHAR str1[50], *lpstr1;
lpstr1=str1;

GetWindowText(hWndEdit,lpstr1,50);
ListView_SetItemText(ListE,2,2,lpstr1);

Ну а если ты считаешь что все программы должны быть только на английском и целых два байта на символ это непозволительное транжирство, то пиши так:
Код:
char str1[50], *lpstr1;
lpstr1=str1;

GetWindowTextA(hWndEdit,lpstr1,50);
ListView_SetItemTextA(ListE,2,2,lpstr1);

Ну или
Код:
char str1[50], *lpstr1;
lpstr1=str1;

GetWindowText(hWndEdit,lpstr1,50);
ListView_SetItemText(ListE,2,2,lpstr1);
Предварительно зайдя в свойства проекта, открыв вкладку General в пункте Character Set выбери Use Multi-Byte Character Set вместо Use Unicode Character Set и будет тебя счастье, во втором случае кстати будет работать и вышеприведеный вариант в мелкософтовском стиле.

Ну а вообще разберись чем char отличаеться от wchar_t в принципе и в рамках представления в памяти на Литл Ендиан машинах, что происходить при тупом каставании и НЕ ЗАДАВАЙ ГЛУПЫХ ВОПРОСОВ ;)

Славик, у тебя баг :) Препроцессором разворачиваеться в

Код:
VOID ListView_SetItemText[B]W[/B](
HWND hwnd,
int i,
int iSubItem,
wchar_t * pszText
);
 
Использую функцию MultibyteToWideChar, для этого подключаю то что пишет в МСДН:
Header Winnls.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

Но всёравно не находит такой функции.
 
Останнє редагування:
Использую функцию MultibyteToWideChar, для этого подключаю то что пишет в МСДН:
Header Winnls.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

Но всёравно не находит такой функции.

MultibyteToWideChar нужна дле приведения чар к вчар. Только тебе как бі пітаються все обїяснить что єтого тебе не надо ;) Заметь все явно неглупіе люди которіе педалят уже не первій год ;) Учись все делать не так как препод недоучка рассказал на лекции и как он хочет, а как надо и как єто тебе в будущем пригодиться в жизни :)

Ну если ті очень настаиваешь, то в стандартном вин32 консоль апликейшен необходимо лишь Windows.h что бі получить доступ к єтой функции. Если у тебя его нет, значит проблемі в настройках твоего проекта. И что значит не видеть? А точнее кто не видеть линкер или компилятор и с каким сообщением об ошибке?
 
Назад
Зверху Знизу