Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
1

FindWindow Debug/Release и ошибка "Невозможно преобразовать const char[12] в LPСWSTR"

19.04.2015, 04:49. Показов 1826. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Есть кусок кода.

C++
1
HWND hWindow = FindWindow(0, "WindowName");
В Debug компилится, в Release выбивает ошибку "невозможно преобразовать const char[12] в LPСWSTR".

Понятно. Оказывается, если в дебаге врубить многобайтовую кодировку, то это не значит, что в релизе она будет.
Проблема решилась включением поддержки многобайтовой кодировки и в релизе тоже.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2015, 04:49
Ответы с готовыми решениями:

Ошибка С2440 - невозможно преобразовать const char [8] в char*
Здравствуйте! При решение упражнение по книжке столкнулся с проблемой C2440... Прочитал...

Ошибка С2664: невозможно преобразовать параметр 1 из 'double' в 'const char *'
Ошибка C2664: невозможно преобразовать параметр 1 из 'double' в 'const char *' Visual 2008....

Ошибка 1 error C2664: CFileFind::FindFile: невозможно преобразовать параметр 1 из 'const char [7]' в 'LPCTSTR'
Нужно вывести на экран, в консольном режиме имена всех файлов, которые находятся в какой-то...

Невозможно преобразовать параметр 1 из 'const char [3]' в 'const wchar_t *
void CprojectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: добавьте...

Переход с 10 на 17 Студию 2440 =: невозможно преобразовать "const char [2] в char*
Доброго Нового года! Через пару дней сдавать контрольную работу, которую сделал ещё вначале...

16
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
19.04.2015, 06:01 2
можно использовать макрос _T
C++
1
_T("text")
тогда компилятор сам выберет как кодировать строку, обыкновенными символами или широкими
для выделения памяти использовать TCHAR
C++
1
TCHAR str[]=_T("text");
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 11:08 3
C++
1
FindWindowW(NULL, L"WindowName");
Добавлено через 50 секунд
Цитата Сообщение от Helixanon Посмотреть сообщение
Проблема решилась включением поддержки многобайтовой кодировки и в релизе тоже.
Она не решилась, а замаскировалась.
Многобайтовые кодировки - прошлый век, давно пора их выкинуть на
свалку и использовать только Unicode.
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 11:21  [ТС] 4
Я перепробовал много вариантов решения до включения многобайтовой кодировки в релизе, и макрос _T в том числе (подключив tchar.h). Программа выдаёт неверные результаты.
Насчёт юникода, вы предлагаете вместо многобайтовой кодировки использовать L перед названием окна, я такой вариант уже пробовал. Неверные результаты.

Может быть, проблема в следующих строках кода?
C++
1
2
3
HWND hWindow = FindWindow(0, "WindowName");
DWORD procId;
GetWindowThreadProcessId(hWindow, &procId);
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 11:30 5
Цитата Сообщение от Helixanon Посмотреть сообщение
Насчёт юникода, вы предлагаете вместо многобайтовой кодировки использовать L перед названием окна, я такой вариант уже пробовал. Неверные результаты.
Вы для начала проверьте, что возвращает FindWindow и какой GetLastError в
случае ее ошибки.
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 11:42  [ТС] 6
IDE - Visual C++ 2013 Express.
Момент, сейчас чекну.

GetLastError() выдал 0, т.е. дело уже не в поиске окна. Виноват GetWindowThreadProcessId?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 11:44 7
Так FindWindow возвращает ненулевое значение (т.е. успех), я правильно понял ?
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 11:47  [ТС] 8
Да, верно, что-то не так именно с этими функциями, ибо ReadProcessMemory несколькими строками ниже уже выдаёт фигню (но работает правильно при многобайтовой кодировке).
Да, правильно. Значит, результат неправильно обрабатывается в следующих строках:

