提个难题,取另外一个程序DBGrid中的数据,这个DBGrid在一个BPL中不是在Exe文件中

踢踏 2006-06-18 01:25:18
如果DBGrid直接在可执行Exe中,那么比较好取数据,网上的分析和例子很多。
但是DBGrid在一个BPL中(或者在Dll中),由Exe调用BPL(Dll)里面的窗体后显示的DBGrid,各位有没有方法取得。

...全文
759 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
踢踏 2006-06-24
  • 打赏
  • 举报
回复
抱歉,那个被Hook的对象是不适合于向外散播。
如果需要这个文件http://lichengbin.iii-grp.com/Source/DBGrid.rar,我可以发给你。
tetsuya 2006-06-24
  • 打赏
  • 举报
回复
记录~
CACACACACA 2006-06-24
  • 打赏
  • 举报
回复
你给的链接打不开.
我取得了DBGrid,通过DataSource取DataSet中的数据没有问题.
踢踏 2006-06-24
  • 打赏
  • 举报
回复
那么你可以试着取DBGrid中的数据看看,是否成功。
-----------------------------------
1.对于Windows的Standard Controls,基本上大家应该是都会的:
GetWindowText,WM_GETTEXT可以获取EDIT的文本内容;
LB_GETTEXT可以获取LISTBOX列表项的文本内容;
CB_GETLBTEXT可以获取COMBOBOX下拉列表项的文本内容;
这里我就不多说了。
对于Windows的Common Controls,如LISTVIEW、TREEVIEW等,在本进程自身中获取的话可以直接用LVM_GETITEMTEXT,TVM_GETITEM消息,跨进程的话,还需要另外用到一些API函数,有兴趣的可以看看这个贴子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3224504
DBGrid是Delphi的自写控件,不是Windows控件,没有什么消息可以利用来获取它所显示的数据记录内容。
CACACACACA 2006-06-24
  • 打赏
  • 举报
回复
其实我很想看看,其它高手是怎么搞定的(感觉自己的方法还是比较简单的,取BCB6包中FORM上的DBGrid的内容,设置DBGrid的颜色,字体都成功了).
我用SendMessage(Hnwd, RM_GetObjectInstance, 0, 0))
踢踏 2006-06-23
  • 打赏
  • 举报
回复
已经发了,请查收。
王集鹄 2006-06-23
  • 打赏
  • 举报
回复
http://lichengbin.iii-grp.com/Source/DBGrid.rar下载不了
发一个给我也可以wjhu111@21cn.com,能调试先
踢踏 2006-06-23
  • 打赏
  • 举报
回复
四星级人物出动了,幸会,幸会
踢踏 2006-06-23
  • 打赏
  • 举报
回复
可参考这里的说明:
http://nishuixingzhou.blogchina.com/4853833.html
王集鹄 2006-06-23
  • 打赏
  • 举报
回复
看http://nishuixingzhou.blogchina.com/4853833.html中,先顶一下
王集鹄 2006-06-23
  • 打赏
  • 举报
回复
先告诉我取另外一个程序DBGrid中的数据怎么取?就是在Exe中的
CACACACACA 2006-06-23
  • 打赏
  • 举报
回复
对了, LZ把你的exe+bpl(dll)文件,给我一份. 我测试一下.
jjwandjy@yahoo.com.cn
CACACACACA 2006-06-23
  • 打赏
  • 举报
回复
up
踢踏 2006-06-23
  • 打赏
  • 举报
回复
自己顶一下
踢踏 2006-06-23
  • 打赏
  • 举报
回复
那就晕菜了。
我要取得数据程序的是用BCB5.0编的,我现在用的Delphi7。
另外,数据窗口并不是TDBGrid,而是TDBGridE。

从上面跟踪的结果来看,
hCtrl:13437334; -传入的Form.handle
OwningProcess:2488;
ControlAtomString:ControlOfs4000000000000F50;
GetProp:22953984;
GetProp OK;
pControl.Handle:22975524;-里面得到的Form.handle
这两个Handle值并不一致。
王集鹄 2006-06-23
  • 打赏
  • 举报
回复
首先确认pControl.Handle:22975524和你的窗体句柄一致
Delphi不同版本的类型大小并不一样
各种函数地址偏移也不一样,跨版本的读取又的琢磨琢磨了
踢踏 2006-06-23
  • 打赏
  • 举报
回复
你的方法确实很管用。用GetWindowLong(hCtrl, GWL_HINSTANCE) 代替 GetModuleHandle 函数解决了 参数问题。
起初取Dll中的DBgrid时,要用Dll文件名代替nil参数,取Bpl时,要用VCL50.bpl代替nil参数。

现在问题就很怪了,我用窗口 hCtrol=Form1.Handle 传入,可以取得窗口的实例,返回的Handle有值。

跟踪如下:
ProcessID:2488;
GetCurrentThreadID:3920;
hCtrl:13437334;
OwningProcess:2488;
ControlAtomString:ControlOfs4000000000000F50;
GetProp:22953984;
GetProp OK;
pControl.Handle:22975524;
ControlName:Form1;

我用hCtrol=DBGrid1.Handle传入,可以取得DBGrid1的实例,但Handle却为0,后续步骤不能操作
ProcessID:2488;
GetCurrentThreadID:3920;
hCtrl:1509762;
OwningProcess:2488;
ControlAtomString:ControlOfs4000000000000F50;
GetProp:22975928;
GetProp OK;
pControl.Handle:0;
ControlName:DBGrid1;



王集鹄 2006-06-23
  • 打赏
  • 举报
回复
根据hCtrl得到的信息更可靠一些,其他的读取方法类似
王集鹄 2006-06-23
  • 打赏
  • 举报
回复
// 获取目标进程中DBGrid的数据集的记录内容,保存到文件中
procedure ProcessDataSet(hCtrl: HWND);
//....
begin
ControlAtomString := Format('ControlOfs%.8X%.8X', [GetWindowLong(hCtrl, GWL_HINSTANCE), GetWindowThreadProcessId(hCtrl)]);
ControlAtom := GlobalAddAtom(PChar(ControlAtomString));
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));

Grid := TDBGrid(FindControl(hCtrl)); // 根据句柄取得对象实例
//....
end;


//....
initialization
(*
ControlAtomString := Format('ControlOfs%.8X%.8X', [GetModuleHandle(nil), GetCurrentThreadID]);
ControlAtom := GlobalAddAtom(PChar(ControlAtomString));
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));
*)
//....
end.
踢踏 2006-06-22
  • 打赏
  • 举报
回复
呵呵,发点内幕消息,参考参考
加载更多回复(14)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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