DLL/Klassen/Funktionen



  • Plemplem schrieb:

    Bin einer der 22... habs nicht gerafft.

    Bleiben noch 21.

    Bekommst du auch nen Speicherzugriffsfehler beim delete oder was ??????

    Gruß
    IcemanX



  • Es wäre sicher hilfreich, wenn du neben dem reinen DLL-Code auch ein lauffähiges (Minimal)Projekt mitliefern würdest, in dem die DLL geladen bzw. Klassen/Funktionen daraus verwendet werden.



  • Jansen schrieb:

    Es wäre sicher hilfreich, wenn du neben dem reinen DLL-Code auch ein lauffähiges (Minimal)Projekt mitliefern würdest, in dem die DLL geladen bzw. Klassen/Funktionen daraus verwendet werden.

    Einfach ein neues Projekt mit einem Fenster und 3 Buttons indem
    CRLib.h und CRLib.lib eingebunden werden, dann noch im header folgenden Code:

    extern PACKAGE TCRVerInfo *pVersionInfo;
    extern PACKAGE TCRCPUInfo *pCUPInfo;
    

    ------------------------------------------------------------------------------

    Button1

    pVersionInfo = new TCRVerInfo(Application->ExeName);
      pCUPInfo = new TCRCPUInfo();
    

    Button2

    int iCPUUsage = pCUPInfo->getUsage();
    char szCPUUsage[10];
    strcpy(szCPUUsage, itoa(iCPUUsage, szCPUUsage, 10));
    MessageBox(NULL, szCPUUsage, "", MB_OK);
    
    // Dazu muss *.exe resource Daten besitzen!!!!!
    //String sProductname = pVersionInfo->GetVerInfo(VI_PRODUCT_NAME);
    //MessageBox(NULL, sProductname.c_str(), "", MB_OK);
    

    Button3

    //hier kommt der Fehler
    delete pVersionInfo;
    delete pCUPInfo;
    

    Gruß
    IcemanX



  • IcemanX schrieb:

    Fullqoute gelöscht.

    ---------------------------
    Fehler
    ---------------------------
    Programm 'S:\SOURCE\Cescon\C\Test\Memwatch\1.00.0000\Memwatch.exe' kann nicht gefunden werden.
    ---------------------------
    OK   
    ---------------------------
    

    Ich hab die Projektdatei geöffnen und F9 gedrückt... während dem Linken (oder schon beim Programmstart?) kommt die Meldung.(Ich sage doch, dass ich es nicht raffe! :p )

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • Plemplem schrieb:

    Programm 'S:\SOURCE\Cescon\C\Test\Memwatch\1.00.0000\Memwatch.exe' kann nicht gefunden werden.

    einfach mal unter start parameter die host anwendung entfernen 🙂
    ich schließe daraus, das du auch noch nicht lang mit Borland C++ entwickelst

    Gruß
    IcemanX

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • Das ist genau mein Punkt: wenn du möchtest, dass etwas für dich getestet wird dann solltest du das nach Möglichkeit so vorbereiten, dass andere es ohne Anpassungen an den eigenen Rechner ausprobieren können.
    Zum einen ist es für den Tester bequemer und damit die Wahrscheinlichkeit höher, dass sich jemand die Mühe macht, zum anderen werden eventuelle Unterschiede in der Konfiguration als mögliche Fehlerquelle ausgeschlossen.



  • Danke für den Tip,

    werde ich das nächste mal beachten!!!!! 😃



  • Hallo Leute,

    jetzt wird es kniffelig.

    Habe einen Anhaltspunkt zum problem gelesen.
    Es scheint als läge das Problem daran das der Speicher im Programm reserviert wird und die eingentliche Freigabe aber durch den Dekonstruktor erfolgt, der sich aber in der DLL befindet (logischer weise).

    Beispiel:

    pVersionInfo = new TCRVerInfo(Application->ExeName); // Speicher wird im Programm reserviert
    
    delete pVersionInfo; // Speicherfreigabe wird vom Programm aufgerufen
    
    ///////////////////////////////////////////////////////////////////////////
    
    // wirkliche freigabe scheint aber erst hier statt zu finden  :( 
    declspec_mode TCRVerInfo::~TCRVerInfo(){
      return; // hier kommt es zum Fehler :rage: 
    }
    

    Wie kann mann das umgehen, wie machen das ander Sprachen!!!!!!! 😕

    Irgend ein Speicher Profi anwesend ?????

    Gruß
    IcemanX



  • Du brauchst doch hier keinen Destruktor. Am besten ist es, du löschst das ganze Ding. Ein return im Destruktor ist sowieso Unsinn. Aber das hatte man dir schon gesagt.
    Ich glaube aber nicht das es am Destruktor (nicht "Dekonstruktor") liegt.
    Ich kann dein Projekt nicht selbst testen (ohne größeren Aufwand), da ich Builder 5 habe.



  • Braunstein schrieb:

    Fullquote gelöscht

    Habe den Destruktor auch schon mal weggelassen, bringt auch nichts 😞
    das muss irgendwas mit Speicher Anwendung zu DLL sein, wie ich breits geschrieben hab, oder klappt es bei deinen eigenen DLL´s mit Klassen????

    Gruß
    IcemanX

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • Ich lagere Klassen eher selten in dlls aus. Normalerweise verwende ich statische libs. Außerdem ist es keine gute Idee mit AnsiStrings in dlls zu arbeiten (siehe Hinweise vom dll Assistenten). Ich verwende hier meistens std::string. Ich weiss aber nicht ob es daran liegt. Denn eigentlich sollte es mit dieser Klasse keine Probleme geben.

    Ciao



  • Braunstein schrieb:

    Fullquote gelöscht

    werde es mal umstellen, mal sehen!!!!

    Danke für den Tip, daraus schließe ich das du keine delete Probleme hast!!!!

    Gruß
    IcemanX

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • Hallo Braunstein,

    also liegt nicht an AnsiString!!!!!!!!!!!

    Ich könnte weinen ... dieses Problem macht mich wahnsinnig 😡



  • Hallo,

    Hast du es mal mit einer normalen lib versucht ? Nur um herauszubekommen, ob es an der dll liegt. Dann könntest du den Destruktor z. Bsp. wieder einfügen und dort einen Breakpoint setzen. So kannst du kontrollieren wie oft er aufgerufen wird. Evtl. wird einmal zu oft das delete aufgerufen.
    Tritt der Fehler auch bei einem absoluten Minimalprojekt auf ?



  • So, ich hab mir jetzt dein Projekt mal zusammengebastelt. Beim delete pVersionInfo gibts bei mir keine Probleme. Die Schutzverletzung kommt beim nächsten delete, genauer gesagt im Destruktor von TCRCPUInfo beim Versuch delete CPUInfoThread; auszuführen. Das muss auch schiefgehen, da du FreeOnTerminate auf true gestellt hast, der Thread somit durch den Aufruf von Terminate schon gelöscht wurde. Lass das delete da einfach weg.
    Konntest du deinen Quellcode überhaupt ordentlich compilieren ? Ich musste erst mal einiges umstellen. Die Includeguards fehlen bei dir bzw. sind falsch angeordnet.



  • Hallo Braunstein,

    bei mir kommt auch beim delete von pVersionInfo ein Fehler!!!!!!
    Ich erzeuge pVersionInfo im Hauptprogramm mit:

    TCRVerInfo *pVersionInfo;
    pVersionInfo = new TCRVerInfo(Application->ExeName);
    

    ist das falsch????

    Aber das mit Thread check ich mal, bin Recht neu in der C++ Welt, unter Xbase++ läuft es ein bischen anders mit Threads.

    Aber compilieren geht bei mir, lieg wahrscheilich an unseren unterschiedlichen Umgebungsvar.

    Besten Grüße
    IcemanX 🙂



  • Das ist nicht falsch. Wo rufst du da dein delete auf? Wenn das so hintereinander in deinem Code steht, ist pVersionInfo lokal (also nur im entsprechenden Scope gültig). Mach diese Variable mal lieber zu einem Member deiner Form.
    Zur Not könnte ich dir mein BCB5-Projekt per Mail schicken.

    Ciao



  • pVersionInfo ist global!!!

    hab dir grad ne mail geschickt!

    Danke für deine Mühen 🙂

    Gruß
    IcemanX


Anmelden zum Antworten