0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
|
||||||
1 | ||||||
FindWindow Debug/Release и ошибка "Невозможно преобразовать const char[12] в LPСWSTR"19.04.2015, 04:49. Показов 1829. Ответов 16
Метки нет (Все метки)
Здравствуйте. Есть кусок кода.
Понятно. Оказывается, если в дебаге врубить многобайтовую кодировку, то это не значит, что в релизе она будет. Проблема решилась включением поддержки многобайтовой кодировки и в релизе тоже.
0
|
19.04.2015, 04:49 | |
Ответы с готовыми решениями:
16
Ошибка С2440 - невозможно преобразовать const char [8] в char* Ошибка С2664: невозможно преобразовать параметр 1 из 'double' в 'const char *' Ошибка 1 error C2664: CFileFind::FindFile: невозможно преобразовать параметр 1 из 'const char [7]' в 'LPCTSTR' Невозможно преобразовать параметр 1 из 'const char [3]' в 'const wchar_t * Переход с 10 на 17 Студию 2440 =: невозможно преобразовать "const char [2] в char* |
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|||||||||||
19.04.2015, 06:01 | 2 | ||||||||||
можно использовать макрос _T
для выделения памяти использовать TCHAR
0
|
Ушел с форума
|
||||||
19.04.2015, 11:08 | 3 | |||||
Она не решилась, а замаскировалась. Многобайтовые кодировки - прошлый век, давно пора их выкинуть на свалку и использовать только Unicode.
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
|
||||||
19.04.2015, 11:21 [ТС] | 4 | |||||
Я перепробовал много вариантов решения до включения многобайтовой кодировки в релизе, и макрос _T в том числе (подключив tchar.h). Программа выдаёт неверные результаты.
Насчёт юникода, вы предлагаете вместо многобайтовой кодировки использовать L перед названием окна, я такой вариант уже пробовал. Неверные результаты. Может быть, проблема в следующих строках кода?
0
|
Ушел с форума
|
|
19.04.2015, 11:30 | 5 |
Вы для начала проверьте, что возвращает 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
|
Ушел с форума
|
|
19.04.2015, 11:44 | 7 |
Так FindWindow возвращает ненулевое значение (т.е. успех), я правильно понял ?
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
|
||||||
19.04.2015, 11:47 [ТС] | 8 | |||||
Да, верно, что-то не так именно с этими функциями, ибо ReadProcessMemory несколькими строками ниже уже выдаёт фигню (но работает правильно при многобайтовой кодировке).
Да, правильно. Значит, результат неправильно обрабатывается в следующих строках:
0
|
Ушел с форума
|
|
19.04.2015, 11:50 | 9 |
А это потому, что надо всегда проверять, что возвращают функции, а
не писать портянку вызовов без всяких проверок... Вот и здесь тоже: где гарантия, что OpenProcess вообще вернет успех ?
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
|
||||||
19.04.2015, 11:54 [ТС] | 10 | |||||
Ну, если я правильно пишу, то этот код возвращает мне 0.
0
|
Ушел с форума
|
|
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
|
Ушел с форума
|
|
19.04.2015, 12:06 | 13 |
А что именно не работает ? В первом сообщении вообще писалось
про ошибки компиляции... Да, и показывайте уже весь проблемный код, без отрыва от контекста, так сказать.
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
|
||||||
19.04.2015, 12:12 [ТС] | 14 | |||||
Ну, просто это та часть кода, которая вызывает проблемы. Именно эти строки. Я уверен, ведь следующие строки выдают не то только в случае использования Юникода. Ну вот, например. Ошибка уже на строке ReadProcessMemory (т.е. дальше неё смысла идти нет, ошибка либо в ней, либо до неё):
И верно, не компилируется, если убрать L до "WindowName". Если приписать, то компилируется, но неправильные результаты. Если врубить многобайтовую кодировку, то компилится и правильные результаты. Но, по вашим словам, многобайтовая кодировка - прошлый век, вот я и пытаюсь найти решение проблемы с юникодом.
0
|
Ушел с форума
|
|||||||||||
19.04.2015, 12:18 | 15 | ||||||||||
Вот более контролируемый вариант:
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 12
|
|
19.04.2015, 12:34 [ТС] | 16 |
В каждом if поставил по std::cout и system("pause"), программа не остановилась ни на одном. Программа всё получает правильно, да только вот ReadProcessMemory уже выдаёт не те результаты, что нужно. Неверный хендл, значит.
Я в упор не понимаю, почему в юникоде не работает, а с многобайтовой работает (верные значения). 80% что ошибка в FindWindow, но...
0
|
Ушел с форума
|
|
19.04.2015, 16:25 | 17 |
Чудес не бывает.
Если FindWindow вернула ненулевое значение, значит, хэндл окна получен. То же самое и с OpenProcess. И с ReadProcessMemory. Ищите ошибку где-то в логике работы программы, а не в multibyte/unicode.
0
|
19.04.2015, 16:25 | |
19.04.2015, 16:25 | |
Помогаю со студенческими работами здесь
17
Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' Error c2440: невозможно преобразовать 'const char [2]' в 'char' error C2440: =: невозможно преобразовать 'const char *' в 'char *' Printf: невозможно преобразовать параметр 1 из 'char' в 'const char *' Невозможно преобразовать параметр 2 из 'char' в 'const char * Невозможно преобразовать параметр 1 из 'char' в 'const char *' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |