在 C++ 中链接和通信到 AutoCAD
Linking and communication to AutoCAD in C++
如何在 C++ 中打开 AutoCAD 应用程序并向其发送命令?
在 VB 中,可以通过 CreateObject 和 GetObject 函数实现。
在 C++ 中,您需要使用 CoCreateInstance instead of CreateObject
and CoGetObject 而不是 GetObject
。
这是一些示例代码,改编自此 sample of Microsoft:
// Initialize COM for this thread...
CoInitialize(NULL);
// Get CLSID for our server...
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"AutoCAD.Application", &clsid);
if(FAILED(hr)) {
return -1;
}
// Start server and get IDispatch...
IDispatch *pAcadApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pAcadApp);
if(FAILED(hr)) {
return -2;
}
您可能希望使用 C# 而不是 C++,如果您开始处理 COM 指针,.Net 语法比 C++ 友好得多。
这是一个例子。您始终可以创建一个 .Net CLI 库并包装您的 C++ 代码,以便您可以从 .Net 中使用它。
void LaunchACAD()
{
try
{
//Connect to a running instance
AcadApp = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject(
"AutoCAD.Application");
}
catch(Exception ex)
{
// starts last run acad version
System.Type acType = System.Type.GetTypeFromProgID("AutoCAD.Application", true);
// ("AutoCAD.Application.17.1"); // starts 2008
// ("AutoCAD.Application.17.2"); // starts 2009
AcadApp = (AcadApplication)System.Activator.CreateInstance(acType);
}
AcadApp.Visible = true; // by the time this is reached AutoCAD is fully functional
}
如何在 C++ 中打开 AutoCAD 应用程序并向其发送命令?
在 VB 中,可以通过 CreateObject 和 GetObject 函数实现。
在 C++ 中,您需要使用 CoCreateInstance instead of CreateObject
and CoGetObject 而不是 GetObject
。
这是一些示例代码,改编自此 sample of Microsoft:
// Initialize COM for this thread...
CoInitialize(NULL);
// Get CLSID for our server...
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"AutoCAD.Application", &clsid);
if(FAILED(hr)) {
return -1;
}
// Start server and get IDispatch...
IDispatch *pAcadApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pAcadApp);
if(FAILED(hr)) {
return -2;
}
您可能希望使用 C# 而不是 C++,如果您开始处理 COM 指针,.Net 语法比 C++ 友好得多。
这是一个例子。您始终可以创建一个 .Net CLI 库并包装您的 C++ 代码,以便您可以从 .Net 中使用它。
void LaunchACAD()
{
try
{
//Connect to a running instance
AcadApp = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject(
"AutoCAD.Application");
}
catch(Exception ex)
{
// starts last run acad version
System.Type acType = System.Type.GetTypeFromProgID("AutoCAD.Application", true);
// ("AutoCAD.Application.17.1"); // starts 2008
// ("AutoCAD.Application.17.2"); // starts 2009
AcadApp = (AcadApplication)System.Activator.CreateInstance(acType);
}
AcadApp.Visible = true; // by the time this is reached AutoCAD is fully functional
}