找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 864|回复: 13

[求助]:程序通不过,请帮一把。

[复制链接]
发表于 2005-8-29 20:38:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
头大,照书抄的例子总是运行通不过,连接错误,还查不出来,哪位有耐心的帮忙看看。
cpp文件:

#include "rxregsvc.h"
#include "aced.h"
#include "dbsymtb.h"
#include "adslib.h"
#include "dbents.h"
#include "dbpl.h"

//创建图形数据库函数
void createDwg()
{
        //生成新的图形数据库,默认方式为包含基本的数据库要素
        AcDbDatabase *pDb = new AcDbDatabase();
        //获得块表指针
        AcDbBlockTable *pBtbl;
        pDb->getSymbolTable(pBtbl, AcDb::kForRead);
        //获得模型空间的块表记录指针
        AcDbBlockTableRecord *pBtblRcd;
        pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd, AcDb::kForWrite);
        //关闭块表,接下来只对模型空间的块表记录进行操作
        pBtbl->close();
        //生成两个圆,代表眼睛
        AcDbCircle *pCir1 = new AcDbCircle(AcGePoint3d(200, 200, 0), AcGeVector3d(0, 0, 1), 50);
        AcDbCircle *pCir2 = new AcDbCircle(AcGePoint3d(400, 200, 0), AcGeVector3d(0, 0, 1), 50);
        //生成一条直线,代表鼻子
        AcDbLine *pLine = new AcDbLine(AcGePoint3d(300, 230, 0), AcGePoint3d(300, 50, 0));
        //将鼻子颜色设为红色
        pLine->setColorIndex(1);
        //生成多义线
        AcDbPolyline *pPolyline = new AcDbPolyline(4);
        AcGePoint2d pt;
        //添加多义线的顶点
        pt.x = 220;
        pt.y = 60;       
        pPolyline->addVertexAt(0, pt, 0.0, -1.0, -1.0);
        pt.x = 250;
        pt.y = 30;
        pPolyline->addVertexAt(1, pt, 0.0, -1.0, -1.0);
        pt.x = 350;
        pt.y = 30;
        pPolyline->addVertexAt(2, pt, 0.0, -1.0, -1.0);
        pt.x = 380;
        pt.y = 60;
        pPolyline->addVertexAt(3, pt, 0.0, -1.0, -1.0);
        //将多义线厚度设为100,颜色设为蓝色
        pPolyline->setThickness(100);
        pPolyline->setColorIndex(4);
        //将圆、直线和多义线添加到模型空间,并分别关闭这些实体对象指针
        pBtblRcd->appendAcDbEntity(pCir1);
        pCir1->close();
        pBtblRcd->appendAcDbEntity(pCir2);
        pCir2->close();
        pBtblRcd->appendAcDbEntity(pLine);
        pLine->close();
        pBtblRcd->appendAcDbEntity(pPolyline);
        pPolyline->close();
        pBtblRcd->close();
        //将该图形数据库用制定文件名保存
        pDb->saveAs("face.dwg");
        delete pDb;
        return;
}


//将指定文件名的图形数据库的信息进行解读并打印信息
void readDwg()
{
        //创建一个空白的图形数据库
        //AcDbDatabase()的参数必须为Adesk::kFalse
        AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
        //将指定文件名的图形读入空白图形数据库
        pDb->readDwgFile("face.dwg");
        //获得块表指针
        AcDbBlockTable *pBlkTbl;
        pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);
        //获得模型空间的块表记录指针
        AcDbBlockTableRecord *pBlkTblRcd;
        pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForRead);
        pBlkTbl->close();
        //生成块表记录的迭代器
        AcDbBlockTableRecordIterator *pBlkTblRcdItr;
        pBlkTblRcd->newIterator(pBlkTblRcdItr);
        //遍历法获得并打印每一个实体的类名
        AcDbEntity *pEnt;
        for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done(); pBlkTblRcdItr->step()) {
                pBlkTblRcdItr->getEntity(pEnt, AcDb::kForRead);
                acutPrintf("classname: %s\n", (pEnt->isA())->name());
                pEnt->close();
        }
        pBlkTblRcd->close();
        //删除块表记录迭代器及数据库指针
        delete pBlkTblRcdItr;
        delete pDb;
        return;
}


