51Testing软件测试论坛

标题: 来几个大龙虾看看,关于QTP调用WIN API的问题.. [打印本页]

作者: mythxhg    时间: 2007-12-5 16:00
标题: 来几个大龙虾看看,关于QTP调用WIN API的问题..
extern.Declare micLong,"SendMessageA","user32.dll","SendMessage",micHwnd,micDWord  ,micWParam,micLParam

Dim hwnd_1
hwnd_1 = Window("FBMP").Window(">> 新 增").Window("Window").WinObject("TbsListBox").GetROProperty("hwnd")

Dim MyContent
tag = extern.SendMessageA (hwnd_2,&H0189,2,MyContent )

        LB_GETTEXT 的 DWORD就是&H0189,上面那句是想获得LISTBOX下索引为2的列表的内容,但是发现返回为空.我获取行数和选择指定行都成功了,唯独这个获取指定行文本的不能通过,
        还有我打算定义一个MyContent的字符串变量,然后将指针放到SendMessage的第4个参数上传过去.我对VB不熟悉,以前只用过C++和JAVA等,不知道QTP这里的类型要怎么跟API的过度,还有我用ByVal,和ByRef去指定传递的是地址或者直,但都提示语法错误,不是直接 ByVal + 变量名这样吗?
作者: jackymail    时间: 2007-12-5 18:02
GetRoProptery 能取到hwnd属性吗?
作者: mythxhg    时间: 2007-12-5 18:31
标题: 回复 2# 的帖子
可以
作者: gy21st    时间: 2007-12-5 19:55
QTP调用windows API局限限很大,比如说参数为结构的话不能调用,数据类型只能用指定的几种。
对于引用参数的传递,VBScript中的定义是 function abc(byref x, byref y)。
API声明中用类似 micDWord+micByRef 表示输出值

附件希望对你有用。
作者: mythxhg    时间: 2007-12-6 09:51
标题: 回复 4# 的帖子
非常感谢,希望有所收获
作者: mythxhg    时间: 2007-12-6 10:29
暂时我还是采用了笨方法,把WIN API的使用封装到自己用C++打的DLL上,再使用QTP传一些可以传递的参数过去,哎,

VB虽然都说没指针,不过拜读过一些文章,好象有一些方法可以让VB也有指针的相同功能,其实JAVA说没指针,不过是说没有显式的指针而已,JAVA里的引用实际上就是一个地址访问操作.不过自己VB没基础,也是前几天第一次用QTP时才开始接触VB,所以在VB如何接收返回的指针以及类型过度上的一些细节问题上比较糊涂.

希望各位继续知无不言,言无不尽,多多提点提点
作者: gy21st    时间: 2007-12-6 11:28
标题: 回复 6# 的帖子
你的方法是正解。对于很多QTP无法直接支持的API,只有自己再封一层。
另外,QTP的脚本是VBScript,不是VB,很多VB的特性都没有的。
作者: mythxhg    时间: 2007-12-6 12:48
标题: 回复 7# 的帖子
啊哦,那对QTP真的是比较失望啊.这样的话可编程性反而不及WINRUNNER了
作者: jackymail    时间: 2007-12-6 13:09
extern.Declare micLong,"SendMessageA","user32.dll","SendMessage",micLong ,micLong ,micLong ,micLong  

Dim hwnd_1
hwnd_1 =Window("Notepad").WinEditor("Edit").GetROProperty("hwnd")
msgbox hwnd_1

Dim MyContent
tag = extern.SendMessageA (hwnd_1,&H0189,2,1 )
msgbox tag
我用这样得到的tag是非0的值。不明白你想发什么消息过去,可否详细讲讲你最终干了什么,最好用calc.exe或者notepad.exe来解释,那样大家比较容易交流,谢谢了。
作者: mythxhg    时间: 2007-12-6 13:22
不是拿TAG值,,&H0189的宏定义是LB_GETTEXT,我们将变量MYCONTENT的地址传递过去给API,API发送消息到指定句柄后将LISTBOX上指定的TEXT值存到接收到的地址所指的内存里,然后我们就可以直接使用MYCONTENT来访问到所拿到的TEXT了.

我现在实际上是在用自己的方法去精确的操作一些QTP无法操作的COMOBOX类的控件,现在基本上解决了.
作者: mythxhg    时间: 2007-12-6 13:27
现在想一想,反而是用WINRUNNER更容易实现
作者: jackymail    时间: 2007-12-6 13:27
tag的值代表消息是否发送成功。
不过,anyway,看不懂,谢谢了。
作者: mythxhg    时间: 2007-12-6 13:42
是这样,TAG值是是否成功的返回值,单纯从&H0189着个是谁也记不了怎么用的,你进VC++里查一下WINUSER.H就可以大概知道了.
同样的东西放到QTP上运行不了,所以现在也惟有用VC封装一层DLL了..
看看以后有没一些工具的语言是真正意义的编程语言而不是脚本语言.如果有个语言是使用VC++的测试工具就好了,呵呵
作者: gy21st    时间: 2007-12-6 13:43
标题: 回复 11# 的帖子
当然,QTP更傻瓜一些。对于没有编程经验的用户更容易上手。其留给用户的操作空间也会小一些。

[ 本帖最后由 gy21st 于 2007-12-6 13:45 编辑 ]
作者: 板砖    时间: 2007-12-7 12:02
估计是由于变量的类型问题所引起.
QTP中不能明确定义类型,这会导致在使用某些API时无法取得返回值.

例:
Dim s As String * 800
T = GetWindowText(2556516, S, 800)
以上代码在Vb中可以正常运行.
但换到QTP后
Dim s As String * 800 这行变为非法.
就会导致
T = GetWindowText(2556516, S, 800)
S无法取得返回值,但该函数正常运行.

正在想办法如何绕过一问题.
有知道的朋友希望能赐教.
作者: mythxhg    时间: 2007-12-7 12:06
标题: 回复 15# 的帖子
你问的正是我要问的,上面的兄弟说了,QTP的语言是VBS,而不是VB,一个是脚本语言,一个是编译语言,外貌差不多,但是实在差太远了
作者: jackymail    时间: 2007-12-7 12:38
算了,龙虾级的话题,我还是不要再插嘴了,不好意思,又占了个坑

[ 本帖最后由 jackymail 于 2007-12-7 12:44 编辑 ]
作者: mythxhg    时间: 2007-12-7 13:35
标题: 回复 17# 的帖子
你自己不就是龙虾么,有什么呢,交流而已.
作者: qicyt1812    时间: 2007-12-10 13:21
我来逛逛,很长时间不用QTP了
作者: tiangou99073    时间: 2008-1-26 11:01
不错,启发很大




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2