problem z biblioteką DLL

0

Tworzę sobie najprostszą bibliotekę DLL zawierającą formę i przycisk zamykający:

library project1;

{$mode objfpc}{$H+}

uses
  Classes, Unit1, Forms, Interfaces, Form1 in 'Unit1.pas'
  { you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

procedure SF;register;
var
Form:TMainForm;
begin
Form:=TMainForm.Create(Application);
Form.ShowModal;
Form.Free;
end;

exports
SF name 'SF';

begin
end.

ale dostaję komunikat: project1.lpr(13,15) Error: Identifier not found "TMainForm"

więc zmieniam MainForm na po prostu Form.

kompilacja prawidłowa

do tego aplikacja statycznie ładująca DLL'a i uruchamiająca procedurę wyświetlenia okna po naciśnięciu przycisku.

Okno owszem pojawia się ale standardowego rozmiaru, bez ikony tytułu, bez niczego. po kliknięciu krzyżyka wyświetla się jakiś błąd natychmiast znika zarówno okno z DLL jak i programu uruchamiającego, mimo że w systemie aplikacja wciąż działa.

DLACZEGO TAK SIĘ ROBI?! CO JEST NIE TAK Z TĄ BIBLIOTEKĄ?!

0

Masz tu przeklejkę z mojej dll'ki z foremką. Zrobiłem to po prostu zmieniając project na library ( i doklejając SKD plugina ) w głównym pliczku projektu ]:>
Te trzy linijki wykonują się gdy dll'ka jest ładowana, ale możesz je wsadzić gdzie indziej.

W Turbo Delphi 2006 to działało, ale chyba używasz Lazarusa ( BLE! ) sądząc po śmieciach w kodzie więc pewnie nie zadziała ];>

library RMS;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;end.
0

@dll: przeanalizuj sobie źrodło pod poniższym adresem, bo tam wszystko działa jak trzeba:
http://www.speedyshare.com/files/24848138/zabawy_z_dll.rar a przynajmneij w Delphi7.

0

może dlatego, że tak się nie robi. Dll to nie exe, dll rządzi się trochę innymi prawami. Najpierw poczytaj chociaż trochę o bibliotekach a dopiero potem się za nie bierz.

a tak poza konkursem to oczywiście TMainForm jest w projekcie dll a nie w exe :>

0
Misiekd napisał(a)

może dlatego, że tak się nie robi. Dll to nie exe, dll rządzi się trochę innymi prawami. Najpierw poczytaj chociaż trochę o bibliotekach a dopiero potem się za nie bierz.

a tak poza konkursem to oczywiście TMainForm jest w projekcie dll a nie w exe :>

no to u mnie w DLL jest Form, a TMainForm nie istnieje :|

tak niestety używam Lazarusa ze względu na licencję

wiem, że DLL to nie EXE, ale przecież jest możliwość odpalania okna z DLL'a?

@Misiekd: powiedz mi w takim razie czy da się zrobić coś takiego, żeby kilka programów zamknąć w DLL'ach i uruchamiać jednym programem. Potrzebuję czegoś w rodzaju Launchera, który będzie odpalał aplikacje, które nie będą aplikacjami, tylko właśnie DLL'ami

ufff, Pozdro!

0

Olesio: Nigdy nie pomyślałem żeby przekazać Application do dll'ki :>
Nie zgłębiałem tematu bo VCL jakoś uciągnąło moją herezję.

A dlaczego nie możesz użyć Turbo Delphi albo starszego Personal ?

0

no właśnie miałem napisać że Application.Handle odpada
ale mimo to zrobiłem pół kroku do przodu:
odpala się forma z DLL'a, ale button na niej działa
zamknięcie okna DLL'a powoduje zamknięcie aplikacji uruchamiającej (pozostaje w procesach)
a krzyżyk w oknie głównym nie robi nic :/

0

Kiedys bardzo dawno bawilem sie borlandem i o ile pamietam, to najlepiej jest nie eksportowac zadnych klamotów vcl - zamiast tego nalezy wyeksportowac funkcje, ktora pokazuje formularz, przyjmującą jak argument HWND (to hwnd z WinApi), które będzie uchwytem parenta. I tyle.

0

