C#建立Autocad執行個體

來源:互聯網
上載者:User

C#建立AcadApplication執行個體時,有時候會建立執行個體失敗,找了好久,參考以下連結整理了一下代碼,經過測試,運行ok。

ref: http://through-the-interface.typepad.com/through_the_interface/2010/02/handling-com-calls-rejected-by-autocad-from-an-external-net-application.html

 

ref: http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/1dab0874-bba5-481a-9986-a11a66efa0a0

 

ref: http://msdn.microsoft.com/en-us/library/ms693740(VS.85).aspx

 

using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using Autodesk.AutoCAD.Interop;<br />using System.Runtime.InteropServices;<br />using System.Diagnostics;<br />using System.Threading;<br />using Microsoft.Win32;</p><p>namespace AcadUtils<br />{<br /> public enum AcadVersion<br /> {<br /> Acad2009,<br /> Acad2010,<br /> Unknow<br /> }</p><p> [ComImport,<br /> InterfaceType(ComInterfaceType.InterfaceIsIUnknown),<br /> Guid("00000016-0000-0000-C000-000000000046")]</p><p> public interface IMessageFilter<br /> {<br /> [PreserveSig]<br /> int HandleInComingCall(<br /> int dwCallType, IntPtr hTaskCaller,<br /> int dwTickCount, IntPtr lpInterfaceInfo<br /> );</p><p> [PreserveSig]<br /> int RetryRejectedCall(<br /> IntPtr hTaskCallee, int dwTickCount, int dwRejectType<br /> );</p><p> [PreserveSig]<br /> int MessagePending(<br /> IntPtr hTaskCallee, int dwTickCount, int dwPendingType<br /> );<br /> }</p><p> public class AcadMgr:IMessageFilter<br /> {<br /> static string progID;</p><p> IMessageFilter oldFilter;<br /> AcadApplication acapp = null;</p><p> [DllImport("ole32.dll")]<br /> static extern int CoRegisterMessageFilter(<br /> IMessageFilter lpMessageFilter,<br /> out IMessageFilter lplpMessageFilter<br /> );</p><p> static AcadMgr()<br /> {<br /> if (AcadVer == AcadVersion.Acad2009)<br /> progID = "AutoCAD.Application.17";<br /> else if (AcadVer == AcadVersion.Acad2010)<br /> progID = "AutoCAD.Application.18";<br /> else<br /> progID = "Unknown";<br /> }</p><p> public AcadMgr()<br /> {<br /> CoRegisterMessageFilter(this, out oldFilter);</p><p> try<br /> {<br /> acapp = (AcadApplication)Marshal.GetActiveObject(progID);<br /> }<br /> catch<br /> {<br /> try<br /> {<br /> Type acType = Type.GetTypeFromProgID(progID);<br /> acapp = (AcadApplication)Activator.CreateInstance(acType, true);<br /> }<br /> catch<br /> {<br /> System.Windows.Forms.MessageBox.Show("cannot create object type " + progID);<br /> }<br /> }</p><p> if (acapp != null)<br /> {<br /> acapp.Visible = true;<br /> }<br /> }</p><p> public AcadApplication Application<br /> {<br /> get<br /> {<br /> return acapp;<br /> }<br /> }</p><p> public static AcadVersion AcadVer<br /> {<br /> get<br /> {<br /> try<br /> {<br /> RegistryKey acadKey = Registry.CurrentUser.OpenSubKey("Software//Autodesk//AutoCAD");<br /> string acadVerNum = acadKey.GetValue("CurVer").ToString();</p><p> if (acadVerNum == "R18.0")<br /> return AcadVersion.Acad2010;<br /> else if (acadVerNum == "R17.0")<br /> return AcadVersion.Acad2009;<br /> else<br /> return AcadVersion.Unknow;<br /> }<br /> catch<br /> {<br /> return AcadVersion.Unknow;<br /> }<br /> }<br /> }</p><p> int IMessageFilter.HandleInComingCall(<br /> int dwCallType, IntPtr hTaskCaller,<br /> int dwTickCount, IntPtr lpInterfaceInfo<br /> )<br /> {<br /> return 0;<br /> }</p><p> int IMessageFilter.RetryRejectedCall(<br /> IntPtr hTaskCallee, int dwTickCount, int dwRejectType<br /> )<br /> {<br /> return 1000;<br /> }</p><p> int IMessageFilter.MessagePending(<br /> IntPtr hTaskCallee, int dwTickCount, int dwPendingType<br /> )<br /> {<br /> return 1;<br /> }<br /> }<br />}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.