SNHookClass::Register and C4D Exit Crash!
-
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,
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 21/09/2006 at 22:45, xxxxxxxx wrote:
After all of that, I traced the problem to the instantiation of the main dialog. If it is only done in CommandData::Execute() and CommandData::RestoreLayout(), then the crash-on-exit disappears.