Ja trochę źle podszedłem do tematu, ale mój przykład też przekazuje do
osobnej dllki Appication.Handle, ale trzeba by to była dokładniej zrobić i
to w taki sposob jak pisze othello. Ale ja nie jestem ekspertem w dllach.

0

no właśnie Olesio Twoje działa, napisałem w Lazarusie i Delphim i nie działa :/
no i cholera nie wiem co tu jest źle ;(
załączam pliki Lazarusa i Delpha, przy czym na Lazarusie mi bardziej zależy
mam prawie gotowy Launcher który wyszukuje biblioteki w katalogu programu, tylko brakuje żeby pobierał z nich nazwy i poprawnie uruchamiał
jak ktoś to rozkmini to ma u mnie piwo [browar] tzn jak już będę wiedział co robię źle i czemu to się nie uruchamia to reszta już pikuś

http://wrzucacz.pl/file/8401287957367 - Lazarus
http://wrzucacz.pl/file/1171287957367 - Delphi

0

MUUUH!!!
Problem był w loaderku a nie w bibliotece.
Zajrzałbyś do pomocy Delphinka i ( o ile byś zrozumiał co tam jest napisane ) nie miał byś problemu ]:>
Z takim fetyszem okienko dll'ki się ukazuje, i zamyka normalnie ( tylko herezja z Terminate nie działa, bo i dlaczego miała by działać :> Terminate jest słabe, używaj Halt jak już )

procedure TMainForm.runClick(Sender: TObject);
var c:cardinal;
  odpalaj:procedure;stdcall;
begin
c:=Windows.LoadLibrary('..\project1.dll');
@odpalaj:=Windows.GetProcAddress(c,'showform');
odpalaj;
end;

Oczywiście te zmienne nie powinny być lokalne ( w przycisku ) bo dll'a powinno się jeszcze zwolnić po tym całym molestowaniu.

0

pierwszy error:
unit1.pas(36,1) Error: Can't assign values to an address

usuwam "@":
unit1.pas(36,10) Error: Incompatible types: got "Pointer" expected "<procedure variable type of procedure;StdCall>"

więc prędzej

pointer(odpalaj):=Windows.GetProcAddress(c,'showform'); 

ale to też jeszcze haczy :/ tzn nie działa zamykanie tego okna ani żadna procedura w nim zapisana

0

przykładowo jeszcze taki kod:

    DLL:=LoadLibrary(PChar('xxx.dll'));
    pointer(funkcja):=GetProcAddress(DLL,'nazwabiblioteki');
    //nazwa:=funkcja();
    FreeLibrary(DLL); 

działa z wyjątkiem właśnie kluczowego momentu (tego "wydziabanego" przez //)

a co do pomocy, to po używaniu Lazarusa na śmierć zapomniałem że Delphi ma takie coś ;)

0

małe uproszczenie:

w bibliotece nie robiłem funkcji ShowForm, tylko dałem wszystko między begin a end;

w programie zrobiłem tylko LoadLibrary('biblioteka.dll') i FreeLibrary

efekt jest o tyle lepszy że zamykając okno biblioteki zamyka się program uruchamiający i znika z procesów

ale wciąż nie działa forma z biblioteki i jej zamknięcie powoduje zamknięcie aplikacji :/

0

I jak tu nie krzywić się na wszystko z prefixem Free :>

Zaglądnąłes to od Olesia? Masz tu gadżecik z jego trickem :>
Runer:

var c:cardinal;
  odpalaj:procedure(apphandle:pointer);stdcall;

implementation

{$R *.dfm}

procedure TMainForm.Button1Click(Sender: TObject);
begin     
Windows.FreeLibrary(c);
end;

procedure TMainForm.runClick(Sender: TObject);
begin
c:=Windows.LoadLibrary('..\project1.dll');
@odpalaj:=Windows.GetProcAddress(c,'showform');
odpalaj(Application);
end;

DLL

procedure showform(apphandle:pointer); stdcall;
begin
Form1:=TForm1.Create(apphandle);
Form1.Show();
end;

To że to działa nie zmienia faktu że tak raczej nie powinno się robić.
Ale kogo to obchodzi kiedy to działa :>

0

