I have some code like this:
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);
where hwnd
- is a toolbar handle. This handle is correct, other messages(like TB_BUTTONCOUNT
or TB_GETBUTTON
) work fine.
So, this code is working correctly under Windows XP, but when I try to execute it under Windows 7 x64 SendMessage
returns -1, which means an error. I tried to use GETBUTTONINFOA
instead of GETBUTTONINFO
, but result is the same.
What am I doing wrong?
Solved it. Problem was that TBBUTTONINFO
structure contains pointers, which take double size in 64-bit processes. I made my own structure, replacing pointers with int64, and with this structure SendMessage work as expected. Thanks to everyone for help.