DLL "przed" czy "po" ?:)

0

Mam pewnego dll'a. Czy moge uruchomic program tak, zeby wypakowac jakos tego dll'a np. z resource'ow na czas pracy programu? Sumienie podpowiada mi, ze nie - inaczej nie byloby tego balaganu w Windowsie :) ale moze sie myle?

Przy okazji - czy CopyFile ma jakies ukryte sposoby kopiowania? ;) Pomimo atrybutu 'true' (nadpisywanie) program nic nie robi.

Jacek

0

Oops - ten błąd kopiowania rozwiązał się. W książce p. Boducha jest błąd - a tym się sugerowałem.

Jacek

0

hmm a czemu nie? Zapisujesz i linkujesz go dynamicznie

0

hmm a czemu nie? Zapisujesz i linkujesz go dynamicznie

Chyba jestem na to jeszcze za głupi... Jeśli możesz mi podpowiedzieć, jak to zrobić... Jak nie mam dll'a w katalogu programu, czy system32 to program nie uruchamia się. DLL jest gotowy - dostałem takowy jako plik i wykorzystuję z niego właściwie trzy funkcje. W sekcji interface mam wpis:
function TENDLL_Initialize: longint; stdcall; external TENDLL.DLL';
function TENDLL_PlayAudioByTakeID(ID: Longint): Longint; stdcall; external TENDLL.DLL';
function TENDLL_Finalize: longint; stdcall; external TENDLL.DLL';

Będę dźwięczny za pomoc.

Jacek

0

Po prostu musisz poczytac o dynamicznie dolaczanych dllach, powinno byc troche tego na tej stronie, jak nie to google, jakbym mial troche kodu to bym ci podrzucil, ale nie bylo mi to nigdy potrzebne ...

0

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:

  1. wydobywasz biblię z zasobów zapisując ją do katalogu

  2. 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>

0

Bardzo dziękuję, wkrótce znajdzie się w programie ;)

Pozdrawiam,
Jacek

0

Moze mi ktos powiedziec jak wypakowac biblioteke DLL z zasobow?
Zasoby to roznego rodzaju dane zazwyczaj wkompilowywane w program (albo w biblioteke DLL). Biblioteka DLL to taki maly niesamodzielny programik (albo dokladniej zbior funkcji oraz zasobow). Biblioteki DLL NIGDY nie sa wkompilowywane w program. Dolaczane sa statycznie lub dynamicznie, ale zawsze sa oddzielnymi plikami. Wiec jak chcecie wydobyc biblioteke z zasobow. Przeciez to nie ma sensu (albo ja was nie zrozumialem).

0

Do exka można dolinkować co się chce, dlla też jako RC_DATA, można go potem wypakować z exeka i "niby" używać go potem dynamicznie. Próbowałem tak kiedyś, ale trzeba chwilę poczekać (jakiś delay dać) między wyładowaniem, a podlinkowniem, bo wywali błąd, że nie znaleziono dll'a. Ogólnie pomysł do d**y i całkowicie nieciekawy, ale działać teoretycznie powinno, mi nie chciało. :-D

0

Do exka można dolinkować co się chce, dlla też jako RC_DATA

Tylko po co to, jak mozna od razu w kodzie umiescic ? :/

0

Do exka można dolinkować co się chce, dlla też jako RC_DATA

Tylko po co to, jak mozna od razu w kodzie umiescic ? :/

Mnie potrzebne po to, ze dll nie jest moj - nie ma jego kodu i na moje potrzeby udokumentowano i tylko potrzebne funkcje, chce program wykonywalny miec jako jeden plik; ktory jedynie na czas pracy wypakuje tego dll'a, potem go wywali.

Jacek

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