使用COM自动化应用程序

使用COM自动化应用程序,com,vbscript,automation,dispatch,Com,Vbscript,Automation,Dispatch,我正在为现有应用程序构建一个自动化接口。在实现了DLL服务器和EXE服务器(主要是为了熟悉COM的基础知识)之后,我现在可以从IDL文件生成一个类型库,例如,基本上可以从VBScript自动化我的应用程序: Set oApp = CreateObject("MyApp.1") oApp.ShowAboutBox() 这个对不带参数的函数的简单调用是有效的。我想做的下一步是调用一个带参数的函数 IDL文件中函数的签名为 HRESULT CreateSomeChildWindow([out, r

我正在为现有应用程序构建一个自动化接口。在实现了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
(例如,通过在VBScript中调用
CreateObject

问题:

现在我想知道是否有必要注册
MyChildWindow
。为了在VBScript中调用
CreateSomeChildWindow
,我的假设正确吗

  • 我需要写
    Dim-own作为MyChildWindow
  • 要使其工作,必须注册MyChildWindow

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

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

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


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

听起来不错,但是调用
oApp.CreateSomeChildWindow()
会给我一个错误,说参数的数量不正确。我需要什么语法?如上所述,它工作在C++中——所有需要的代码都在服务器上。语法看起来很好(至少在问题中引用)。我首先要检查的一个原因是,在更新类型库并在其中添加新方法之后,您重新注册了它。很可能脚本仍然以某种方式使用较旧的语法。嗯,不,IDL文件已经有一段时间没有更改,类型库刚刚注册。但有一件事我不明白,那就是如何在IDL上定义
MyChildWindow
。我接受这个答案,因为它解决了最初提出的问题-谢谢!仍然存在一些与VBScript绑定相关的问题,但如果需要,我将为这些问题输入一个单独的问题。