Taoyimaier 发表于 2003-6-22 10:09:00

compile可以通过,但build通不过,是什么回事,

我得程序有个问题,开始如果用objectARX2000 AppWizzard生成程序框架后,可以编译和构造,但在autocad中加载后运行时,出现异常,一看由向导生成的文件挺多的,不好找错误,便把我得程序放在了helloworld例子的框架中,能编译,但不能构造arx文件,出现的错误提示我不懂,希望那位好心人帮帮忙,现在附上代码,如下,
//Cpp文件开始
#include <aced.h>
#include <rxregsvc.h>
#include <math.h>
#include <dbents.h>
void initApp();
void unloadApp();

void dist_alert();//主要函数,
double acgedist(AcGePoint3d &pt1,AcGePoint3d &pt2){
        double x,y,z;
        double x1,y1,z1,x2,y2,z2;
        x1=pt1;x2=pt2;x=x1-x2;
        y1=pt1;y2=pt2;y=y1-y2;
        z1=pt1;z2=pt2;z=z1-z2;
        return sqrt(x*x+y*y+z*z);
}//用于计算两 AcGePoint3d 点之间的距离的函数

void initApp()
{
    // register a command with the AutoCAD command mechanism
    acedRegCmds->addCommand("taoyi",
                                                        "ttt",
                                                        "ttt",
                            ACRX_CMD_MODAL,
                            dist_alert);
}

void unloadApp()
{
    acedRegCmds->removeGroup("taoyi");
}

//-------main function start,功能是选中一些Line后,弹出对话框来显示其长度值
void dist_alert()
{
struct resbuf eb1;
char sbuf1; // Buffers to hold strings
ads_name ssname1;

eb1.restype = 0;        // Entity name
strcpy(sbuf1, "LINE");
eb1.resval.rstring = sbuf1;
eb1.rbnext = NULL; // No other properties

acedSSGet(NULL, NULL, NULL, &eb1, ssname1);

long ss_len, i;
ads_name cur_ent;
acedSSLength(ssname1, &ss_len);

for(i=0;i<ss_len;i++){
        acedSSName(ssname1, i, cur_ent);
        AcDbObjectId cur_ent_id;
        acdbGetObjectId(cur_ent_id,cur_ent);
        AcDbEntity* pcur_ent;
        acdbOpenObject(pcur_ent,cur_ent_id,AcDb::kForRead);
        AcDbLine *pcur_line;
        pcur_line = AcDbLine::cast(pcur_ent);// wait wait ....
        double dist_real;
        char* dist_str=NULL;
        dist_real = acgedist(pcur_line->endPoint(),pcur_line->startPoint());
        acdbRToS(dist_real,2,3,dist_str);
        acedAlert(strcat(strcat("The enity is the " , dist_str), " Units!"));
}
}
//main function end-----------应该很简单吧^_^

extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
    switch (msg)
          {
                case AcRx::kInitAppMsg:
                        acrxDynamicLinker->unlockApplication(pkt);
                        acrxRegisterAppMDIAware(pkt);
                        initApp();
                        break;
                case AcRx::kUnloadAppMsg:
                        unloadApp();
                        break;
                default:
                break;
    }
    return AcRx::kRetOK;
}
//CPP文件结束

好像没有上载文件的功能了,

leeyeafu 发表于 2003-6-25 15:10:00

你应该及时释放对象占用的内存

尤其是C语言支持的struct数据,它没有默认的析构函数,不及时释放其占用的内存,会造成严重的内存泄漏。
在我的机器上,Build构建没有问题,但执行时ACAD会死机。(我用VC.NET和ACAD2004)
暂时给这些提示,你自己将程序改改看。
另外,向导生成的文件是挺多的,但你只要注意你自己的CPP文件大概就行了。
至于在helloworld框架中不能构建ARX文件,可能是你的VC设置问题,你可以将出错信息贴出来吗?不过VC设置的确很麻烦,这就是要使用向导的主要原因。

Taoyimaier 发表于 2003-6-25 20:21:00

下面是我看了你得提示后,对程序做了两个修改,一个是用ads_relrb()释放了resbuf结构变量
另一个是加了一个def文件(不好意思,开始忘了),但是仍然是有如下错误,

--------------------Configuration: dist_alert - Win32 Debug--------------------
Linking...
dist_alert.def : error LNK2001: unresolved external symbol acrxGetApiVersion
Debug/dist_alert.lib : fatal error LNK1120: 1 unresolved externals
LINK : fatal error LNK1141: failure during build of exports file
Error executing link.exe.

dist_alert.arx - 3 error(s), 0 warning(s)

---------------
我把我的那个文件夹传上来了,你可以看看那些错了,我用的是objectARX2000的库和VC6.0开发的,再autocad2000下测试,唉,看了你得提示,我又想了一会,不过实在是基础太差,还是偷懒一下吧,直接问你呢,那本《深入浅出mfc》我看得不快,有些问题还没看,
不说那么多了,当我看到我得贴着旁的"-"号变成”+“时,真的很高兴,

linyiwq 发表于 2003-6-29 15:48:00

我也是个新手,在我自己的VC项目中有两个文件STDARX.H和STDAFX.H这两个头文件的具体内容你可以用OBJECTARX向导创建一个新项目,在项目中你可以看到,并且使用MFC和不使用MFC这两个头文件的内容是不一样的.我认为这两个文件的"内容"对连接产生ARX文件是很重要的.

liron 发表于 2003-7-18 11:17:00

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib rxapi.lib acrx15.lib acdb15.lib acutil15.lib acge15.lib acgiapi.lib achapi15.lib acISMobj15.lib acad.lib acedapi.lib acsiobj.lib

leeyeafu 发表于 2003-8-6 11:02:00

对于你的工程作为以下修改:
“Tools"->"Options"->"C/C++"标签,在Category弹出式列表中Preprocessor项,在Preprocessor definitions编辑框原有内容后加上”ACRXAPP,RADPACK“
然后,如liron朋友所说,加上必要的*.lib文件即可。

Taoyimaier 发表于 2003-8-10 21:55:00

谢谢,已经有些日子没有来明经通道了,C++难学,堕落之下,开始玩什么魔力宝贝了,也不知道开始学习mfc时看什么书好,我看那本深入浅出MFC ,不过,能看懂的太少了,一篇迷茫啊,最希望看到的就是一些短小精湛的文章,比如上次的 连载,要是有象这样的VC文章就好了,学习,还是要学习的,不过,我在等待兴趣的到来,只是希望我所碰到的难度不要那么陡峭,仅此而已
页: [1]
查看完整版本: compile可以通过,但build通不过,是什么回事,