【问题标题】:Automating an Application using COM使用 COM 自动化应用程序
【发布时间】:2012-11-17 12:06:04
【问题描述】:

我正在为现有应用程序构建自动化界面。在实现了一个 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()

尽管MyChildWindow 当前未在注册表中注册为 COM 对象,但此调用已在 C++ 中工作MyChildWindow 不需要被注册的原因是CreateSomeChildWindow 只是在参数中返回指向创建的MyChildWindow 对象的接口指针。它没有注册的原因是我想避免冗余,而且我不希望直接实例化MyChildWindow(例如通过在VBScript中调用CreateObject)。

问题:

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

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

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

【问题讨论】:

    标签: com vbscript automation dispatch


    【解决方案1】:

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

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

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

    【讨论】:

    • 听起来不错,但调用oApp.CreateSomeChildWindow() 给我一个错误,说参数的数量不正确。我需要什么语法?如前所述,它可以从 C++ 调用——就服务器而言,所有必需的代码都在那里。
    • 语法看起来不错(至少看问题中引用的内容)。我首先要检查的一个原因是您在更新类型库并在那里添加了一个新方法后重新注册了它。脚本可能仍然以某种方式使用旧语法。
    • 嗯,不,IDL文件有一段时间没变了,类型库刚刚注册好了。
    • 我不明白的一点是你如何在 IDL 上定义 MyChildWindow
    • 我接受这个答案,因为它解决了最初提出的问题 - 谢谢!还有一些与 VBScript 绑定相关的问题,但如有必要,我会单独输入一个问题。
    猜你喜欢
    • 2013-06-24
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多