X
ďťż

Ł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
  •  

    Drogi uzytkowniku!

    W trosce o komfort korzystania z naszego serwisu chcemy dostarczac Ci coraz lepsze uslugi. By moc to robic prosimy, abys wyrazil zgode na dopasowanie tresci marketingowych do Twoich zachowan w serwisie. Zgoda ta pozwoli nam czesciowo finansowac rozwoj swiadczonych uslug.

    Pamietaj, ze dbamy o Twoja prywatnosc. Nie zwiekszamy zakresu naszych uprawnien bez Twojej zgody. Zadbamy rowniez o bezpieczenstwo Twoich danych. Wyrazona zgode mozesz cofnac w kazdej chwili.

     Tak, zgadzam sie na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerow w celu dopasowania tresci do moich potrzeb. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

     Tak, zgadzam sie na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerow w celu personalizowania wyswietlanych mi reklam i dostosowania do mnie prezentowanych tresci marketingowych. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

    Wyrazenie powyzszych zgod jest dobrowolne i mozesz je w dowolnym momencie wycofac poprzez opcje: "Twoje zgody", dostepnej w prawym, dolnym rogu strony lub poprzez usuniecie "cookies" w swojej przegladarce dla powyzej strony, z tym, ze wycofanie zgody nie bedzie mialo wplywu na zgodnosc z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.