0

我正在为现有应用程序构建自动化界面。在实现了 DLL 服务器和 EXE 服务器(主要是为了熟悉 COM 的基础知识)之后,我现在可以从 IDL 文件生成类型库,并且可以,例如,基本上从 VBScript 自动化我的应用程序:

Set oApp = CreateObject("MyApp.1") 
oApp.ShowAboutBox()

这个对不带参数的函数的简单调用是有效的。我要采取的下一步是调用一个带参数的函数。

IDL 文件中函数的签名是

HRESULT CreateSomeChildWindow([out, retval] MyChildWindow** ppChildWindow);

在 VBScript 中我认为它会是

Dim oWnd As MyChildWindow
oWnd = oApp.CreateSomeChildWindow()

此调用已在 C++ 中运行,但MyChildWindow当前未在注册表中注册为 COM 对象。MyChildWindow 不需要注册的原因是CreateSomeChildWindow简单地将接口指针返回到MyChildWindow参数中创建的对象。它没有注册的原因是我想避免冗余,而且我不想MyChildWindow被直接实例化(例如通过调用CreateObjectVBScript)。

问题:

现在我正在尝试找出是否有必要注册MyChildWindow。我的假设是否正确,以便调用CreateSomeChildWindowVBScript

  • 我需要写Dim oWnd As MyChildWindow
  • 为此,MyChildWindow必须注册

如果答案是肯定的,希望客户仍然不能MyChildWindow直接,因为我没有为它实现类对象?还是我必须实现一个类对象?

4

1 回答 1

0

您的 out/retval 不是一个对象(在脚本方面),它是一个接口指针。并且由于该方法CreateSomeChildWindow在 IDL、类型库、注册类型库中 - 脚本/自动化知道接口定义,例如方法等,因为整个类型库已经注册。您已经准备就绪,无需额外注册。

当调用者接收到一个接口指针时,它并不关心该指针属于哪个对象。单独的接口指针就足够了,脚本/自动化环境知道如何处理它。

然而,在被调用方,您需要返回一个接口指针,并且您正在处理对象。所以你需要一些实现这个接口的类,然后你返回这个对象的接口。

于 2012-11-17T18:18:06.383 回答