Харьков Форум
  Харьков Форум > Hi-Tech... > Программирование и создание сайтов

Старый 20.03.2014, 00:35   #1
Jogger


 
 
Регистрация: 22.06.2007
Адрес: Харьков
Из: UKRAINE
Сообщений: 1,669
 
По умолчанию не пашет TBGETBUTTONINFO

Раз уж раздел называется "Программирование" то вопреки традициям задам вопрос по программированию.
Итак, ситуация - есть примерно такой код:
Код:
TBBUTTONINFO mtbbi;
HWND hwnd;
HANDLE hProc;
DWORD dwProcessID;
void* lpData;

.....

GetWindowThreadProcessId(hwnd, &dwProcessID);
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessID);
lpData = VirtualAllocEx(hProc , 0, sizeof(TBBUTTONINFO), MEM_COMMIT, PAGE_READWRITE);
memset(&mtbbi,0,sizeof(mtbbi));
mtbbi.cbSize=sizeof(TBBUTTONINFO);
mtbbi.dwMask=TBIF_BYINDEX|TBIF_LPARAM;	
WriteProcessMemory(hProc,lpData,&mtbbi,sizeof(TBBUTTONINFO),&dwBytesRead);
SendMessage(hwnd, TB_GETBUTTONINFO, 0, (LPARAM)lpData);
ReadProcessMemory(hProc, lpData, &mtbbi, sizeof(TBBUTTONINFO), &dwBytesRead);
где hwnd - хендл тулбара с кнопками. Хендл правильный, другие сообщения (например TB_BUTTONCOUNT или TB_GETBUTTON) до него доходят.
И вот трабла - под WinXP это всё прекрасно работает, а под Win7 x64 - SendMessage возвращает -1, что свидетельствует об ошибке. Пробовал вместо GETBUTTONINFO посылать GETBUTTONINFOA - то же самое.
В гугле пока решение не нашлось.
Может кто подскажет, что я неправильно делаю, или хоть посоветует в какую сторону копать.


__________________
когда ж я уже сдохну
    Вверх
Старый 20.03.2014, 11:18   #2
Deamon


 
Регистрация: 12.09.2007
Адрес: Харьков
Из: UKRAINE
Сообщений: 2,594
 
По умолчанию
Что под семеркой говорит GetLastError? Отсюда и нужно плясать


    Вверх
Старый 20.03.2014, 18:05   #3
Jogger


 
 
Регистрация: 22.06.2007
Адрес: Харьков
Из: UKRAINE
Сообщений: 1,669
 
По умолчанию
Цитата:
Сообщение от Deamon
Что под семеркой говорит GetLastError? Отсюда и нужно плясать
Ничего не говорит. Остаётся старое значение. Если перед SendMessage сделать SetLastError(0), то так и остаётся ноль. Да оно в общем-то и не должно ничего говорить.


__________________
когда ж я уже сдохну
    Вверх
Старый 21.03.2014, 12:17   #4
lugal


 
 
Регистрация: 5.02.2007
Адрес: Харьков.
Из: UKRAINE
Сообщений: 32,902
 
По умолчанию
Я бы проверил результат WriteProcessMemory (успешна ли запись в процесс).
Плюс, не следуюет забывать, что если сам процесс с тулбаром х64, а ваш х86, то размеры структур TBBUTTONINFO у них разные.


__________________
Автохоббит - высшая ступень эволюции форумчанина.
    Вверх
Старый 21.03.2014, 13:05   #5
Jogger


 
 
Регистрация: 22.06.2007
Адрес: Харьков
Из: UKRAINE
Сообщений: 1,669
 
По умолчанию
Цитата:
Сообщение от lugal
Я бы проверил результат WriteProcessMemory (успешна ли запись в процесс).
успешна, проверялось в первую очередь.
Цитата:
Сообщение от lugal
Плюс, не следуюет забывать, что если сам процесс с тулбаром х64, а ваш х86, то размеры структур TBBUTTONINFO у них разные.
Да, в этом и было дело, ночью докопался. В структуре есть указатели, и для x64 приложения они в два раза больше. Сделал свою структуру с int64 вместо указателей, и всё заработало.


__________________
когда ж я уже сдохну
    Вверх
Старый 21.03.2014, 14:15   #6
lugal


 
 
Регистрация: 5.02.2007
Адрес: Харьков.
Из: UKRAINE
Сообщений: 32,902
 
По умолчанию
Цитата:
Сообщение от Jogger
Да, в этом и было дело, ночью докопался. В структуре есть указатели, и для x64 приложения они в два раза больше. Сделал свою структуру с int64 вместо указателей, и всё заработало.


__________________
Автохоббит - высшая ступень эволюции форумчанина.
    Вверх

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

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

Харьков Форум > Hi-Tech... > Программирование и создание сайтов

Быстрый переход


Часовой пояс GMT +2, время: 03:14.


Харьков Форум Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.