TestComplete的三种调用外部函数的方法

发表于:2007-9-25 11:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陈能技    来源:陈能技的博客

        TestComplete有三种调用外部函数的方法,分别是调用Win32API的函数,调用.NET Assembly的函数,调用DLL的函数。

调用Win32API的函数

        TC能调用那些Win32平台通用的函数,包括Windows 95、Windows 98、Windows NT,Windows 2000和Windows XP,不能调用那些只在Windows NT,2000,XP或Windows Server 2003才有的函数。

        在脚本编辑时,输入Win32API关键字后,使用Code Completion,会列出所有支持的函数调用。

调用Win32API的函数时需要注意两点:

        1、  因为Microsoft OLE不支持指针,所以你不能使用那些有指针参数的或者是返回指针给数据结构的API函数。有一个例外是:在某些函数,你可以传入0作为指针值。这个技巧可以帮助你调用某些特定的函数,例如CreateDC。

        但是,这个限制对那些使用数据结构的函数不生效。Win32API对象包括某些特定的方法(例如_DOCINFO)创建一个编程对象,为数据结构提供一个脚本接口。然后,你可以使用这个对象来填充结构区域并且传递这些结构给函数作为参数。例如,你可以调用_DOCINFO来为DOCINFO结构创建一个对象然后传递这个对象给StartDoc函数作为参数。

        2、  如果一个参数是作为引用传递的并且用于返回值,则返回值对于TC脚本而言无效。但是如果传入的引用参数是一个结构,那么你可以使用这种类型的API函数。TC提供一些包装的对象(Wrapper Object),即预定的结构,当然你也可以自己定义结构。

        例如,你可以使用TRect结构如下:

structRect := TRect;

        这个包装对象包含跟结构成员一致的属性,使用相同的名称。例如,下面脚本设置TRect结构的left和top边界值:

structRect.Left := 10;
structRect.Top := 10;

调用.NET Assembly的函数

        在TC脚本中你可以调用任何.NET assembly中的函数。可以是.NET Framework的,也可以是第三方.NET程序的。

        为了调用.NET Assembly的函数,先要在CLR Bridge的属性页选中使用assembly。

        在脚本中使用dotNET对象访问assembly提供的属性或方法。调用格式如下:

dotNET.namespace.class.subclass.method()

dotNET.namespace.class.subclass.property

        注意:namespace和class、subclass的名称之间用点隔开,而namespace名称中包含的分隔点要用下划线替换。

        如果类的实例不存在,你只能调用这个类的静态方法。要想调用属性和非静态方法,你应该首先通过这个类的构造器创建一个实例。通常类构造器的名称是_ctor。一个类可以有多个构造器(_ctor(),_ctor2(),_ctor3()等)。

        但是在VBScript中不能识别由下划线开头的标识符,因此为了让_ctor方法与VBScript兼容,TC修改了这些方法的名称,替换成z开头,例如调用_ctor3,则应该使用zctor3。

        下面例子说明如何在脚本中从mscorlib assembly创建String对象并调用其方法:

procedure AssemblyTest;
var
  s, i : OleVariant;
begin
  // Calling a constructor and a property
  // Note the absence of the underscore
  s := dotNET.System.String.ctor8($41, 3);
  Log.Message(s.Length);
 
  // Calling a static method
  s := dotNET.System.String.Copy('Test');
  Log.Message(s.OleValue); // Using the OleValue property
 
  // Calling a non-static method
  i := s.IndexOf('t');
  Log.Message(i);
end;

调用DLL的函数

        为了调用一个DLL的函数,你需要执行一系列的操作:

1、  定义DLL类型

2、  在TC中定义参数的数据类型

3、  定义函数类型

4、  创建数据结构并用数据填充

5、  加载DLL到内存

6、  调用函数

        例如,如果我们要从User32DLL中调用一个名叫DrawTextEx的函数,则需要以下步骤:

1、  定义DLL类型。

        使用DefineDLL方法来定义一个新的DLL类型如下:

Def_DLL:=DLL.DefineDLL(‘USER32’);

2、  看看函数定义和判断参数是否兼容OLE。TC引擎能处理OLE兼容的数据类型;OLE不兼容的数据类型则需要特殊处理。所以要判断参数类型。DreawTextEx定义如下:

int DrawTextEx(
  HDC hdc,
  LPTSTR lpchText,
 int cchText,
  LPRECT lprc,
  UINT dwDTFormat,
  LPDRAWTEXTPARAMS lpDTParams);

        其中有一些是OLE不兼容的数据类型,所以下一步是在TC中定义这些数据类型。

3、  定义参数类型。

        对于lprc,它是对RECT结构的指针,为了在TC中定义它的数据类型,调用DLL.DefineType方法。在TC中注册新的数据类型并返回ID。返回的ID可以用在其它数据类型或函数参数的定义上。例如下面脚本定义名叫MyStruct的结构类型:

DefType := DLL.DefineType('MyStruct', // name of the new structure
vt_i4, 'Value',
vt_byref or vt_i4, 'ValueByRef', // pointer to integer
vt_byref or myID, 'MyStruct2'); // pointer to structure MyStruct2

        注意DefineType注册的只是数据类型,不会创建这个类型的变量。要想创建这个新类型的变量,需要调用DLL.New,例如下面脚本调用DLL.New创建RECT类型的变量:

  r := DLL.New('RECT');

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号