CreateObject工作时,GetObject失败

时间:2019-12-16 00:44:49

标签: excel vbscript

我最近从他父亲大约30年前写的朋友那里得到了一个小型CG软件包。它有一个窗口,可以在其中创建和渲染一些实体图元。有趣的是,它具有VBA界面,我可以在Excel中(将其称为TheSoftware)使用Set app = CreateObject(“ TheSoftware.Application”)来创建这样的应用程序(在设置app之后。Visible为True,可以在屏幕上获取窗口) )!但是,GetObject(,“ TheSoftware.Application”)返回“ ActiveX组件无法创建对象”错误。对我而言,更令人惊讶的是,GetObject(“”,“ TheSoftware.Application”)成功创建了应用程序!我有大约900 KB的C ++源代码可以共享,但是为了快速起见,是否有人以前曾遇到过此问题,或者不清楚是什么问题?我不是C ++专家,作者于4年前辞世。我已经看到了“相反”的问题,即无法创建对象,但在获取对象时可以,但不是。任何想法都欢迎,谢谢!

1 个答案:

答案 0 :(得分:0)

GetObject(FName)打开一个文件或连接到一个文件(如果已打开)(如果指定了类,则使用该类来打开它),或者GetObject(,“ Appname”)连接到一个正在运行的应用程序实例。您正在创建一个空白文件。

  

Visual Basic脚本版

     

GetObject函数

     

另请参阅CreateObject函数

     

要求

     

版本5

     

从文件返回对自动化对象的引用

GetObject([pathname] [, class])
     

参数

     

路径名

     

可选;串。包含要检索的对象的文件的完整路径和名称。

     

如果省略路径名,则需要class。

     

class

     

可选;串。对象的类。

     

class参数使用语法appname.objectype并具有   零件:

     

使用GetObject函数从文件访问自动化对象   并将对象分配给对象变量。使用Set语句   将GetObject返回的对象分配给对象变量。对于   示例:

Dim CADObject
Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")
     

执行此代码后,与   指定的路径名​​已启动,并且指定文件中的对象为   活性。 如果路径名是长度为零的字符串(“”),则为GetObject   返回指定类型的新对象实例。如果路径名   省略参数,GetObject返回当前的活动对象   指定的类型。如果不存在指定类型的对象,则   错误发生。

     

某些应用程序允许您激活文件的一部分。添加一个   感叹号(!)到文件名的末尾,并在其后跟一个   字符串,用于标识您要激活的文件部分。对于   有关如何创建此字符串的信息,请参见文档   创建对象的应用程序。

     

例如,在绘图应用程序中,您可能有多层   到存储在文件中的图形。您可以使用以下代码来   在名为SCHEMA.CAD的图形中激活一个层:

Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")
     

如果您未指定对象的类,则Automation将根据文件确定要启动的应用程序和要激活的对象   您提供的名称。但是,某些文件可能支持多个类   对象。例如,工程图可能支持三种不同的类型   对象集:应用程序对象,图形对象和工具栏   对象,所有对象都是同一文件的一部分。指定哪个   要激活的文件中的对象,请使用可选类   论点。例如:

Dim MyObject
Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")
     

在前面的示例中,FIGMENT是绘图应用程序的名称   DRAWING是它支持的对象类型之一。一旦有物体   激活后,可以使用对象变量在代码中引用它   定义。在前面的示例中,您访问属性和方法   使用对象变量MyObject的新对象。例如:

MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW"
     

注意在当前实例存在时使用GetObject函数   对象的名称,或者如果您想使用文件创建对象   已加载。如果没有当前实例,并且您不希望   对象从加载文件开始,请使用CreateObject函数。

     

如果对象已将其自身注册为单实例对象,则仅   无论多少次,都会创建对象的一个​​实例   CreateObject被执行。对于单实例对象,GetObject   零长度调用时总是返回相同的实例   字符串(“”)语法,如果pathname参数为   省略。

     

要求版本5

     

另请参阅CreateObject函数

     
     

©2001 Microsoft Corporation。保留所有权利。

     

内部版本:主题版本5.6.9309.1546

这些也是每种表单进行的COM API调用。从COM文档的自动化部分开始。

  

CreateObject(“ ProgID”)

     
      
  • CLSIDFromProgID

  •   
  • CoCreateInstance

  •   
  • QueryInterface获取IDispatch接口。

  •   
     

GetObject(“文件名”,“ ProgID”)

     
      
  • CLSIDFromProgID

  •   
  • CoCreateInstance

  •   
  • 用于IPersistFile接口的QueryInterface。

  •   
  • 在IPersistFile界面上加载。

  •   
  • QueryInterface获取IDispatch接口。

  •   
     

GetObject(“文件名”)

     
      
  • CreateBindCtx为后续功能创建绑定上下文。

  •   
  • MkParseDisplayName返回BindMoniker的绰号句柄。

  •   
  • BindMoniker返回一个指向IDispatch接口的指针。

  •   
  • 释放标记句柄。

  •   
  • 发布上下文。

  •   
     

GetObject(“ ProgID”)

     
      
  • CLSIDFromProgID

  •   
  • 关于类ID的GetActiveObject。

  •   
  • QueryInterface获取IDispatch接口。

  •   
     

将x设为新界面

     
      
  • 查找接口的CLSID。

  •   
  • CoCreateInstance

  •   
  • QueryInterface

  •