C++
1
2
3
4
HWND hWindow = FindWindow(0, L"WindowName");
DWORD procId;
GetWindowThreadProcessId(hWindow, &procId);
HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 11:50 9
А это потому, что надо всегда проверять, что возвращают функции, а
не писать портянку вызовов без всяких проверок... Вот и здесь тоже:
где гарантия, что OpenProcess вообще вернет успех ?
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 11:54  [ТС] 10
Ну, если я правильно пишу, то этот код возвращает мне 0.
C++
1
2
3
4
5
6
7
8
int error = 0;
HWND hWindow = FindWindow(0, L"WindowName");
DWORD procId;
GetWindowThreadProcessId(hWindow, &procId);
HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);
error = GetLastError();
std::cout << error;
system("pause");
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 12:00 11
Это тоже неправильно. GetLastError, если только в документации не
сказано обратное, имеет смысл звать только в том случае, если
функция вернула ошибку. В остальных случаях его состояние
не определено.
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 12:03  [ТС] 12
Ну т.е. если возвращает 0, то всё нормально и функция получает хендл. Тогда в чём может быть проблема? Ведь если использовать многобайтовую кодировку, то всё работает правильно.
P.S. Эта программа - мой первый опыт с WinAPI, так что я ещё много чего не знаю, но стараюсь.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 12:06 13
Цитата Сообщение от Helixanon Посмотреть сообщение
Тогда в чём может быть проблема ?
А что именно не работает ? В первом сообщении вообще писалось
про ошибки компиляции... Да, и показывайте уже весь проблемный код,
без отрыва от контекста, так сказать.
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 12:12  [ТС] 14
Ну, просто это та часть кода, которая вызывает проблемы. Именно эти строки. Я уверен, ведь следующие строки выдают не то только в случае использования Юникода. Ну вот, например. Ошибка уже на строке ReadProcessMemory (т.е. дальше неё смысла идти нет, ошибка либо в ней, либо до неё):
C++
1
2
3
4
5
HWND hWindow = FindWindow(0, L"WindowName");
DWORD procId;
GetWindowThreadProcessId(hWindow, &procId);
HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);
ReadProcessMemory(procHandle, (LPVOID)(0x1234, &value, sizeof(value), 0);
Я пытаюсь заменить всё на общий случай, т.е. там, конечно, не 0x1234. При том, что в многобайтовой кодировке всё работает. Проблема ДО ReadProcessMemory.

И верно, не компилируется, если убрать L до "WindowName". Если приписать, то компилируется, но неправильные результаты. Если врубить многобайтовую кодировку, то компилится и правильные результаты. Но, по вашим словам, многобайтовая кодировка - прошлый век, вот я и пытаюсь найти решение проблемы с юникодом.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 12:18 15
C++
1
2
3
4
5
HWND hWindow = FindWindow(0, L"WindowName");
DWORD procId;
GetWindowThreadProcessId(hWindow, &procId);
HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);
ReadProcessMemory(procHandle, (LPVOID)(0x1234, &value, sizeof(value), 0);
За код, написанный в подобном стиле, надо карать. Вилами.
Вот более контролируемый вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
HWND hWindow = FindWindowW(NULL, L"WindowName");
 
if (NULL == hWindow)
{
    // Обрабатываем ошибку (+GetLastError).
    return false;
}
 
DWORD ProcessId;
DWORD ThreadId = GetWindowThreadProcessId(hWindow, &ProcessId);
 
if (0 == ThreadId)
{
    // Обрабатываем ошибку.
    return false;
}
 
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, ProcessId);
 
if (NULL == hProcess)
{
    // Обрабатываем ошибку (+GetLastError).
    return false;
}
 
if (FALSE == ReadProcessMemory(hProcess, (LPVOID)0x1234, &value, sizeof (value), 0))
{
    // Обрабатываем ошибку (+GetLastError).
    CloseHandle(hProcess);
    return false;
}
 
CloseHandle(hProcess).
 
//
// Тут работаем с полученным буфером.
//
 
return true;
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
19.04.2015, 12:34  [ТС] 16
В каждом if поставил по std::cout и system("pause"), программа не остановилась ни на одном. Программа всё получает правильно, да только вот ReadProcessMemory уже выдаёт не те результаты, что нужно. Неверный хендл, значит.
Я в упор не понимаю, почему в юникоде не работает, а с многобайтовой работает (верные значения). 80% что ошибка в FindWindow, но...
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.04.2015, 16:25 17
Чудес не бывает.
Если FindWindow вернула ненулевое значение, значит, хэндл окна получен.
То же самое и с OpenProcess. И с ReadProcessMemory. Ищите ошибку где-то в
логике работы программы, а не в multibyte/unicode.
0
19.04.2015, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2015, 16:25
Помогаю со студенческими работами здесь

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...

Error c2440: невозможно преобразовать 'const char [2]' в 'char'
С недавних пор я решил почитать и поучиться программировать, так сказать занять себя чем нибудь...

error C2440: =: невозможно преобразовать 'const char *' в 'char *'
есть вот такой кусок кода int getLex(){ int i = iCurrPos; char strLex, * cp; int j; while...

Printf: невозможно преобразовать параметр 1 из 'char' в 'const char *'
Здравствуйте, подскажите как исправить? &quot;printf: невозможно преобразовать параметр 1 из 'char' в...

Невозможно преобразовать параметр 2 из 'char' в 'const char *
Уважаемые господа программисты,как преобразовать тип переменной из 'char' в 'const char *'? ...

Невозможно преобразовать параметр 1 из 'char' в 'const char *'
Дана задача: Задана последовательность, состоящая только из символов ‘&gt;’, ‘&lt;’ и ‘-‘. Требуется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru