Hej :)
Oczywiście można wykorzystywać bibliotekę z zasobów, tylko jak tu
kolega wcześniej podpowiedział trzeba ją wywołać dynamicznie czyli
z procedury.
PRZYKŁAD:
-
wydobywasz biblię z zasobów zapisując ją do katalogu
-
z procedury wywołujesz tak:
//Kod pochodzi z programu "Imieniny" autora nie pamiętam za co przepraszam
PROCEDURE TForm1.ButtonDynamiczneDllClick(Sender: TObject);
var
uchwytDll:THandle; //uchwyt biblioteki
{typ parametru i typ zwracanego rezultatu musi być identyczny jak w funkcji
z biblioteki}
LokalnaNazwaFunkcji:function(DowolnaNazwaParametru: Integer): ShortString;StdCall;
Begin
uchwytDll:=LoadLibrary('Imieniny.Dll'); //załadowanie biblioteki (nazwa:PChar !)
if HandleDll=0 then
begin //sprawdzenie sukcesu
MessageDlg('Nie można załadować biblioteki',mtError,[mbOK],0);
Exit;
end;
//biblioteka załadowana, przypisujemy wskaźnik do funkcji z bibliotek
//nazwa funkcji z Dll oraz wielkość liter ważna !
@LokalnaNazwaFunkcji:=GetProcAddress(HandleDll,'Imieniny'); //przypisanie wskaźnika
//zabezpieczenie przed błędem
if @LokalnaNazwaFunkcji= nil then
begin
ShowMessage('Błąd. Nie można znaleźć funkcji biblioteki DLL');
FreeLibrary(HandleDll); // NIE ZAPOMINAĆ !!! -była załadowana z sukcesem
Exit;
end;
//nareszcie korzystamy z funkcji
Label1.Caption:='Wczoraj było '+ LokalnaNazwaFunkcji(-1) +
' :bądźmy dziś dla nich wyrozumiali' ;
Label2.Caption:='Dziś ' + LokalnaNazwaFunkcji(0) + ' ZDOROWIA ŻEŁAJEM' ;
Label3.Caption:='Cierpliwości, jutro ' + LokalnaNazwaFunkcji(1) ;
//po wykorzystaniu
// NIE ZAPOMINAĆ !!!
FreeLibrary(HandleDll); //Zwolnienie pamięci
End;
PS. Gdy byś ją wywołał na samym początku listingu w sekcji INTERFACE
to już przy starcie programu miałbyś błąd (odwołanie do niej)
Mój problem :-/ nadal nie rozwiązany . Prosze zerknijcie:
<url> http://4programmers.net/Forum/viewtopic.phpid=51977&p=0#12903</url>
<url>http://4programmers.net/Forum/viewtopic.phpid=52076&p=0#129415 </url>