我正在尝试使用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状态,现在我只是运行.Open当AutoCad空闲但仍然是,Visual Studio返回一个没有任何数字的错误。
COM详细信息例外情况是:-2147418113
有人知道简单打开现有文件并在AutoCad中运行脚本的正确方法吗?我不知道,我只是在他们的网页上关注了AutoDest指令,我认为这很容易:(
答案 0 :(得分:2)
我在使用基于Kean Walmsley建议的AutoCAD Interop对象时始终实现IMessageFilter:http://adndevblog.typepad.com/autocad/2012/05/cannot-instantiate-autocad-2010-from-an-external-net-application-after-installing-update-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对象准备就绪。