明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2842|回复: 10

求大侠相助!

[复制链接]
发表于 2004-10-21 16:37:00 | 显示全部楼层 |阅读模式
IAcadApplication acadApp;
acadApp.CreateDispatch(_T("AutoCAD.Application"));
acadApp.SetVisible(TRUE); CString bscadPath;
CString str;
FindBScadPath(bscadPath);
str=bscadPath+"BSbsCAD.arx";
acadApp.LoadArx(str); 我的BSbsCAD.arx文件手动加载就好用,但用上面的程序加载就不好用! 说是:D:\Program Files\BSCAD\BSbsCAD.arx ARX命令中发生异常 未处理异常C0000005(Access Violation Reading 0xccccccd0),地址:6564E636h 我该怎么办啊? 谢谢!
发表于 2004-10-21 18:17:00 | 显示全部楼层

回复

不是'不好用',是你的代码不对,造成AutoCAD异常退出. 你安装了几个AutoCAD版本? 贴程序上来吧!
 楼主| 发表于 2004-10-21 19:18:00 | 显示全部楼层
我只装了一个AutoCad2000


贴那个程序?是我的启动程序还是ARX程序?
 楼主| 发表于 2004-10-21 20:17:00 | 显示全部楼层
楼上的大哥能不能说说造成这种错误的可能有那些?
发表于 2004-10-22 10:14:00 | 显示全部楼层
你加载别的ARX程序试试看会不会出问题。
 楼主| 发表于 2004-10-22 10:48:00 | 显示全部楼层
我重新做了一个简单的ARX程序,只是修改AutoCAd图标和标题,用上面的启动程序加载成功!


我详细说一下加载出错的ARX程序:


        功能:用COM方法在AutoCAD菜单“窗口”后面添加了一个“。。”菜单。


                                                                                 点击菜单项从数据库中取数据然后画图。就这些!


现在的问题是:用上面的启动程序加载它后,菜单也添加上了,但同时出现


上面的错误!(在添加菜单前的 修改标题都已经修改了)。这些我都是在


InitApplication()中做的.


您觉得错误出在那?谢谢您!
发表于 2004-10-22 15:54:00 | 显示全部楼层
你这个程序加载之后为什么就自动执行了?


你最好跟踪调试一下,没有代码我的经验还判断不出来具体的原因。


但是出现这种错误很可能是与AutoCAD数据库对象交互操作时出现了问题,比如说有的对象没有及时关闭,等等。
 楼主| 发表于 2004-10-22 17:04:00 | 显示全部楼层
