“通过ReadProcessMemory来获取系统托盘区图标的位置”产生的有关问题

“通过ReadProcessMemory来获取系统托盘区图标的位置”产生的问题
获取图标信息的代码,已经有了,并且运行正常。
代码有以下几点,不是很理解。。。

C/C++ code

TBBUTTON Info;
HANDLE ProcessHandle;
DWORD ProcessId;
LPSTR Buff;
int Count;

// ...
ProcessHandle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, ProcessId);
Buff = (LPSTR)VirtualAllocEx(ProcessHandle, NULL, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);// ⑴

Count = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
for (i = 0; i < Count; i++)
{
    memset(&Info, 0, sizeof(Info));
    WriteProcessMemory(ProcessHandle, Buff, &Info, sizeof(Info), &NumberOfBytesProcessed);
    SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)Buff);// ⑵
    ReadProcessMemory(ProcessHandle, Buff, &Info, sizeof(Info), &NumberOfBytesProcessed);// ⑶
    //...
}
// ...



⑴, ⑶ 大致没什么问题。
关键是 ⑵, SendMessage 一个 TB_GETBUTTON 消息,把结果放到 Buff 指定的地方。

我这里不理解:SendMessage 难道能区分Buff是哪个进程的地址,从而指定由相应进程来处理吗?
因为,我又在之后 SendMessage 一个 TB_GETBUTTONTEXT 消息,但是最后一个参数传错值了,(计算偏移时,想把起始地址Buff转换成PBYTE,结果转换成BYTE了),结果,explorer.exe 访问违规, 崩溃了。

我很纳闷,根据我的理解,应该是我的程序访问违规啊。

难道是我对 ⑴ 的理解不太透彻?求解惑。

这个问题,我觉得是系统机制问题,就发到这里了,希望能够有人看到。。。

------解决方案--------------------
关键是 ⑵, SendMessage 一个 TB_GETBUTTON 消息,把结果放到 Buff 指定的地方
????
这个是把buffer当做消息参数给hwnd窗口发过去了吧
------解决方案--------------------
老弟,好好看看MSDN对这几个函数的说明吧。WriteProcessMemory的说明,在ProcessId的进程中传
错了参数,肯定是要出问题。

------解决方案--------------------
w你操作的是Explorer进程,当然崩溃的是Explorer了。