高分求解...跨进程操作CRichEditCtrl的问题.

haiwangstar 2004-07-18 12:05:06
CString rtfPrefix;
rtfPrefix = "chinese";
CString rtfString = rtfPrefix;
EDITSTREAM es = {(DWORD)&rtfString, 0, EditStreamCallBack};

DWORD dwProcessID;
HANDLE hProcess;
DWORD dwBytesRead, dwBytesWrite;
BOOL bSuccess,bWriteOK;
HWND hWindow = (HWND)0x60198;


GetWindowThreadProcessId(hWindow,&dwProcessID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if(!hProcess) //得不到指定进程的句柄
return;
//在指定进程内分配存储空间
LPVOID esRemote=VirtualAllocEx(hProcess,NULL,sizeof(EDITSTREAM),MEM_COMMIT,PAGE_READWRITE);
LPVOID stringRemote=VirtualAllocEx(hProcess,NULL,rtfPrefix.GetLength(),MEM_COMMIT,PAGE_READWRITE);
if((!esRemote) || (!stringRemote)) //不能在指定进程内分配存储空间
return;
bWriteOK = WriteProcessMemory(hProcess,esRemote,(LPVOID)&es,sizeof(EDITSTREAM),(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //写内存错误
return;
bWriteOK = WriteProcessMemory(hProcess,stringRemote,(LPVOID)&rtfString,rtfString.GetLength(),(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //写内存错误
return;

::SendMessage((HWND)0X90200,EM_STREAMIN,(WPARAM)SF_TEXT,(LPARAM)esRemote);


在一个进程中操作另一个进程中的RichEdit对象,向其中追加文本,但执行到最后一句时(发送消息),会导致目标程序崩溃,前面分配内存等等操作,全部成功..不成为什么.
谢谢大家帮忙..
...全文
65 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
roger_ding 2004-07-20
  • 打赏
  • 举报
回复
怎么能不挂了呢!

EDITSTREAM es = {(DWORD)&rtfString, 0, EditStreamCallBack};
两个错误:
1。es的DWORD_PTR dwCookie赋值错误,怎么也要改成stringRemote吧
2. 最主要的错误:EditStreamCallBack,这个函数的地址在当前进程内,让别的进程也访问此回调函数,当然会挂了

要么用SetWindowText(没试过),要么把你的函数拷到目标进程内,当然,要考虑的东西就更多了,例如开始的“push ebp mov ebp, esp”,等等…… 还有地址的引用,函数的调用,你自己多试试吧
会思考的草 2004-07-20
  • 打赏
  • 举报
回复
GetLastError?
  • 打赏
  • 举报
回复
关注

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