如何编写一个能读取Powerbuilder的数据窗口列表中数据的程序

DLL_Q 2005-02-16 10:59:19
各位高手:

我想编写从Powerbuilder的数据窗口中读取数据的程序(不是用powerbuilder开发的程序)。
具体说来就是:当PowerBuilder查询出结果后,会在数据窗口中显示其结果。数据窗口控件
类似于ListCtrl,但又不是标准控件。我试过用sendMsg的方法,但是失败了。
用发消息的方法可以读取标准控件ListCtrl的ItemText,但却无法读取‘数据窗口’
的值。因为我无法获得数据窗口的数据类型,而ListCtrl中的Item、Head的数据类型是可知的。
用SPY++可以获得数据窗口的类名,但仅此而已。

欢迎各位赐教,说说思路也可以的。

先行谢过,多谢了!
...全文
1319 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
j9dai 2005-03-10
  • 打赏
  • 举报
回复
学习ing......

楼上可不可以也发一份给我学习学习咯,3Q
jmj923dai@yahoo.com.cn
wu_07 2005-03-10
  • 打赏
  • 举报
回复
Function integer SndMsg(long hWnd, long uMsg, long wp, &
ref string filename) library "user32.dll" Alias For "SendMessageA"


long ll_dw_handle
ll_dw_handle = handle(dw_1)
string s
s="c:\111.txt"
SndMsg(ll_dw_handle, 1305, 2, s)


这样就把数据窗口的内容存到了文本文件111.txt

其他语言原理应该一样,改写就行了


消息的含义可以参考
http://www.mycgiserver.com/~unoksoftgroup/undocumented/undocumented_powerbuilder.html
berberine 2005-03-09
  • 打赏
  • 举报
回复
首先:回复lzheng2001(1加1=0) 网友:

如何得到dw的handle?---用vc里的SPY++即可,他的类名是:pbdw60(和版本号有关也有可能是pbdw80什么的),根据类名和窗口title即可得到句柄.

其次:回复 lzp_lrp(lzp)网友:
GetWindowText API恐怕仅可以得到诸如标准控件如:text,label等,其实就像DLL_Q说的那样,即便是
发送消息,最多得到listctrl的itemtext.而pbdw60压根不是标准ctrl.发送消息后,即便得到返回值又怎样?返回的data的数据结构是什么?字符串长度如何? "但第二种方法:你可以通过API函数
WindowFromPoint来取得"似乎有点占边了(后续再说).

麻烦的思路(按DLL_Q的思路):用任何可以反汇编的工具,反向pbdwe60.dll文件 得到真正的函数
dw_GetItemtext(,,)用它发消息(前提是已经知道dw handle),可以由汇编看到dw_GetItemtext有三个
参数 而PB的online help中有一个Getitemtext(,)后者当然真正调用的是前者.至于为何是三个参数
你可以看到 汇编压了三个参数入栈,三个参数必定有一个是item的data.之后用钩子取出data即可
怎么侵入dll请参见 windows核心编程 ,书中的引子有一个就是 第三方公司为Sybase打补丁的例子.
挺麻烦的!

还是简单一点的方法吧:接着lzp_lrp(lzp)的法2讲,WindowFromPoint恐怕得知道坐标,即便用鼠标定位
那么data太多时翻篇得问题恐怕考虑进去.

我觉得api的注入不可少,拦截textoutA textoutW,向每行的item发出画线的消息,于是windows需要调用API函数WindowFromPoint来(配合ScreenToClient) 来重绘窗口 ,事先注入的代码截获textoutA textoutW中的text于是目的达成.lzp_lrp(lzp) 说得不错

你告诉你为何要开发此项功能,我就发给你实现代码:xxxjjjppp@sina.com

---应该用引用功能回复就好了!
wjlforever 2005-02-20
  • 打赏
  • 举报
回复
学习学习!
WorldMobile 2005-02-17
  • 打赏
  • 举报
回复
我以前试过,可以的,用的是GetWindowText API函数来取的

具体的方法是:取得数据窗口的handle, 然后再取出数据窗口上的编辑框的handle, 然后从编辑框里取取文本,再向数据窗口发送tab键,使焦点移动,然后再取下一个,如此循环即可

至于为什么要取数据窗口上的编辑框的handle,这里解释一下,数据窗口当前焦点在的地方,其实是一个编辑控件,你列举一下窗口的控件你就会知道了.

如果有什么不明白的,发短信给我即可.
wantsong 2005-02-17
  • 打赏
  • 举报
回复
思路1,当PowerBuilder查询出结果后,会在数据窗口中显示其结果,然后将结果存入.xml,用不是pb的程序去解析这个xml。
思路2,自行开发一个控件,在不是pb的程序中调用
WorldMobile 2005-02-17
  • 打赏
  • 举报
回复
第一种方法:你可以通过列举数据窗口所在窗口的控件来取得

第二种方法:你可以通过API函数WindowFromPoint来取得
lzheng2001 2005-02-17
  • 打赏
  • 举报
回复
楼上的朋友,请问如何取dw上的编辑框的handle?

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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