WScript.CreateObject 在调用 C++ COM dll 函数时返回空

WScript.CreateObject returns empty when calling a C++ COM dll function

本文关键字:函数 返回 dll COM CreateObject 调用 C++ WScript      更新时间:2023-10-16

我有一个C++COM dll项目,当从VB脚本文件中的COM对象调用时,以下函数工作正常。

[id(1)] HRESULT ShowMessage([in] BSTR sMessage, BSTR sTitle); //<< .IDL File
STDMETHOD(ShowMessage)(BSTR sMessage, BSTR sTitle); //<< Header File
STDMETHODIMP CFoo::ShowMessage(BSTR sMessage, BSTR sTitle) //<< C++ Source File
{
MessageBox(0, CString(sMessage), CString(sTitle), 0);
return S_OK;
}

当我像这样从 VB 脚本调用它时,上面的函数工作正常:

Dim Test: Set Test = WScript.CreateObject("VbsEvents.dll")
Test.ShowMessage "Hello World!", "Windows Script Host"

但是,如果我声明如下函数:

[id(2)] HRESULT Add([in] int Value1, int Value2, [out] int *ReturnValue); //<< .IDL File
STDMETHOD(Add)(int Value1, int Value2, int *ReturnValue); //<< Header File
STDMETHODIMP CFoo::Add(int Value1, int Value2, int *ReturnValue) //<< C++ Source File
{
*ReturnValue = Value1 + Value2;
return S_OK;
}

并从 VB 脚本调用它,如下所示:

Dim Return: Test.Add 1, 2, CInt(Return)
WScript.Echo CStr(Return)

我一直没有得到任何回声,我希望这能回响 3 结果。我不知道为什么这个函数在 VB 脚本中不起作用。

感谢任何帮助,以找到此VB脚本代码不回显任何内容的原因。

你可以做的是从这里更改 IDL 签名

[id(2)] HRESULT Add([in] int Value1, int Value2, [out] int *ReturnValue);

对此

[id(2)] HRESULT Add([in] int Value1, int Value2, [out, retval] int *ReturnValue);

这在这里很有意义,因为它在语义上是一个返回值。有关此内容的信息,请参阅 retval 属性文档。

然后你可以在 VBScript 中这样调用它:

ret = Add(1, 2)

否则,请查看此内容以获取有关 VBScript 中的 byref 的更多信息:VBScript 中的 ByRef 和 ByVal