//初始化引用程序
void initApp()
{
        acedRegCmds->addCommand("ASDK_DWG_COMMANDS", "ASDK_CREATE", "CREATE", ACRX_CMD_MODAL, createDwg);
        acedRegCmds->addCommand("ASDK_DWG_COMMANDS", "ASDK_READ", "READ", ACRX_CMD_MODAL, readDwg);
        return;
}


//卸载应用程序
void unloadApp()
{
        acedRegCmds->removeGroup("ASDK_DWG_COMMANDS");
        return;
}


//应用程序入口函数
extern "C"
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void *pkt)
{
        //针对msg的类型分包
        switch(msg) {
        case AcRx::kInitAppMsg:
                //对应用程序解锁
                acrxDynamicLinker->unlockApplication(pkt);
                //对应用程序进行注册
                acrxDynamicLinker->registerAppMDIAware(pkt);
                //对应用程序调用initApp()进行初始化
                initApp();
                break;
        case AcRx::kUnloadAppMsg:
                //对应用程序卸载
                unloadApp();
                break;
        }
        return AcRx::kRetOK;
}


下面是def文件:
LIBRARY                                                testdb
DESCRIPTION                                        "图形数据库操作"
EXPORTS
acrxEntryPoint                                PRIVATE
acrxGetApiVersion                        PRIVATE


按照书上说的在project->settings中的link页上的base address设为0x1c000000,object/library modules加上了acutil15.lib acrx15.lib acdb15.lib acedapi.lib rxapi.lib acad.lib acge15.lib。编译没问题,连接老是有错:
Linking...
   Creating library Debug/testdb.lib and object Debug/testdb.exp
LINK : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
Debug/testdb.arx : warning LNK4086: entrypoint "_mainCRTStartup" is not __stdcall with 12 bytes of arguments; image may not run
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/testdb.arx : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

testdb.arx - 2 error(s), 2 warning(s)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-29 23:56:30 | 显示全部楼层
VC 没有包含arx SDK的include 和 lib
tools->options->directories
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 08:10:13 | 显示全部楼层
头文件和库文件都按照书上说的包含了,我还做过其他连个练习,只有一个warning,这个就不行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 10:07:38 | 显示全部楼层
在project->settings中的C/C++页上的Category选Code Generation,
Use run-time library: Multithreaded DLL
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 10:56:01 | 显示全部楼层
Compiling...
testdb.cpp
Linking...
   Creating library Debug/testdb.lib and object Debug/testdb.exp
Debug/testdb.arx : warning LNK4086: entrypoint "_mainCRTStartup" is not __stdcall with 12 bytes of arguments; image may not run
MSVCRT.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main
Debug/testdb.arx : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

testdb.arx - 2 error(s), 1 warning(s)


少了一个warning,还是通不过啊!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 11:16:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
ProjectSetting/link/output 中设置Entry为wWinMainCRTStartup了?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2005-8-30 12:35:32 | 显示全部楼层
还是不对,现在错误是:
Linking...
   Creating library Debug/testdb.lib and object Debug/testdb.exp
Debug/testdb.arx : warning LNK4086: entrypoint "_wWinMainCRTStartup" is not __stdcall with 12 bytes of arguments; image may not run
MSVCRT.lib(wcrtexew.obj) : error LNK2001: unresolved external symbol _wWinMain@16
Debug/testdb.arx : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

testdb.arx - 2 error(s), 1 warning(s)

