【发布时间】:2014-04-29 03:43:16
【问题描述】:
我正在尝试自动化应用程序(Windows 8、Delphi XE)。对于我的测试,我正在执行以下操作:
- 创建了一个小型测试应用程序,由一个表单和一个备忘录 (Form1) 组成
- 添加了一个新的 ActiveX 对象,CoClass 名称 TestOLE,线程模式 Apartment,Instancing Multiple(根据 this article。)
- 添加了一个方法
Method1,它只在Form1的备忘录控件中添加了一些文本
然后我启动应用程序并双击一个名为test.vbs 的文件,其中包含以下代码:
dim obj
set obj = GetObject("", "Project1.TestOLE")
obj.AddSomeText "Hola mundo"
当应用程序运行时,我看到创建了一个新表单,添加了文本然后退出。
我想要完成的是打开的应用程序应该改变它的备忘录文本。
我反复使用 MultipleInstance 和 SingleInstance 创建新项目,并且在启发式愤怒的爆发中,我什至将线程模型更改为单,但无济于事。
我在类型库编辑器中看到两个标志:“可替换”和“可聚合”。但是,选择“可替换”最终会导致生成的 RIDL 文件出错。
我已经阅读了很多关于GetObject 的信息。看来它的文档甚至是错误的(它说您可以省略第一个参数,但我发现它不起作用)。
这是在 Delphi 中编写可重用的自动化服务器的正确方法吗?
【问题讨论】:
-
您的问题似乎是关于 VBScript 和 GetObject,而不是关于 Delphi。如果是关于 Delphi,您是否可以访问任何早期版本,例如 Delphi 5/7/2007?它们都包含 COM 自动化的示例(例如,在 2007 年,它们位于 Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto 中)。
-
您说得有道理,但我不确定它是否与 GetObject 有关,因为文档和示例表明它应该重用正在运行的应用程序。我不是会为此编写客户端的人。
-
好吧,您的问题显示了 VBScript,谈到了 GetObject()(它不是 Delphi),并询问了为什么 VBScript 不重用正在运行的应用程序。您在这里问的具体 Delphi 相关 问题是什么? (您确实也看到了我在早期 Delphi 版本中提到的现有示例?)
-
得到它的工作(显然,一个永远不知道与 COM。)我会更新这个问题。
-
:-) 仅供参考,Delphi 中使用后期绑定的典型方法是首先使用 GetActiveOleObject 尝试连接到正在运行的实例,如果失败则使用 CreateOleObject 启动新实例。 (两者都在 ComObj 单元中。)