多文档范例的问题
多文档范例的问题
exam11.cpp
#include "rxobject.h"
#include "rxregsvc.h"
#include "rxdlinkr.h"
#include "rxditer.h"
#include "aced.h"
#include "dbmain.h"
#include "dbdict.h"
#include "dbidmap.h"
#include "dbapserv.h"
#include "adslib.h"
#include "acdocman.h"
/*
void assoclines();
void addtomodelspace(acdbobjectid&,acdbentity *);
void initapp(void);
void unloadapp(void);
void printdbevent(const acdbobject *pobj,
const char *pevent);
extern "c"
acrx::appretcode
acrxentrypoint(acrx::appmsgcode,void *);
*/
long gentacc=0;
void printdbevent(const acdbobject *,const char * eventstr);
void printobj(const acdbobject * pobj);
void watchdb();
void clearreactors();
extern "c"
acrx::appretcode acrxentrypoint(acrx::appmsgcode ,void *);
class mydbreactor;
class mydocreactor

ublic acapdocmanagerreactor
{
public:
virtual void documenttobeactivated(acapdocument * pdoc);
virtual void documentcreated(acapdocument * pdoc);
virtual void documenttobedestroyed(acapdocument * pdoc);
};
class myperdocdata
{
friend class myappdocglobals;
public:
myperdocdata(acapdocument * pdoc);
private:
acapdocument * m_pdoc;
myperdocdata * m_pnext;
long m_entacc;
mydbreactor * m_pdbr;
};
class myappdocglobals
{
public:
myappdocglobals(acapdocument *pdoc);
void setglobals(acapdocument *pdoc);
void removedocglobals(acapdocument * pdoc);
void removealldocglobals(myperdocdata * ptarget);
void unload();
long &entitycount();
void incremententitycount();
void decremententitycount();
mydbreactor * gpreactor();
void setdbreactor(mydbreactor *pdb);
private:
myperdocdata *m_phead;
myperdocdata *m_pdata;
mydocreactor *m_pdocreactor;
};
myappdocglobals *gpmyappdocglobals;
class mydbreactor

ublic acdbdatabasereactor
{
public:
virtual void objectappended(const acdbdatabase * dwg,
const acdbobject *dbobj);
virtual void objectmodified(const acdbdatabase * dwg,
const acdbobject * dbobj);
virtual void objecterased(const acdbdatabase *dwg,
const acdbobject *dbobj,
adesk::boolean perased);
};
void mydbreactor:

bjectappended(const acdbdatabase * db,
const acdbobject *pobj)
{
printdbevent(pobj,"objectappended");
acutprintf("db==%lx\n",(long)db);
gentacc++;
acutprintf("entity count=%d\n",gentacc);
}
void mydbreactor:

bjectmodified(const acdbdatabase * db,
const acdbobject *pobj)
{
printdbevent(pobj,"objectmodified");
acutprintf("db==%ls\n",(long)db);
}
void mydbreactor:

