VBScript中的函数括号的使用

做的一个ActiveX后台组件,有个函数的定义为:

[id(1), helpstring("method GetData")] HRESULT GetData([out] VARIANT * pb);

GetData函数示例如下:

STDMETHODIMP CArrayBox::GetData(VARIANT *pb)
{// TODO: Add your implementation code here
    ::VariantClear(pb);
    pb->vt = VT_UI1 | VT_ARRAY;

    SAFEARRAYBOUND bound;
    bound.cElements = 200;
    bound.lLbound = 0;
    pb->parray = ::SafeArrayCreate(VT_UI1, 1, &bound);
    if (pb->parray == NULL)
        return E_FAIL;

    memcpy(pb->parray->pvData, "abcdefg", 7);
    return S_OK;}

在VBScipt中这样调用 o1.GetData(d) 是有问题的,d的类型和内容并不改变。需要 o1.GetData d 不加括号才是对的

另一个函数定义是:

[id(15), helpstring("method CreateNewFile")] HRESULT CreateNewFile([in] BSTR bstrOutFileName, [in] long nFormat, [out, retval] VARIANT *pbResult);

测试结果是:

o1.CreateNewFile("res.pmd", 6) 
错误是: 调用子程序时不能使用括号

o1.CreateNewFile "res.pmd", 6 
正确

res = o1.CreateNewFile("res.pmd", 6) 
正确

res = o1.CreateNewFile "res.pmd", 6 
错误是: 语句未结束

在网上看到这样的描述:

所有的方法, Function, Subroutine的呼叫都要加上小括号,但若呼叫Function但不需要Function 的回传值,或者Function不需要传入参数,可以使用不加小括号的方式呼叫, Subroutine不使用小括号也是可以的,但VB.NET中不再允许。

上面说“可以”不加小括号,但似乎是“必须”不加小括号。

又试了试上面的调用换成 k = o1.GetData(d),此时d的值就是对的了,但实际上原来的函数是没有返回值的。

有点想不明白VBScipt的机理。

标签: 技术