0

我正在尝试使用 AutoCad 打开文件夹中的所有 .dwg 文件并运行以前编写的脚本。为此,我构建了以下代码:

 Dim myapp As New Autodesk.AutoCAD.Interop.AcadApplication
 Dim docMgr As AutoCAD.Interop.AcadDocuments = myapp.Documents

 docMgr.Open(File.FullName, False)

谁能帮我理解为什么它不起作用?

首先,我收到“RPC_E_CALL_REJECTED”错误。但是我插入了一个句柄来读取 isQuiescent 状态,现在我只是在 AutoCad 空闲但静止时运行 .Open,Visual Studio 正在返回一个没有任何数字的错误。

COM 详细信息例外是:-2147418113

有人知道在 AutoCad 中简单地打开现有文件并运行脚本的正确方法吗?我不知道,我只是按照他们网页上的 AutoDest 说明进行操作,我认为这很容易:(

4

1 回答 1

2

在使用基于 Kean Walmsley 的建议的 AutoCAD 互操作对象时,我总是实现 IMessageFilter:http: //adndevblog.typepad.com/autocad/2012/05/cannot-instantiate-autocad-2010-from-an-external-net-application -安装后-更新-1.html

// IMessageFilter Interface
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000016-0000-0000-C000-000000000046")]
public interface IMessageFilter
{
    [PreserveSig]
    int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo);

    [PreserveSig]
    int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);

    [PreserveSig]
    int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
}

对于一个表单,它看起来像这样:

public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();
        CoRegisterMessageFilter(this, null);
    }

    int IMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
    {
        // SERVERCALL_ISHANDLED
        return 0;
    }

    int IMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
    {
        // Retry in a second
        return 1000;
    }

    int IMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
    {
        // PENDINGMSG_WAITNOPROCESS
        return 1;
    }

    [DllImport("ole32.dll")]
    private static extern int CoRegisterMessageFilter(IMessageFilter lpMessageFilter, IMessageFilter lplpMessageFilter); 

    ...


}

它似乎基本上是在告诉那些 COM 异常,让它们闭嘴,等待 AutoCAD COM 对象准备好。

于 2013-10-08T18:44:05.670 回答