再帮我想想。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 14:43:48 | 显示全部楼层
//初始化引用程序
void initApp()
{
acedRegCmds->addCommand("ASDK_DWG_COMMANDS", "ASDK_CREATE", "CREATE", ACRX_CMD_MODAL, createDwg);
acedRegCmds->addCommand("ASDK_DWG_COMMANDS", "ASDK_READ", "READ", ACRX_CMD_MODAL, readDwg);
return;
}
建议你采用ARX提供的添加命令的规范方式进行命令注册,初步看没有大的问题,仔细分析很花时间啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 16:03:49 | 显示全部楼层
这个例子是用vc的win32动态链接库向导建立的,没有用arx的wizard,用不了arx提供的命令添加方式啊,大家再帮帮忙,我觉得肯定是哪的设置不正确,而且我刚才试了一下release,连我先前在debug下通过的两个例子都出错了,晕啊!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 21个

财富等级: 恭喜发财

发表于 2005-8-30 22:15:29 | 显示全部楼层
应该那里设置错了。最好使用ARX开发包的向导生成框架,肯定没问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-31 09:22:25 | 显示全部楼层
加入代码:

  1. extern "C"
  2. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
  3. {
  4.         if (dwReason == DLL_PROCESS_ATTACH)
  5.         {
  6.         _hdllInstance = hInstance;
  7.                 // Extension DLL one time initialization
  8.                 testdbDLL.AttachInstance(hInstance);
  9.                 InitAcUiDLL();
  10.         } else if (dwReason == DLL_PROCESS_DETACH) {
  11.                 // Terminate the library before destructors are called
  12.                 testdbDLL.DetachInstance();

  13.         }
  14.         return TRUE;    // ok
  15. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-31 10:42:13 | 显示全部楼层
habit  
把你改过的程序打包发上来吧,这样零碎,还是出错,testdbdll在哪定义,包含哪些头文件?我初学,能不能说得详细点?谢谢!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-31 11:54:21 | 显示全部楼层
我没改,只是根据ARX向导生成的看了一下可能出错的地方,你再试试吧


  1. #include "AcExtensionModule.h"
  2. #include "afxdllx.h"

  3. HINSTANCE _hdllInstance =NULL ;

  4. ////////////////////////////////////////////////////////////////////////////
  5. //
  6. // Define the sole extension module object.
  7. AC_IMPLEMENT_EXTENSION_MODULE(testdbDLL);
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-31 12:26:54 | 显示全部楼层
我把这个练习搬到arx向导建立的程序里了,现在编译链接都通过了。运行时产生dwg文件没问题,读取的时候出了问题。有一个块表指针得不到值。请大家出出主意。
void readDwg()
{
        // TODO: Implement the command
        //创建一个空白的图形数据库
        //AcDbDatabase()的参数必须为Adesk::kFalse
        AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
        //将指定文件名的图形读入空白图形数据库
        pDb->readDwgFile("face.dwg");
        //获得块表指针
        AcDbBlockTable *pBlkTbl;
        pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);
//        //获得模型空间的块表记录指针
//        AcDbBlockTableRecord *pBlkTblRcd;
//        pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForRead);
//        pBlkTbl->close();
//        //生成块表记录的迭代器
//        AcDbBlockTableRecordIterator *pBlkTblRcdItr;
//        pBlkTblRcd->newIterator(pBlkTblRcdItr);
//        //遍历法获得并打印每一个实体的类名
//        AcDbEntity *pEnt;
//        for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done(); pBlkTblRcdItr->step()) {
//                pBlkTblRcdItr->getEntity(pEnt, AcDb::kForRead);
//                acutPrintf("classname: %s\n", (pEnt->isA())->name());
//                pEnt->close();
//        }
//        pBlkTblRcd->close();
//        //删除块表记录迭代器及数据库指针
//        delete pBlkTblRcdItr;
//        delete pDb;
//       
//        return;
}

就是这句pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);
执行这一句后pBlkTbl的值还是0xcccccccc。后面的pBlkTblRcdItr再想用这个地址时就冲突了。
附上我的程序:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-25 14:16 , Processed in 0.505609 second(s), 65 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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