Delphi 7 自动化控制 AutoCAD"无效类字符串"



我的应用程序是用Delphi 7编写的,它使用ActiveX向AutoCAD发送命令。它对我的大多数客户来说工作正常,但在极少数情况下,它无法与 AutoCAD 通信并报告错误Invalid Class String(AutoCAD 应用程序运行正常)。错误在此行之后弹出:

AcadV := GetActiveOleObject('AutoCAD.Application');

我已经搜索了很多这个问题,但我找不到可行的解决方案。

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

请注意,IsRegistered下面的函数不保证您将能够使用 CreateOleObject/GetActiveOleObject 但是,如果在那里找不到预期的名称 很可能有问题,您可以通过重新安装来修复 自动化对象软件。

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程序员来说,有一本非常好的书叫做"Delphi COM编程" 作者:埃里克·哈蒙(Eric Harmon),如果你能拿到一份副本,还有无数的自动化 互联网上的教程。 例如,请参阅 https://msdn.microsoft.com/en-us/library/windows/desktop/ms221375(v=vs.85).aspx以获取MS对该主题的看法。

将文件 api.py 应用程序功能更改为以下内容:

Def App(Self): 如果self._app为"无": 对于范围(35,15,-1)中的 V: 尝试: self._app = comtypes.client.GetActiveObject('AutoCAD.Application."+str(v), dynamic=True) 破; 除了Windows错误: 尝试: self._app = comtypes.client.GetActiveObject('AutoCAD.Application."+str(v)+'.1', dynamic=True) 破; 除了Windows错误: 尝试: self._app = comtypes.client.GetActiveObject('AutoCAD.Application."+str(v)+'.2', dynamic=True) 破; 除了Windows错误: 下一个;

return self._app

AutoCAD 1011 的正确命令是

AcadV := GetActiveOleObject('AutoCAD.Application.18');

新版本的AutoCAD的数字18发生了变化(我认为2013年为19,2021年为23)。我创建了一个条目,用户可以在其中根据其版本更改此数字,现在我的应用程序适用于所有AutoCAD版本。

相关内容

  • 没有找到相关文章

最新更新