Martin
Martin

Reputation: 1

QTP VBScript type mismatch error in function without arguments

I have run into an annoying problem in QTP (Quick test pro) using VBScript.

I have defined this sub in VBScript (I have also tried defining it as a function with the same result):

Sub KillProcess()
  KillprocessIE = "The process i want to kill"
  Set ProcessList2 = GetObject("winmgmts://.").InstancesOf("win32_process")
  For Each Process In ProcessList2
    If Process.Name = KillProcessIE Then
      Process.Terminate
      Exit for
    End If
  Next
End Sub

But when I try to run it either by using

call KillProcess()
KillProcess()
KillProcess

I get an error saying "Typer stemmer ikke overens: 'KillProcess'" with translated from Danish means something like "Types does not match: 'KillProcess'. I am guessing it is a type mismatch error but due to translation I cant be sure.

What types is it talking about? I have no arguments in my function call and I am not assigning any values to anything?

It should also be said that if I run the exact same code directly without defining it as a function, it works without issue.

Upvotes: 0

Views: 16110

Answers (2)

Jakob Ojvind Nielsen
Jakob Ojvind Nielsen

Reputation: 972

I think you have run into the strange behavior QTP but though logic when you understand why.

The reason for why this occurs is probably because you "run from step" call KillProcess() and having the function defined above like:

Sub KillProcess()
        .
        .
        .
End Sub

call KillProcess()

If you run the code from "Call KillProcess()" QTP will return the "Run Error" "Type Mismatch"

If instead let the function be defined below the executing statement like this

call KillProcess()

Sub KillProcess()
        .
        .
        .
End Sub

Then QTP "knows" the function that you are calling and will execute the script like it should.

The reason for this is, that when using "Run from step" only reads the line of codes from the step and below and not what you have written above.

Upvotes: 1

TheBlastOne
TheBlastOne

Reputation: 4320

Whenever you call a sub or function that is not defined, you get a type mismatch error.

Even though this is a miracle per se (for which I could find a reasonable reasoning for only for functions, not for subs) it indicates that in your specific scenario, KillProcess was not known in the script in which you called it.

Possible causes:

  • The KillProcess declaration was in a function library which was not listed in the associated function library settings dialog.
  • The KillProcess declaration was active, but your call(s) contained one or more typos, like "KillProccess", or similar stuff.

As Motti indicated, the code snippet you posted looks fine, so there must be some other glitch.

Another hint regarding subs versus functions: Be aware that you usually never call a Sub with brackets for the arguments. If you do specify them, they are considered to be part of a term to be evaluated, and since

X term

is the same as

X (term)

this consequently does not yield an error message in this case. However, for Subs with two or more arguments, specifying all actual arguments in one bracket pair, like in

Y (term1, term2)

yields an error, something like "cannot call a Sub with arguments in brackets", or so. This is hard to understand if you consider that one argument indeed can be specified in brackets.

(For a more complete overview about the paranthesis topic, see ByRef and ByVal in VBScript and linked questions).

General suggestion: Use

option explicit

at the top of all scripts (especially function libraries) all the time. RTFM this if needed. It might look like more work (because it forces you to declare all variables before you can use them), but it is useful to avoid subtle bugs.

Upvotes: 3

Related Questions