THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 21/09/2006 at 17:05, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 9.102
Platform: Windows ; Mac OSX ;
Language(s) : C++ ;
---------
This is an urgent problem!
This is the full code of my main.cpp (minus stuff that wouldn't be good out in public).
Here's the situation: Only if the user does not run my plugin (or the dialog isn't restored in the layout during startup), C4D is guaranteed to crash on exit Windows/MacOS R8.2-R9.6 confirmed.
I've narrowed this down to one line (marked below) : the SNHookClass::Register() method. Could it be that the plugin_id in Register() must be different that the main plugin id (doesn't seem to make a difference)? If you see anything that seems out of place otherwise, please do not hesitate to mention it as well.
// Includes
#include "c4d.h"
#include "lib_sn.h"
#include "general.h"
// IPPSerial: Serial Number Hook Class
class IPPSerial : public SNHookClass
{
private:
// Data
String SNPluginName;
// Methods
// - IPPSerial.checkSerial
//*---------------------------------------------------------------------------*
bool checkSerial(const String& c4dsn, const String& sn)
//*---------------------------------------------------------------------------*
{
// Code removed for obvious reasons
return true;
}
public:
// Data
bool registered;
UCHAR mode;
UCHAR time;
// Methods
// - Constructor
//*---------------------------------------------------------------------------*
IPPSerial()
//*---------------------------------------------------------------------------*
{
registered = false;
SNPluginName = GeLoadString(IPPS_PLUGIN_NAME)+" "+GeLoadString(IPPS_PLUGIN_EDITION);
}
// - SNHookClass.SNCheck
//*---------------------------------------------------------------------------*
LONG SNCheck(const String& c4dsn, const String& sn, LONG regdate, LONG curdate)
//*---------------------------------------------------------------------------*
{
if (!regdate && !sn.Content()) return SN_WRONGNUMBER;
// Code removed for obvious reasons!!
return SN_WRONGNUMBER;
}
// - SNHookClass.GetTitle
//*---------------------------------------------------------------------------*
const String& GetTitle()
//*---------------------------------------------------------------------------*
{
return SNPluginName;
}
} *ippSerial = NULL;
// Plugin Functions ==================================================================================================
#include "interPoserPro.h"
// Declare Global Plugin Registrants
interPoserPro* RegisterInterPoserProCommand();
Bool RegisterIPPBase();
Bool RegisterIPPFigureTag();
Bool RegisterIPPObjectTag();
Bool RegisterIPPDialTag();
Bool RegisterIPPJointTag();
Bool RegisterC4DFigureTag();
Bool RegisterIPPTool();
//*---------------------------------------------------------------------------*
Bool PluginStart()
//*---------------------------------------------------------------------------*
{
BOOL network;
LONG vtype = GeGetVersionType();
if ((vtype & VERSION_SERVER) || (vtype & VERSION_NET)) network = TRUE;
else network = FALSE;
if (!((vtype & VERSION_DEMO) || network))
{
// serial number check
if (!(ippSerial && ippSerial->registered)) return FALSE;
}
GePrint(" ");
GePrint(GeLoadString(IPPS_PLUGIN_BANNER));
GePrint("-- "+GeLoadString(IPPS_PLUGIN_NAME)+" "+GeLoadString(IPPS_PLUGIN_EDITION)+" v"+GeLoadString(IPPS_PLUGIN_VERSION)+" "+GeLoadString(IPPS_PLUGIN_COPYRIGHT));
GePrint(GeLoadString(IPPS_PLUGIN_BANNER));
GePrint(" ");
// register hooks and return
interPoserPro* ipp = RegisterInterPoserProCommand();
if (!ipp) return FALSE;
if (ippSerial && !network) ipp->SetDemoInfo(ippSerial->mode, ippSerial->time);
return RegisterIPPFigureTag() && RegisterIPPObjectTag() && RegisterIPPBase() && RegisterIPPDialTag() && RegisterIPPJointTag() && RegisterC4DFigureTag() && RegisterIPPTool();
}
//*---------------------------------------------------------------------------*
void PluginEnd()
//*---------------------------------------------------------------------------*
{
gDelete(ippSerial);
}
//*---------------------------------------------------------------------------*
Bool PluginMessage(LONG id, void* data)
//*---------------------------------------------------------------------------*
{
if (id == C4DPL_INIT_SYS)
{
// initialize global resource object
if (!resource.Init()) return FALSE;
// initialize and register Serial Number Hook
LONG vtype = GeGetVersionType();
if ((vtype & VERSION_SERVER) || (vtype & VERSION_NET)) return TRUE;
ippSerial = gNew IPPSerial();
if (!ippSerial) return FALSE;
// THIS CRASHES C4D ON EXIT
return ippSerial->Register(ID_INTERPOSERPRO, SNFLAG_OWN);
// ************************
//return TRUE;
}
else if (id == C4DMSG_PRIORITY) return TRUE;
return FALSE;
}
Thank you,