2013-05-22 54 views
6

我试图使用getref从与测试相关的函数库中调用一个函数。 我的代码 -如何调用函数库中的函数(带参数),从变量中获取函数名称?

在动作1

str = "sample" 
msg = "hi" 
x = GetRef("Function_"&str)(msg) 
msgbox x 

在函数库,

Function Function_sample(strMsg) 
    Function_sample = strMsg 
End Function 

我得到的错误 -

"Invalid procedure call or argument."

但如果功能正常工作被放置在同一个动作中。 如何调用函数库中的函数(带参数),从变量中获取函数名称?

+1

为你的代码“作品”作为一个普通的VBScript中,都必须有您(含)的库问题。 –

+0

我不认为['GetRef'](http://msdn.microsoft。com/en-us/library/ekabbe10)以简单的VBScript工作。 –

+4

@AnsgarWiechers - 当然是,请参阅下面的答案。 –

回答

5

简约工作示例:

Lib.vbs:

Option Explicit 

Function Twice(n) 
    Twice = n + n 
End Function 

Main.vbs:

Option Explicit 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 

ExecuteGlobal goFS.OpenTextFile(".\lib.vbs").ReadAll() 

Dim fpTwice : Set fpTwice = GetRef("Twice") 

WScript.Echo fpTwice(42) 

输出:

cscript main.vbs 
84 

错误消息“...运行时错误:无效的过程调用或参数:'GetRef'”指示(导入)函数库的责任。

更新:

认为,这是合理的假设,VBScript引擎保持一个表子/功能/方法的名称与调用代码关联到能够做文字/直拨电话:

n = Twice(11) 

并且GetRef(“Twice”)访问此表。因此,当文字调用成功时,我绝不会期望间接/'函数指针'调用或GetRef()失败。

但根据thisthat,至少有四种方法可以“进口”库/模块到QTP,并因为我不使用QTP我不能排除,一些(甚至全部)这些方法会做一些愚蠢的事情,导致你描述的错误行为。

+0

我不认为有我的(导入)功能库有问题,因为它可以正常工作,如果我直接(通过函数名称)调用函数而不使用getref。 – Saranya

+0

@Saranya - 验证错误发生在GetRef()行;隔离GetRef()调用;发布更多你的代码(你如何在QTP中导入一个库?);它可能是序列/顺序的问题(就像在图书馆加载之前调用)? –

+1

我已将函数库与我的测试关联起来,并且可以从操作中调用其他函数。另外,当我尝试在函数库中使用getref调用函数时,它工作正常。但是当我从动作中使用getref调用函数时,我得到错误。 getref只适用于本地功能吗? – Saranya

2

我面临同样的issue,发现关联或加载功能库不适用于GetRef。要解决这个问题,你需要做的就是代替关联或加载你的FL,使用ExecuteFile函数执行它。

在动作1

ExecuteFile "/path/functionallibrary.vbs" 
str = "sample" 
msg = "hi" 
x = GetRef("Function_" & str)(msg) 
msgbox x 
相关问题