因为加载菜单是在InitApplication()中做的.,程序一加载就产生菜单。 我把我的InitApplication()函数贴出来: void InitApplication()
{
// NOTE: DO NOT edit the following lines.
//{{AFX_ARX_INIT
AddCommand("BS", "DRAWDLG", "DRAWDLG", ACRX_CMD_TRANSPARENT | ACRX_CMD_USEPICKSET, BSDrawDlg);
//}}AFX_ARX_INIT
//修改图标和标题
CMDIFrameWnd *pp;
pp=acedGetAcadFrame();
pp->SetWindowText ("BSCAD2000");
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
pp->SetIcon(hIcon,FALSE);
pp->UpdateWindow (); //数据库连接字符串 m_strConnect="driver={SQL Server};Server=Ren;DATABASE=study;UID=sa";

AfxOleInit(); //初始化
BOOL Result;
Result=m_adoConnection.Connect (LPCTSTR(m_strConnect),NULL);

// TODO: add your initialization functions //创建菜单的函数,下面有
createSmartDrawMenu(); AcCmColor color;
CString strLayername;
//
color.setColorIndex (5);
strLayername="01";
newLayer (strLayername,color);//自己写的建层函数,下面有
//
color.setColorIndex (6);
strLayername="02";
newLayer (strLayername,color);
//
color.setColorIndex (7);
strLayername="03";
newLayer (strLayername,color);
//
acdbLoadLineTypeFile ("CENTER","acadiso.lin",NULL);
acdbLoadLineTypeFile ("PHANTOM","acadiso.lin",NULL);
//
color.setColorIndex (1);
strLayername="05";
newLayer (strLayername,color,"CENTER");
//border
color.setColorIndex (3);
strLayername="06";
newLayer (strLayername,color,"PHANTOM");
} //////////////////////////
void newLayer( CString& layerName,AcCmColor color,CString linetypeName /* = "CONTINUOUS" */ )
{
AcDbLayerTable* pLayerTbl;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable( pLayerTbl,AcDb::kForWrite );

if ( !pLayerTbl->has( layerName ) )
{
AcDbLayerTableRecord* pLayerTblRcd = new AcDbLayerTableRecord;
pLayerTblRcd->setName( layerName );
pLayerTblRcd->setIsFrozen( 0 );
pLayerTblRcd->setIsOff( 0 );
pLayerTblRcd->setVPDFLT( 0 );
pLayerTblRcd->setIsLocked( 0 );

// ²ãµÄÑÕÉ«
pLayerTblRcd->setColor( color );

// ÉèÖÃÏßÐÍ
AcDbLinetypeTable* pLinetypeTbl;
AcDbObjectId lineId;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable( pLinetypeTbl,AcDb::kForRead );
if ( ( pLinetypeTbl->getAt( linetypeName,lineId ) ) != Acad::eOk )
{
pLinetypeTbl->getAt( "CONTINUOUS",lineId );
}
pLinetypeTbl->close();

pLayerTblRcd->setLinetypeObjectId( lineId );
pLayerTbl->add( pLayerTblRcd );

pLayerTblRcd->close();
pLayerTbl->close();
}
else
{
pLayerTbl->close();
}
}
/////////////////////////////////////////////////////////////////////// void createSmartDrawMenu ()
{
TRY
{
IAcadApplication bsApp(acedGetAcadWinApp()->GetIDispatch(true));
IAcadMenuBar bsMenuBar(bsApp.GetMenuBar ());
long numberOfMenus;
numberOfMenus = bsMenuBar.GetCount();

IAcadMenuGroups bsMenuGroups(bsApp.GetMenuGroups ());

VARIANT index;
VariantInit(&index);
index.vt=VT_I4;
index.lVal=0;

IAcadMenuGroup bsMenuGroup(bsMenuGroups.Item (index));
IAcadPopupMenus bsPopupMenus(bsMenuGroup.GetMenus ());

CString strMenuName="菜单名";

VariantInit(&index);
index.vt=VT_BSTR;
index.bstrVal=strMenuName.AllocSysString ();

IDispatch* pDisp=NULL;

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


if(pDisp==NULL)
{
//
IAcadPopupMenu bsPopupMenu(bsPopupMenus.Add(strMenuName));

int i=0;//
VariantInit(&index);
index.vt=VT_I4;
index.lVal=i;
bsPopupMenu.AddMenuItem (index,"画图(&D)...","_DRAWDLG\n");
i++;

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

IAcadPopupMenu bsPopupMenu(pDisp);

if(!bsPopupMenu.GetOnMenuBar ())
{
VariantInit(&index);
index.vt=VT_I4;
index.lVal=numberOfMenus-1;
bsPopupMenu.InsertInMenuBar (index);
}
else
{
VariantInit(&index);
index.vt=VT_BSTR;
index.bstrVal=strMenuName.AllocSysString ();
bsPopupMenus.RemoveMenuFromMenuBar (index);
VariantClear(&index);
}
pDisp->Release ();
}

CATCH(COleDispatchException,e)
{
e->ReportError();
e->Delete();
}
END_CATCH;
}
 楼主| 发表于 2004-10-22 17:21:00 | 显示全部楼层
发现:


我把程序中的newlayer()新建层函数去掉的话就没有异常了!
发表于 2004-10-22 21:59:00 | 显示全部楼层
那你就继续跟踪一下newlayer()函数中各条语句的返回值情况,看具体是哪个地方产生了异常,下次再遇到这样的问题你就不会束手无策了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 10:48 , Processed in 0.188795 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表