Помогите разобраться с GetWindowText
От: mrHill  
Дата: 23.07.11 16:44
Оценка:
Есть такой код:

char tText[254];
HWND hWnd;
//
hWnd = GetTopWindow(0);
while (hWnd != 0) {
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
GetWindowText(hWnd, tText, 254);
.......
.......
}

Ошибка компилятора
e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из "char [254]" в "LPWSTR"

Где ошибка? Ткните носом, пожалуйста!

Microsoft Visual C++ 2010 Express

25.07.11 12:32: Перенесено из 'C/C++'
Re: Помогите разобраться с GetWindowText
От: uzhas Ниоткуда  
Дата: 23.07.11 16:47
Оценка:
Здравствуйте, mrHill, Вы писали:

H>Ошибка компилятора

H>e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из "char [254]" в "LPWSTR"

H>Где ошибка? Ткните носом, пожалуйста!

вы пытаетесь передать ANSI string, а просят юникодную строчку (wchar_t*)
либо сделайте свой текст юникодным (вместо char надо wchar_t), либо уберите поддержку уникода в проекте (в свойствах проекта уберите юникод). в последнем случае это приведет к тому, что GetWindowsText будет превращаться не в GetWindowTextW, а в GetWindowsTextA
Re[2]: Помогите разобраться с GetWindowText
От: mrHill  
Дата: 23.07.11 17:31
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, mrHill, Вы писали:


H>>Ошибка компилятора

H>>e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из "char [254]" в "LPWSTR"

H>>Где ошибка? Ткните носом, пожалуйста!

U>вы пытаетесь передать ANSI string, а просят юникодную строчку (wchar_t*)
U>либо сделайте свой текст юникодным (вместо char надо wchar_t), либо уберите поддержку уникода в проекте (в свойствах проекта уберите юникод). в последнем случае это приведет к тому, что GetWindowsText будет превращаться не в GetWindowTextW, а в GetWindowsTextA

Переделал код:

LPWSTR tText;
HWND hWnd;
//

tText = new WCHAR[254];

hWnd = GetTopWindow(0);
while (hWnd != 0) {
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
GetWindowText(hWnd, tText, 254);
...
...
}

Все равно не работает!

Example1.obj : error LNK2028: ссылка на неразрешенную лексему (0A000011) "extern "C" int __stdcall GetWindowTextW(struct HWND__ *,wchar_t *,int)" (?GetWindowTextW@@$$J212YGHPAUHWND__@@PA_WH@Z) в функции "private: void __clrcall Example1::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@Example1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
Re: Помогите разобраться с GetWindowText
От: mrHill  
Дата: 23.07.11 19:55
Оценка:
Вопрос снимаю. Уже разобрался. Спасибо.
Re: Помогите разобраться с GetWindowText
От: incomoto Россия  
Дата: 23.07.11 20:56
Оценка:
Здравствуйте, mrHill, Вы писали:

H>Есть такой код:


H>char tText[254];
H>HWND hWnd;
H>//
H>hWnd = GetTopWindow(0);
H>while (hWnd != 0) {
H> hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
H> GetWindowText(hWnd, tText, 254);
H> .......
H> .......
H>}

H>Ошибка компилятора

H>e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из "char [254]" в "LPWSTR"

H>Где ошибка? Ткните носом, пожалуйста!


H>Microsoft Visual C++ 2010 Express


Ошибка преобразования типов при вызове GetWindowText (). Согласно MSDN прототип функции выглядит следующим образом:

int WINAPI GetWindowText(
__in HWND hWnd,
__out LPTSTR lpString,
__in int nMaxCount
);

где lpString — заполняемый буфер, имеющий тип LPTSTR при условии, что:

#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif

определенный как (судя по сообщению MSVC++ макрос UNICODE все-таки определен):

typedef WCHAR *LPWSTR;

где WCHAR, в свою очередь определен как:

typedef wchar_t WCHAR;

где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:

typedef unsigned char *LPTSTR;

Что, в свою очередь, совсем не char [254]. Поэтому компилятор вполне добросовестно делает свою работу. Вот такой вот пирог от Micro$oft. Раз уж функция требует зловещий LPWSTR, значит этого типа переменную и нужно ей преподнести в данном случае.
What doesn't kill us, just makes us stronger.
Re[2]: Помогите разобраться с GetWindowText
От: uzhas Ниоткуда  
Дата: 23.07.11 22:25
Оценка:
I>где WCHAR, в свою очередь определен как:

I>typedef wchar_t WCHAR;


I>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:


I>typedef unsigned char *LPTSTR;


Остапа понесло и принесло не туда
Re[3]: Помогите разобраться с GetWindowText
От: incomoto Россия  
Дата: 25.07.11 07:48
Оценка:
Здравствуйте, uzhas, Вы писали:

I>>где WCHAR, в свою очередь определен как:


I>>typedef wchar_t WCHAR;


I>>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:


I>>typedef unsigned char *LPTSTR;


U>Остапа понесло и принесло не туда


Ёшкин кот, точно.

unsigned short, конечно же, никакой не unsigned char... Пардон
What doesn't kill us, just makes us stronger.
Re[4]: Помогите разобраться с GetWindowText
От: Centaur Россия  
Дата: 25.07.11 08:41
Оценка:
Здравствуйте, incomoto, Вы писали:

I>>>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:


I>unsigned short, конечно же, никакой не unsigned char... Пардон


Опять неправильно. wchar_t — встроенный тип C++, никак не связанный с unsigned short.
Re[5]: Помогите разобраться с GetWindowText
От: DarkEld3r  
Дата: 25.07.11 09:12
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Опять неправильно. wchar_t — встроенный тип C++, никак не связанный с unsigned short.


Ну а если /Zc:wchar_t-?
Re[5]: Помогите разобраться с GetWindowText
От: incomoto Россия  
Дата: 25.07.11 10:57
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, incomoto, Вы писали:


I>>>>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:


I>>unsigned short, конечно же, никакой не unsigned char... Пардон


C>Опять неправильно. wchar_t — встроенный тип C++, никак не связанный с unsigned short.


Каюсь, опять погорячился. В MSDN, правда, написано:

"By default wchar_t is a typedef for unsigned short."

Ну а в стандарте С++98 — "implementation-defined". Правда, тип, оказывается, был внесен еще в C90, т.е. еще до официального анонсирования C++...
What doesn't kill us, just makes us stronger.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.