跨进程访问VCL的一个用例(Delphi6、TurboDelphi测试通过)
Controls.pas单元中有一个FindControl函数,通过句柄获得对应的TWinControl对象。
function FindControl(Handle: HWnd): TWinControl;
begin
Result := nil;
if (Handle <> 0) then
begin
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
else
Result := ObjectFromHWnd(Handle);
end;
end;
由于,进程间内存地址是相对的,所以直接访问这个对象会出现内存异常。
procedure InitControls;
var
UserHandle: HMODULE;
begin
WindowAtomString := Format('Delphi%.8X',[GetCurrentProcessID]);
WindowAtom := GlobalAddAtom(PChar(WindowAtomString));
ControlAtomString := Format('ControlOfs%.8X%.8X', [HInstance, GetCurrentThreadID]);
ControlAtom := GlobalAddAtom(PChar(ControlAtomString));
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));
//...
end;
另外FindControl函数用到的变量(如:WindowAtomString)和具体线程ID有关。
大概的步骤是:
1、创建一个hook,以便跨进程访问内存空间;
2、自定义FindControl方法,按目标窗体所在线程组装参数;
3、获得TWinControl对象;
4、通过WM_COPYDATA消息返回查询内容。
http://blog.csdn.net/zswang
http://download.csdn.net/detail/zswang/1107748
http://download.csdn.net/download/liangpei2008/1985753
Delphi跨进程访问DBGRID
http://www.cnblogs.com/key-ok/p/3358898.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步