void
addMenuThroughCom()


{

AutoCAD::IAcadApplication*pAcad;
AutoCAD::IAcadMenuBar*pMenuBar;
AutoCAD::IAcadMenuGroups*pMenuGroups;
AutoCAD::IAcadMenuGroup*pMenuGroup;
AutoCAD::IAcadPopupMenus*pPopUpMenus;
AutoCAD::IAcadPopupMenu*pPopUpMenu;
AutoCAD::IAcadPopupMenuItem*pPopUpMenuItem;

HRESULThr=NOERROR;
LPUNKNOWNpUnk=NULL;
LPDISPATCHpAcadDisp=acedGetIDispatch(TRUE);
if(pAcadDisp==NULL)
return;

hr=pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
pAcadDisp->Release();
if(FAILED(hr))
return;

pAcad->put_Visible(true);
pAcad->get_MenuBar(&pMenuBar);
pAcad->get_MenuGroups(&pMenuGroups);
pAcad->Release();
longnumberOfMenus;
pMenuBar->get_Count(&numberOfMenus);
pMenuBar->Release();

VARIANTindex;
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;

pMenuGroups->Item(index,&pMenuGroup);
pMenuGroups->Release();

pMenuGroup->get_Menus(&pPopUpMenus);
pMenuGroup->Release();

WCHARwstrMenuName[256];
#ifdefUNICODE
_tcscpy(wstrMenuName,L"AsdkComAccess");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,0,"AsdkComAccess",-1,wstrMenuName,256);
#endif//!UNICODE

//Enablesthemenutobeloaded/unloadedwiththesamecommand.

if(!bIsMenuLoaded)
{
pPopUpMenus->Add(wstrMenuName,&pPopUpMenu);


if(pPopUpMenu!=NULL)
{

WCHARwstrMenuItemName[256];
WCHARwstrMenuItemMacro[256];
#ifdefUNICODE
_tcscpy(wstrMenuItemName,L"&AddAComCircle");
_tcscpy(wstrMenuItemMacro,L"AsdkComCircle");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,0,"&AddAComCircle",-1,wstrMenuItemName,256);
MultiByteToWideChar(CP_ACP,0,"AsdkComCircle",-1,wstrMenuItemMacro,256);
#endif//!UNICODE

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
pPopUpMenu->AddMenuItem(index,wstrMenuItemName,wstrMenuItemMacro,&pPopUpMenuItem);

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=1;
pPopUpMenu->AddSeparator(index,&pPopUpMenuItem);

#ifdefUNICODE
_tcscpy(wstrMenuItemName,L"Auto&LISPExample");
_tcscpy(wstrMenuItemMacro,L"(prin1\"Hello\")");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,0,"Auto&LISPExample",-1,wstrMenuItemName,256);
MultiByteToWideChar(CP_ACP,0,"(prin1\"Hello\")",-1,wstrMenuItemMacro,256);
#endif//!UNICODE

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=2;
pPopUpMenu->AddMenuItem(index,wstrMenuItemName,wstrMenuItemMacro,&pPopUpMenuItem);

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=numberOfMenus-2;
pPopUpMenu->InsertInMenuBar(index);

pPopUpMenuItem->Release();
bIsMenuLoaded=true;

}else
{
acutPrintf(_T("\nMenunotcreated."));
}

}else
{
VariantInit(&index);
V_VT(&index)=VT_BSTR;
V_BSTR(&index)=wstrMenuName;
pPopUpMenus->RemoveMenuFromMenuBar(index);
VariantClear(&index);
bIsMenuLoaded=false;
}

pPopUpMenus->Release();
}
二 C++基于MFC的
void
addMenuThroughMfcCom()

