做的一个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的机理。