Jak przesłać dynamicznie utworzony objekt do dll?

problemy z funkcjonowaniem bibliotek, komponentów itp.

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez banita » wtorek, 25 maja 2010, 13:54

a stwozyles klase formy o takiej nazwie w dll? nie!
to jest tylko przyklad! jesli masz podstawowa wiedze nie powinno byc problemu z odtworzeniem tego, jesli jest problem to chyba tzreba zaczac nauke od podstaw
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez duf » wtorek, 25 maja 2010, 14:17

banita napisał(a):a stwozyles klase formy o takiej nazwie w dll? nie!
to jest tylko przyklad! jesli masz podstawowa wiedze nie powinno byc problemu z odtworzeniem tego, jesli jest problem to chyba tzreba zaczac nauke od podstaw

Tworzę w głównej aplikacji obiekt TImage i przekazuje go do DLL poprzez wskaźnik i tam próbuję załadować plik .bmp. Niestety dostaję błąd Access violation in module dll. Natomiast gdy załaduje plik wcześniej czyli w głównej aplikacji i przekażę wskaźnik do DLL to dostaje komunikat, że nie mogę modyfikować zawartości TImage bo nie zawiera ona bitmapy. Myślę, że problem nie leży po stronie niewłaściwego podłączania biblioteki jak i też niewłaściwego kodu w dll. Nie mam problemu z otworzeniem okna utworzonego dynamicznie w głównej aplikacji i przesłaniu wskaźnika do dll.
Kod: Zaznacz cały
TForm* form = new TForm(this);

Mam problem z wczytaniem pliku do TImage.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez banita » wtorek, 25 maja 2010, 14:34

załacz przykladowa grupe projektow(dll i aplikacja) ktora obrazuje ten blad.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez duf » wtorek, 25 maja 2010, 15:01

banita napisał(a):załacz przykladowa grupe projektow(dll i aplikacja) ktora obrazuje ten blad.

Kod: Zaznacz cały
In DLL

extern "C" __declspec (dllexport) void Druk ( TImage* newimage )
{
  try
  {
   newimage->Width = 950;
   newimage->Height = 1280;
   newimage->Proportional = true;

   newimage->Canvas->Font->Size = 9;
   newimage->Canvas->Font->Name = "Verdana";
   newimage->Canvas->Brush->Style = bsClear;*/

   newimage->Canvas->TextOut( 20, 50, "TEST" );

   Printer()->BeginDoc();

   Printer()->Canvas->CopyRect(Rect(0, 0, Printer()->PageWidth, Printer()->PageHeight),  newimage->Canvas, Rect(0, 0, newimage->Width, newimage->Height));
   
   Printer()->EndDoc();
  }
  catch( const Exception& e ) {

   ShowMessage(e.Message);   
  }

In main form

TImage* newimage = new TImage(NULL);
newimage->Picture->LoadFromFile( "plik.bmp" );

    HINSTANCE DLLHandle = LoadLibrary(L"Projectmydll.dll");

   if(DLLHandle != NULL)
   {
      typedef (*aDruk)(TImage*);

      aDruk Druk = (aDruk)GetProcAddress(DLLHandle, "_Druk");

      if( Druk != NULL) Druk( newimage );
      else ShowMessage( "Lack of function" );
   }
   else ShowMessage( "Lack of DLL." );

   FreeLibrary(DLLHandle);

   delete newimage;

Ten przypadek daeje błąd typu: nie mogę modyfikować zawartości image bo nie zawiera ona bitmapy.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez Cyfrowy Baron » wtorek, 25 maja 2010, 16:12

Klasa TImage nie dziedziczy po klasie TWinControl, więc nie posiada własnej powierzchni. Nie jestem tego pewien, ale musi chyba posiadać rodzica, by można było wykonywać na niej operacje.

Kod: Zaznacz cały
TImage* newimage = new TImage(this);
newimage->parent  = this;
newimage->Picture->LoadFromFile( "plik.bmp" );


Operacje wykonujesz w zasadzie na płótnie TCanvas, więc dlaczego używasz wskaźnika na TImage, skoro równie dobrze i prościej będzie używać wskaźnika na TCanvas.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
duf
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez banita » wtorek, 25 maja 2010, 16:40

sprobuj jeszcze

image->Picture->Bitmap->LoadFromFile

Za ten post autor banita otrzymał podziękowanie od:
duf
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez duf » wtorek, 25 maja 2010, 19:00

banita napisał(a):sprobuj jeszcze
image->Picture->Bitmap->LoadFromFile

BINGO!!! :-D
Błąd access violation zmienił kierunek z DLL na project główny. Z głównej aplikacji usunąłem zapis
Kod: Zaznacz cały
delete newimage; // <--- wpisałem to do dll.

i wydaje się, że wszystko już zachodzi poprawnie. Tyle czasu. Dziękuję za pomoc. :-)
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez Cyfrowy Baron » wtorek, 25 maja 2010, 19:44