{
TRY


{
CAcadApplicationIAcad(acedGetAcadWinApp()->GetIDispatch(TRUE));

CAcadMenuBarIMenuBar(IAcad.get_MenuBar());

longnumberOfMenus;
numberOfMenus=IMenuBar.get_Count();

CAcadMenuGroupsIMenuGroups(IAcad.get_MenuGroups());

VARIANTindex;
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;

CAcadMenuGroupIMenuGroup(IMenuGroups.Item(index));

CAcadPopupMenusIPopUpMenus(IMenuGroup.get_Menus());

CStringcstrMenuName=_T("AsdkComAccess");

VariantInit(&index);
V_VT(&index)=VT_BSTR;
V_BSTR(&index)=cstrMenuName.AllocSysString();

IDispatch*pDisp=NULL;

//seeifthemenuisalreadythere

TRY
{pDisp=IPopUpMenus.Item(index);pDisp->AddRef();}CATCH(COleDispatchException,e)
{}END_CATCH;


if(pDisp==NULL)
{
//createit
CAcadPopupMenuIPopUpMenu(IPopUpMenus.Add(cstrMenuName));

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
IPopUpMenu.AddMenuItem(index,_T("&AddAComCircle"),_T("_AsdkMfcComCircle"));

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=1;
IPopUpMenu.AddSeparator(index);

VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=2;
IPopUpMenu.AddMenuItem(index,_T("Auto&LISPExample"),_T("(prin1\"Hello\")"));

pDisp=IPopUpMenu.m_lpDispatch;
pDisp->AddRef();
}

CAcadPopupMenuIPopUpMenu(pDisp);
if(!IPopUpMenu.get_OnMenuBar())


{
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=numberOfMenus-2;;
IPopUpMenu.InsertInMenuBar(index);
}
else


{
VariantInit(&index);
V_VT(&index)=VT_BSTR;
V_BSTR(&index)=cstrMenuName.AllocSysString();
IPopUpMenus.RemoveMenuFromMenuBar(index);
VariantClear(&index);
}
pDisp->Release();
}
CATCH(COleDispatchException,e)


{
e->ReportError();
e->Delete();
}
END_CATCH;
}
三 C#基于COM接口
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Runtime.InteropServices;

using
Autodesk.AutoCAD.Interop;
using
Autodesk.AutoCAD.Interop.Common;

using
Autodesk.AutoCAD.ApplicationServices;
using
Autodesk.AutoCAD.Runtime;

namespace
CSharpCOM

{
publicclassClass1


{

publicClass1()
{}

[CommandMethod("AM")]
publicstaticvoidAddMenuCom()


{
AcadApplicationapp=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
AcadMenuBarmenuBar=app.MenuBar;
AcadMenuGroupmenuGroup=app.MenuGroups.Item(0);
AcadPopupMenusmenus=menuGroup.Menus;
AcadPopupMenumymenu=menus.Add("MyMenu");

mymenu.AddMenuItem(0,"Hello","hello");
mymenu.AddSeparator(1);
mymenu.AddMenuItem(2,"Hello2","hello");
AcadPopupMenuext=mymenu.AddSubMenu(3,"Ext");
ext.AddMenuItem(0,"Hello","hello");
ext.AddSeparator(1);
ext.AddMenuItem(2,"Hello2","hello");
mymenu.InsertInMenuBar(menuBar.Count-2);
}

[CommandMethod("hello")]
publicstaticvoidHello()


{
AcadApplicationapp=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
app.ActiveDocument.Utility.Prompt("Hello\n");
}


}
}
四 CSharp基于ACUI.DLL接口的
//
Copyright2005-2007byAutodesk,Inc.
//
//
Permissiontouse,copy,modify,anddistributethissoftwarein
//
objectcodeformforanypurposeandwithoutfeeisherebygranted,
//
providedthattheabovecopyrightnoticeappearsinallcopiesand
//
thatboththatcopyrightnoticeandthelimitedwarrantyand
//
restrictedrightsnoticebelowappearinallsupporting
//
documentation.
//
//
AUTODESKPROVIDESTHISPROGRAM"ASIS"ANDWITHALLFAULTS.
//
AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF
//
MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC.
using