bjecterased(const acdbdatabase *db,
const acdbobject *pobj,
adesk::boolean perased)
{
if(perased)
{
printdbevent(pobj,"objecterased");
gentacc--;
}
else
{
printdbevent(pobj,"object(un)erased");
gentacc++;
}
acutprintf("db==%lx\n",(long)db);
acutprintf("entity count=%d\n",gentacc);
}
void printdbevent(const acdbobject *pobj,
const char *pevent)
{
acutprintf("event:acdbdatabasereactor::%s",pevent);
printobj(pobj);
}
void printobj(const acdbobject *pobj)
{
if(pobj==null)
{
acutprintf("(null)");
return;
}
acdbhandle objhand;
char handbuf[17];
pobj->getacdbhandle(objhand);
objhand.getintoasciibuffer(handbuf);
acutprintf("\n (class==%s,handle==%s,id=%lx,db==%lx)",
pobj->isa()->name(),handbuf,
pobj->objectid().asoldid(),pobj->database());
}
void mydocreactor::documenttobeactivated(acapdocument *pdoc)
{
gpmyappdocglobals->setglobals(pdoc);
}
void mydocreactor::documenttobedestroyed(acapdocument *pdoc)
{
gpmyappdocglobals->removedocglobals(pdoc);
}
void mydocreactor::documentcreated(acapdocument *pdoc)
{
gpmyappdocglobals->setglobals(pdoc);
}
myperdocdata::myperdocdata(acapdocument *pdoc)
{
m_pdoc=pdoc;
m_pnext=null;
m_entacc=0;
m_pdbr=null;
}
myappdocglobals::myappdocglobals(acapdocument *pdoc)
{
m_pdata=m_phead=null;
m_pdocreactor=new mydocreactor();
acdocmanager->addreactor(m_pdocreactor);
}
void myappdocglobals::setglobals(acapdocument *pdoc)
{
myperdocdata *p_data=m_phead,*prev_data=m_phead;
while(p_data!=null)
{
if(p_data->m_pdoc==pdoc)
{
m_pdata=p_data;
break;
}
prev_data=p_data;
p_data=p_data->m_pnext ;
}
if(p_data==null)
{
if(m_phead==null)
{
m_phead=m_pdata=new myperdocdata(pdoc);
}
else
{
prev_data->m_pnext=m_pdata=new myperdocdata(pdoc);
}
}
}
void myappdocglobals::removedocglobals(acapdocument * pdoc)
{
myperdocdata *p_data=m_phead,*prev_data=m_phead;
while(p_data!=null)
{
if(p_data->m_pdoc=pdoc)
{
if(p_data==m_phead)
{
m_phead=p_data->m_pnext;
}
else
{
prev_data->m_pnext=p_data->m_pnext;
}
if(m_pdata==p_data)
{
m_pdata=m_phead;
}
delete p_data;
break;
}
prev_data=p_data;
p_data=p_data->m_pnext;
}
}
void myappdocglobals::removealldocglobals (myperdocdata * p_target)
{
if(p_target==null)
{
return;
}
if(p_target->m_pnext!=null)
{
removealldocglobals(p_target->m_pnext );
}
if(p_target->m_pdbr!=null)
{
acdbhostapplicationservices()->workingdatabase()
->removereactor(p_target->m_pdbr );
delete p_target->m_pdbr;
p_target->m_pdbr=null;
}
delete p_target;
}
void myappdocglobals::unload()
{
acdocmanager->removereactor(m_pdocreactor);
delete m_pdocreactor;
removealldocglobals(m_phead);
m_phead=m_pdata=null;
}
long & myappdocglobals::entitycount()
{
return m_pdata->m_entacc;
}
void myappdocglobals::incremententitycount()
{
m_pdata->m_entacc++;
}
void myappdocglobals::decremententitycount()
{
m_pdata->m_entacc--;
}
mydbreactor * myappdocglobals::gpreactor()
{
return m_pdata->m_pdbr;
}
void myappdocglobals::setdbreactor(mydbreactor *pdb)
{
m_pdata->m_pdbr=pdb;
}
void watchdb()
{
mydbreactor *pdbr;
if(gpmyappdocglobals->gpreactor()==null)
{
pdbr=new mydbreactor();
gpmyappdocglobals->setdbreactor(pdbr);
acdbhostapplicationservices()->workingdatabase()
->addreactor(pdbr);
acutprintf("added database reactor to "
"acdbhostapplicationservices()->workingdatabase()\n");
}
}
void clearreactors()
{
mydbreactor *pdbr;
if((pdbr=gpmyappdocglobals->gpreactor())!=null)
{
acdbhostapplicationservices()->workingdatabase()
->removereactor(pdbr);
delete pdbr;
gpmyappdocglobals->setdbreactor(null);
}
}
acrx::appretcode
acrxentrypoint(acrx::appmsgcode msg,void *appid)
{
switch(msg)
{
case acrx::kinitappmsg:
acrxunlockapplication(appid);
acrxregisterappmdiaware(appid);
gpmyappdocglobals=new myappdocglobals(curdoc());
gpmyappdocglobals->setglobals(curdoc());
acedregcmds->addcommand("exam11",
"watch",
"watch",
acrx_cmd_modal,
watchdb);
acedregcmds->addcommand("exam11",
"clear",
"clear",
acrx_cmd_modal,
clearreactors);
break;
case acrx::kunloadappmsg:
if(gpmyappdocglobals!=null)
{
gpmyappdocglobals->unload();
delete gpmyappdocglobals;
gpmyappdocglobals=null;
}
acedregcmds->removegroup("exam11");
break;
}
return acrx::kretok;
}
提示:
e:\hulei\test\exam11\exam11.cpp(326) : error c2664: '__thiscall myappdocglobals::myappdocglobals(const class myappdocglobals &)' : cannot convert parameter 1 from 'class acapdocument *' to 'const class myappdocglobals &'
reason: cannot convert from 'class acapdocument *' to 'const class myappdocglobals'
no constructor could take the source type, or constructor overload resolution was ambiguous
可能是
gpmyappdocglobals=new myappdocglobals(curdoc());
参数类型不正确,不知道怎么该?
myappdocglobals *gpmyappdocglobals;
这是一个全局变量。
myappdocglobals是我定义的一个类,
curdoc()是一个函数,返回acapdocument类型。
myappdocglobals是我定义的一个类,
curdoc()是一个函数,返回acapdocument * 类型。