Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    SNHookClass::Register and C4D Exit Crash!

    SDK Help
    0
    2
    246
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      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,

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • First post
          Last post