ďťż

Ładny brzuch

Witam ponownie,
niestety napotkałem problem i nie mogę sobie z nim poradzić choć kombinowałem wieleeee godzin na różne sposoby. Konkretnej odpowiedzi też nie wygoglałem. Problem tyczy biblioteki DLL ładowanej statycznie i wywoływaniu destruktora jej klasy. Jeśli obiekt klasy w kodzie aplikacji wywoływana jest metodą TestClassDLL xtest;
a następnie wywoływany jest destruktor xtest.~TestClassDLL(); aplikacja zachowuje się prawidłowo.

Problem pojawia się jak obiekt klasy wywoływany jest metodą dynamiczną operatorem new i w klasie w DLL wystepuje destruktor. W chwili niszczenia obbiektu delete test; test = NULL; wywalany jest błąd
Access violation at address 0371F24 in module TESTDLL.DLL Write adress 00002404
kursor debugera wskazuje na destruktor w klasie zawartej w bibliotece DLL; Kombinowałem z __fastcall i bez ale nic to nie daje. Poniżej cały kod jest bardzo prosty praktycznie pusty, ale jak zawiera jakieś zmienne jest tak samo:
Kod z DLL
#ifndef MY_DLL_TEST_H #define MY_DLL_TEST_H __declspec(dllexport) class TestClassDLL { private: char *adres_www; public: __fastcall TestClassDLL(char *www); __fastcall ~TestClassDLL(); char *__fastcall GetAdres(void); }; #endif // TestDLL //--------------------------------------------------------------------------- // KOd bibliteki DLL TestDLL.dll #include <windows.h> #include "MojTestDLL.h" #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- __fastcall TestClassDLL::TestClassDLL(char *www) { // Konstruktor adres_www = www; } __fastcall TestClassDLL::~TestClassDLL() { // Destruktor } char *__fastcall TestClassDLL::GetAdres(void) { return (char *) adres_www; }
Wywołanie w programie:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { test = new TestClassDLL("jakis adres www"); ShowMessage(test->GetAdres()); delete test; test = NULL; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TestClassDLL xtest("inny adres www"); ShowMessage(xtest.GetAdres()); xtest.~TestClassDLL(); } //---------------------------------------------------------------------------Jeśli klasa nie zawiera destruktora problem przy niszczeniu obiektu nie występuje... Ale chyba nie tedy droga..i chować głowę w piasek i cieszyć się że działa :(
Proszę o pomoc w tej kwestii...
Użytkownik Darek_c++ edytował ten post 13 styczeń 2007, 01:25
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •