Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python 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
    • Recent
    • Tags
    • Users
    • Login

    issues with DLL and STL containers

    Scheduled Pinned Locked Moved SDK Help
    8 Posts 0 Posters 617 Views
    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 Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 20/05/2010 at 01:46, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R11 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      Hey everyone,

      my name is Heinrich Löwe, im working for Sehsucht GmbH in Hamburg. Me and a workmate(Martin Chatterjee) are working on a multi-platform-exchange format. For this reason we have written a DLL library which containes the basic functionality. It is imported in plugins for various applications and c4d is one of them.

      I don't want to bore anyone with more details and will get straight to the point: The DLL is exporting functions which modify references to STL containers. If i use these functions in a C4D plugin, it always leads to crashes. However, they work fine with a direct inlcude of the code or in different environments than c4d.

      I've boiled down the code to show you the main point:

      Parts of the DLL library which are responsible for the problems:

        
      // ...   
        
      // define a dll import/export macro   
      #ifdef DLL_TEST_EXPORTS   
         #define DLL_MACRO    __declspec(dllexport)   
      #else   
         #define DLL_MACRO    __declspec(dllimport)   
      #endif   
        
      // ...   
        
      // A representative structure exporting a stl container   
      struct DLL_MACRO MyStruct {   
        
           template class DLL_MACRO allocator<int>;   
           template class DLL_MACRO vector<int, allocator<int> >;   
        
           vector<int> vec;   
      };   
        
      // ...   
        
      // Global function which modifies the given reference   
      void DLL_MACRO GlobalFunction(vector<MyStruct> &vec;)   
      {   
           // just do something with the input   
           vec.resize(10);   
      }   
        
      // ...   
      

      Now the usage of the exported function in the C4D plugin code:

        
      // ...   
        
      // code is executed during the c4d startup phase, while   
      // registering the plugin.   
      Bool Register_MyTestPlugin(void)   
      {   
           // create some stl container, using the exported structure   
           vector<MyStruct> *b = gNew vector<MyStruct>;   
        
           // call exported function which modifies my stl container   
           GlobalFunction(*b);   
              
           // kill it, at this point the plugin crashes   
           /////////////////////////////////////////////////////////   
           gDelete(b);   
           /////////////////////////////////////////////////////////   
        
           // ...   
        
           return TRUE;   
      }   
        
      // ...   
      

      While running that plugin in debug mode everything works, up to the point where the vector is deleted. I tracked it further down to a call to C4DOS.Ge->Free() in the overloaded delete operator in the file 'c4d_memory.cpp'.

      Thas is the point where i got stuck and i'm hoping for your assistance to solve the problem,

      Thanks,
      Heinrich Löwe.

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 26/05/2010 at 06:19, xxxxxxxx wrote:

        Which Cinema 4D version are you using? My test DLL with Cinema 4D R11.5 seems to work fine.

        cheers,
        Matthias

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

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 27/05/2010 at 01:16, xxxxxxxx wrote:

          I'm using R11 64bit on a windows 7 machine.

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

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 27/05/2010 at 03:04, xxxxxxxx wrote:

            Ok, I can confirm the crashing on Cinema R11. Afaik it is due to the overloading of new/delete by the Cinema 4D SDK. Since R11.5 this is not the case anymore, making it easier to link to DLLs/DYLIBs. I am not sure if there is a solution for R11. I will forward the issue to the developers maybe they know a solution of the problem.

            cheers,
            Matthias

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

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 27/05/2010 at 05:14, xxxxxxxx wrote:

              Strange now it crashes under R11.5 too. I'll have to ask the developers what is going on.

              cheers,
              Matthias

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

                THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                On 28/05/2010 at 09:53, xxxxxxxx wrote:

                I upgraded to R11.5, and the test plugin (together with the test DLL) works fine now.  But the real plugin still crashes with the following message:

                Unbehandelte Ausnahme bei 0x000007fefd6caa7d in CINEMA 4D 64 Bit.exe: Microsoft C++-Ausnahme: std::bad_alloc an Speicherposition 0x02c25740..

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

                  THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                  On 28/05/2010 at 13:54, xxxxxxxx wrote:

                  try & catch?  😉 What about a little bit of source code that triggered the crash?

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

                    THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                    On 29/05/2010 at 06:31, xxxxxxxx wrote:

                    Hello again,

                    i debugged the code this morning, made some changes and it seems to work fine. However, there is still one thing which leads to crashes: Whenever i pass a std::string to the dll, the plugin stops executing, but it does work fine when it's passed by reference.

                    This does not work:

                      
                    // method declaration in the dll (parameter passed directly)  
                    bool openFile(string sFullPath);  
                      
                    // ...  
                      
                    // call it from the plugin  
                    std::string str("some filename in here");  
                    if (reader.openFile(str)) {  
                      // ...  
                    }  
                      
                    /* the plugin crashes when the method openFile() returns to the caller an the  
                     * local copy of the passed std::string is deleted.  
                     */  
                    

                    This works:

                      
                    // method declaration in the dll (parameter passed by reference)  
                    bool openFile(string &sFullPath);  
                      
                    // ...  
                      
                    // call it from the plugin  
                    std::string str("some filename in here");  
                    if (reader.openFile(str)) {  
                        // ...  
                    }  
                    

                    I 'solved' the problem by changing everything to 'call by reference' in the dll, but it doesn't feel good having some unexplainable error somewhere around.

                    Greetings,
                    Heinrich Löwe.

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