TB_GETBUTTONINFO не работает в Windows 7

У меня есть такой код:

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) отлично работает.
Итак, этот код работает правильно под Windows XP, но когда я пытаюсь выполнить его под Windows 7 x64 SendMessage возвращает -1, что означает ошибку. Я пытался использовать GETBUTTONINFOA вместо GETBUTTONINFO, но результат тот же.

Что я делаю неправильно?

1

Решение

Решил это. Проблема была в том что TBBUTTONINFO структура содержит указатели, которые принимают двойной размер в 64-битных процессах. Я сделал свою собственную структуру, заменив указатели на int64, и с этой структурой SendMessage работает, как и ожидалось. Спасибо всем за помощь.

3

Другие решения

Начиная с Windows Vista, изоляция привилегий пользовательского интерфейса предоставляет ограничения для системы, которые не позволяют приложениям с более низкими привилегиями отправлять оконные сообщения или устанавливать перехватчики в процессах с более высокими привилегиями. Однако приложениям с более высокими привилегиями все еще разрешается отправлять оконные сообщения процессам с более низкими привилегиями. Эти ограничения реализованы броском SendMessage и другие функции отправки сообщений.

Я не уверен, является ли это причиной вашей проблемы, потому что в общем случае сообщения только для чтения не блокируются даже процессами с более низкими привилегиями. Ваш TB_GETBUTTONINFO кажется, такое сообщение, то же самое для TB_BUTTONCOUNT а также TB_GETBUTTON, Тем не менее, вы должны исследовать это.

Увидеть Дизайн механизма целостности Windows для дополнительной информации.

1

По вопросам рекламы [email protected]