2013-05-22 19 views
6

Sto provando a utilizzare getref per chiamare una funzione dalla libreria di funzioni associata al test. Il mio codice -Come chiamare una funzione (con parametri) che si trova nella libreria delle funzioni, prendendo il nome della funzione da una variabile?

In action1

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

Nella libreria di funzioni,

Function Function_sample(strMsg) 
    Function_sample = strMsg 
End Function 

Sto ottenendo l'errore -

"Invalid procedure call or argument."

ma funziona bene se la funzione è posto nella stessa azione. Come chiamare una funzione (con parametri) che si trova nella libreria delle funzioni, prendendo il nome della funzione da una variabile?

+1

il tuo codice 'funziona' come VBScript pianura, ci deve essere un problema con il vostro (compresa del) biblioteca. –

+0

Non penso ['GetRef'] (http://msdn.microsoft.it/it/us/library/ekabbe10) funziona in VBScript semplice. –

+4

@AnsgarWiechers - ovviamente lo fa, vedere la mia risposta qui sotto. –

risposta

5

minimalista esempio funzionante:

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) 

uscita:

Il messaggio di errore "... errore di runtime: chiamata o argomento della procedura non valida: 'GetRef'" indica che la libreria delle funzioni (importazione della) è da incolpare.

Aggiornamento:

ho penso che è plausibile supporre che il motore VBScript mantiene una tabella che associa sub/funzione di nomi/metodo con il codice richiamabile per essere in grado di fare chiamate letterali/dirette:

n = Twice(11) 

e che GetRef ("Due volte") accede a questa tabella. Quindi non mi aspetterei mai che una chiamata indiretta/'puntatore di funzione' o un GetRef() falliscano quando l'invocazione letterale ha esito positivo.

Ma secondo this e that, ci sono almeno quattro modi per 'importazione' librerie/moduli in QTP e come Non faccio uso di QTP non posso escludere che alcuni (o anche tutti) di questi metodi fare qualcosa di sciocco per causare il comportamento scorretto che descrivi.

+0

Non penso che ci sia un problema con la mia libreria di funzioni (importazione della) perché funziona bene se chiamo direttamente la funzione (tramite il nome della funzione) senza usare getref. – Saranya

+0

@Saranya: verificare che l'errore si verifichi sulla riga GetRef(); isolare la chiamata GetRef(); pubblicare altro codice (come si "importa" una libreria in QTP?); potrebbe essere un problema di sequenza/ordine (come chiamare prima che la libreria sia caricata)? –

+1

Ho associato la libreria delle funzioni con il mio test e sono in grado di chiamare altre funzioni dall'azione. Inoltre, quando ho provato a chiamare la funzione utilizzando getref all'interno della libreria delle funzioni, ha funzionato correttamente. Ma ottengo l'errore quando chiamo la funzione usando getref dall'azione. Getref funziona solo per le funzioni locali? – Saranya

2

Ho affrontato lo stesso issue e ho scoperto che associare o caricare le librerie funzionali non funziona per GetRef. Per aggirare questo problema, tutto quello che devi fare è invece di associare o caricare il tuo FL, eseguirlo usando la funzione ExecuteFile.

In action1

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