• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

跨进程访问VCL的一个用例(Delphi6、TurboDelphi测试通过)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
高吞吐量的一个日志函数类(Delphi)发布时间:2022-07-18
下一篇:
https://www.cnblogs.com/hnxxcxg/p/6085149.htmlDELPHI微信支付代码发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap