首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi 7自动化控制AutoCAD“无效类字符串”

Delphi 7自动化控制AutoCAD“无效类字符串”
EN

Stack Overflow用户
提问于 2017-04-05 17:39:17
回答 3查看 744关注 0票数 0

我的应用程序是用Delphi 7编写的,它用ActiveX向ActiveX发送命令。它对我的大多数客户都很好,但在一些罕见的情况下,它无法与AutoCAD通信并报告错误Invalid Class String (AutoCAD应用程序正在运行OK)。在这一行之后弹出错误:

代码语言:javascript
运行
复制
AcadV := GetActiveOleObject('AutoCAD.Application');

我找了这个问题很多次了,但找不到一个可行的解决办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-06 07:52:45

下面的小型控制台应用程序显示了如何在Windows注册表中注册自动化对象的名称。自动化对象需要有一个注册表项,以便您可以像在AutoCAD.Application中那样按名称调用它们

请注意,下面的IsRegistered函数并不保证可以使用CreateOleObject/GetActiveOleObject访问对象,但是,如果找不到预期的名称,很可能会出现错误,您可以通过重新安装自动化对象软件来修复。

代码语言:javascript
运行
复制
program CheckRegConsole;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows,
  Registry;

function IsRegistered(const ClassString : String) : Boolean;
var
  Reg : TRegistry;
begin
  Result := False;
  Reg := TRegistry.Create(Key_Read);
  try
    Reg.RootKey := HKey_Classes_Root;
    Result := Reg.KeyExists(ClassString);
  finally
    Reg.Free;
  end;
end;

var
  S : String;
begin
  S := 'Word.Application';  //  MS Word
  S := 'AcroExch.PDDoc';    //  Adobe Acrobat Document
  if IsRegistered(S) then
    writeln(S + ' registered')
  else
    writeln(S + ' not registered');
  readln;
end.

顺便说一句,在我(有限的)经验中,GetActiveOleObject并不总是在它应该成功的时候成功。因此,如果失败了,那么尝试CreateOleObject可能是值得的。

对于Delphi程序员来说,有一本很好的书,叫做Eric的"Delphi COM编程“,如果你能拿到一本的话,互联网上有无数的自动化教程。参见https://msdn.microsoft.com/en-us/library/windows/desktop/ms221375(v=vs.85).aspx,以了解MS对这一主题的看法。

票数 2
EN

Stack Overflow用户

发布于 2020-09-04 12:12:21

将文件api.py应用程序功能更改如下:

def应用程序(Self):如果comtypes.client.GetActiveObject('AutoCAD.Application.'+str(v)+'.1',为None: for v in range(35,15,-1):try: self._app = comtypes.client.GetActiveObject('AutoCAD.Application.'+str(v)+'.2',dynamic=True;除了WindowsError: try: self._app = self._app dynamic=True);除了WindowsError: try: try: self._app =comtypes.client.GetActiveObject(‘AutoCAD.Application.’+str(v)+‘.2’,dynamic=True);除了WindowsError: next;

代码语言:javascript
运行
复制
    return self._app
票数 0
EN

Stack Overflow用户

发布于 2020-09-06 14:26:03

AutoCAD 1011的正确命令是

代码语言:javascript
运行
复制
AcadV := GetActiveOleObject('AutoCAD.Application.18');

AutoCAD更新版本的数字为18 (我认为2013年为19,2021年为23 )。我已经创建了一个条目,用户可以根据他们的版本更改这个数字,现在我的应用程序可以运行所有的AutoCAD版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43238069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档