Aplikacja główna była zamykana przez zamknięcie okna z DLL gdyż okno z DLL jako jedyne w DLL, przez tą całą herezję, uważało się za główną formę apliakcji ( główna forma aplikacji ubija cały progsik przy zamykaniu siebie )
Przy przekazaniu Application formy z dll'a włażą do puli programu ( jeszcze przydało by się ustawić Parent formeki ) okienko z dll powinno być chyba dostępne przez kolekcję komponentów w Application.

I wyjaśnij dlaczego nie możesz użyc Turbo Delphi? ( Albo przejść na Visual Expressy - od wyjścia VS 2k8 Delphi straciło tytuł najwygodniejszego IDE :> )

0

a już mam Visual C++ 2010 Express tak dla siebie, tylko mi jeszcze chodzi o to że to będzie na zlecenie a Delphi ani Visual nie mają licencji na zastosowania komercyjne za cenę niższą niż wartość zlecenia ;)
tak wiem nie powinienem się brać za zlecenia nie ogarniając DLL, ale przecież człowiek całe życie się uczy ;) a DLL'e powinienem ogarnąć w gimnazjum jak zaczynałem pisać

0

wytłumacz mi o co chodzi z tą małpą?
błąd taki sam: unit1.pas(38,1) Error: Can't assign values to an address
tudzież unit1.pas(38,10) Error: Incompatible types: got "Pointer" expected "<procedure variable type of procedure(Pointer);StdCall>"
dopiero tak poszło:

pointer(odpalaj):=Windows.GetProcAddress(c,'showform');

a w DLL'u project1.lpr(13,31) Error: Incompatible type for arg no. 1: Got "Pointer", expected "TComponent" w linijce Form1:=TForm1.Create(apphandle);
ale zmieniłem na TComponent w deklaracji i jedziemy

kurde błądzenie po omacku w tym shicie darmowym

też nie idzie. Chociaż tą felerną procedurę GetProcAddress można ominąć ale to bez znaczenia. kurde olek! dziadostwo :P

0

dzięki za pomoc chłopaki ale ja już w to zaczynam wątpić

0

O co chodzi z małpą? Pewnie o banany :>
Tak było w przykładzie, tak robię i tak działą :>
A Expressy to chyba zezwalają na komercyjne? Zagogliłem na szybko i wychodzi że można :>
W sumie to samo gogul mi mówi o Turbo.
Poczytaj sobie licencję, bo jak widzę że Lazarusik to małpy nie ogarnia to mnie skręca ]:>

0

no właśnie przy instalacji czytałem licencję i tam było takie zdanie:

Distribution Restrictions. You may not
• alter any copyright, trademark or patent notice in the Distributable Code;

może ja to źle rozumiem, ale wydaje mi się, że jednak nie można ;)
ale może dorwę kogoś kto mi udostępni legala do samej kompilacji ;)

0

Turbo zezwalało na komercyjne wykorzystanie ale właśnie zajrzałem do Borlanda i się okazuje że zaprzestał licencjonowania Turbo, zuooo, dobrze że mam jeszcze 35046 dni na licencji ]:>
A co do Express od M$ to łap cytat z FAQ

Can I use Express Editions for commercial use?
Yes, there are no licensing restrictions for applications built using Visual Studio Express Editions.

Jeżeli lubiłeś Delphi za wygodę, tak jak ja, to zakochasz się w nowym Visualku i ogólnie w .NET ( nawet nie dotykaj VB.NET! tylko C#! ) :>

0

o to żeś mi tym cytatem humor poprawił :)
no to pora do pascala i javy nauczyć się jeszcze C++ i będzie wypasik
i po co ludzie idą na studia informatyczne :PP

0

PS do którego Expressa się to FAQ odnosi? może jeszcze do 2010? :)

0

Wszystkich z tego co wiem. Szukałem tak na szybko ale jak pokopiesz to wygrzebiesz info o danym expresie.
I nie C++ tylko C# :>
Z Delphi to jest bezbolesna przesiadka. A największa zaleta Delphi, VCL, jest niczym w porównaniu do bibliotek .NET'a.

0

w takim razie od piątku biorę się za zgłębianie różnic między C++ a C# i całej reszty tego majdanu :)

0
DLL napisał(a)

PS do którego Expressa się to FAQ odnosi? może jeszcze do 2010? :)

2005, 2008, 2010.

1 użytkowników online, w tym zalogowanych: 0, gości: 1