我的应用程序是用Delphi 7编写的,它用ActiveX向ActiveX发送命令。它对我的大多数客户都很好,但在一些罕见的情况下,它无法与AutoCAD通信并报告错误Invalid Class String
(AutoCAD应用程序正在运行OK)。在这一行之后弹出错误:
AcadV := GetActiveOleObject('AutoCAD.Application');
我找了这个问题很多次了,但找不到一个可行的解决办法。
发布于 2017-04-06 07:52:45
下面的小型控制台应用程序显示了如何在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程序员来说,有一本很好的书,叫做Eric的"Delphi COM编程“,如果你能拿到一本的话,互联网上有无数的自动化教程。参见https://msdn.microsoft.com/en-us/library/windows/desktop/ms221375(v=vs.85).aspx,以了解MS对这一主题的看法。
发布于 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;
return self._app
发布于 2020-09-06 14:26:03
AutoCAD 1011的正确命令是
AcadV := GetActiveOleObject('AutoCAD.Application.18');
AutoCAD更新版本的数字为18 (我认为2013年为19,2021年为23 )。我已经创建了一个条目,用户可以根据他们的版本更改这个数字,现在我的应用程序可以运行所有的AutoCAD版本。
https://stackoverflow.com/questions/43238069
复制相似问题