DLL und BCB



  • hi,

    wenn ich mit dem BCB ne DLL erstelle in der ich mit new[] Speicher reserviere für objekte die ich per zeiger an die DLL uebergebe, dann bekomme ich beim Freigeben des Speichers von Codeguard den Fehler 'Bad parameter'.

    hier mal ein vereinfachtes (aber vom ablauf her identisches) beispiel:

    struct MyObject
    {
      unsigned char *Data;
      unsigned long  Size;
    };
    
    // in der DLL die exportierte funktion
    void BlahFun(MyObject *Object)
    {  
      Object.Data = new unsigned char[100];
      Object.Size = 100;
    }
    
    // in meinem programm
    typedef void (*PFUN_DLL_BLAHFUN) (MyObject *Object);
    PFUN_DLL_BLAHFUN BlahFun;
    
    // DLL laden und Funktionszeiger holen
    void __fastcall TForm1::ExecuteDLLFunction()
    {
      HINSTANCE DLLInst = ::LoadLibrary("my.dll");
      BlahFun           = (PFUN_DLL_BLAHFUN) ::GetProcAddress(DLLInst, "_BlahFun");
    
      // neues objekt vom typ MyObject anlegen
      MyObject Object;
    
      if (BlahFun)
        BlahFun(&Object);
    
    // -> HIER KOMMT ES DANN ZUM FEHLER BEI CODE-GUARD
      delete [] Object.Data;
    }
    

    wenn ich die dynamisch RTL verwende (in der dll und im programm), dann kommt kein fehler.

    kann ich diese dynamisch RTL nicht irgendwie umgehen? ich will nämlich nicht irgendwelche zusätzlichen borland-dlls beim anwender installieren müssen.



  • noch niemand was mit ner dll gemacht?



  • new und delete müssen immer in der selben Programmeinheit benutzt werden, also entweder beides im Hautprogramm oder beides in der DLL, aber NIEMALS(!!!) mischen.

    Am besten du schreibst noch eine Delete-Funktion in die DLL, also

    void DeleteObject(MyObject *Object)
    {
      delete [] Object;
    }
    

    Außerdem müssen in der Funktion "->" hin:

    void BlahFun(MyObject *Object)
    {  
      Object->Data = new unsigned char[100];
      Object->Size = 100;
    }
    


  • danke...

    genauso werde ich das jetzt auch machen. ist alles ziemlich umstaendlich fuer meinen geschmack.


Anmelden zum Antworten