Po wykorzystaniu musisz odłączyć bibliotekę, wtedy będziesz mógł usunąć obiekt newimage.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez banita » wtorek, 25 maja 2010, 20:48

duf napisał(a):
banita napisał(a):sprobuj jeszcze
image->Picture->Bitmap->LoadFromFile

BINGO!!! :-D
Błąd access violation zmienił kierunek z DLL na project główny. Z głównej aplikacji usunąłem zapis
Kod: Zaznacz cały
delete newimage; // <--- wpisałem to do dll.

i wydaje się, że wszystko już zachodzi poprawnie. Tyle czasu. Dziękuję za pomoc. :-)


nie wolno ci alokowac zasobu w aplikacji i zwalniac go w dll!!!!!!

czytaj co napisal CB w ostatnim poscie
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez duf » środa, 26 maja 2010, 07:31

banita napisał(a):
nie wolno ci alokowac zasobu w aplikacji i zwalniac go w dll!!!!!!

czytaj co napisal CB w ostatnim poscie

To w jaki sposób zwolnić dll. Przecież występuje instrukcję
Kod: Zaznacz cały
FreeLibrary(DLLHandle);

przed
Kod: Zaznacz cały
delete newimage;

Gdzie mam zwolnić pamięć?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez Cyfrowy Baron » środa, 26 maja 2010, 09:27

Chodzi o ten fragment Twojej wypowiedzi:

duf napisał(a):
Kod: Zaznacz cały
delete newimage; // <--- wpisałem to do dll.


wpisałem to do dll

czyli wynika z tego, że definiujesz obiekt w aplikacji, a usuwasz go w bibliotece, co jest niedopuszczalne. Definiujesz w aplikacji, więc usuwasz w aplikacji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez polymorphism » środa, 26 maja 2010, 10:47

A ja zapytam przewrotnie: po co ta DLL-ka?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez duf » środa, 26 maja 2010, 11:25

Cyfrowy Baron napisał(a):Chodzi o ten fragment Twojej wypowiedzi:

duf napisał(a):
Kod: Zaznacz cały
delete newimage; // <--- wpisałem to do dll.


wpisałem to do dll

czyli wynika z tego, że definiujesz obiekt w aplikacji, a usuwasz go w bibliotece, co jest niedopuszczalne. Definiujesz w aplikacji, więc usuwasz w aplikacji.

Jak usuwam w aplikacji to jest błąd access violation
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez duf » środa, 26 maja 2010, 11:26

polymorphism napisał(a):A ja zapytam przewrotnie: po co ta DLL-ka?

Tak sobie do nauki.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak przesłać dynamicznie utworzony objekt do dll?

Nowy postprzez polymorphism » środa, 26 maja 2010, 11:40

duf napisał(a):Jak usuwam w aplikacji to jest błąd access violation

Zapewne biblioteka i aplikacja korzystają z różnych stert, a to musi się skończyć katastrofą. Zasada jest prosta: alokujesz pamięć w bibliotece, w bibliotece zwalniasz. Analogicznie z aplikacją. Trzymając się tej zasady unikniesz wielu tego typu problemów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości

cron