使用COM自动化应用程序

时间:2012-11-17 12:06:05

标签: com vbscript automation dispatch

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

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 oWnd As MyChildWindow
  • 要使其正常工作,必须注册MyChildWindow

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

1 个答案:

答案 0 :(得分:0)

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

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

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