napisałam kiedyś program który uruchamiał programy zapisane w formie bibliotek DLL. wszystko działało poprawnie. wczoraj chciałam napisać bardzo podobny, ale okazało się że zasada ctrl+c i ctrl+v zawodzi
po skompilowaniu starego projektu i zamykaniu zapytał mnie o zapisanie zmian (mimo że żadnych nie było)
no i teraz tak:
-
program odczytujący biblioteki nie pobiera funkcji ani procedur (albo pobiera błędnie). niestety stara, działająca wersja się nadpisała.
-
jeśli skompiluje bibliotekę na nowo, też pyta o zapisanie zmian i ta biblioteka wywołuje błąd typu "Access Voilation" (stare biblioteki po prostu są nieodczytywane, ale nie powodują błędów)
kod programu:
private
hZaczep: TlibHandle;
...
hZaczep:= LoadLibrary(SR.Name);
if hZaczep <> 0 then begin
pointer(DynLibraryName):= GetProcedureAddress(hZaczep,'NazwaBiblioteki');
end;
end;
if not assigned(DynLibraryName) then showmessage('Błąd biblioteki');
if assigned(DynLibraryName) then
ListBox.Items.Add(DynLibraryName())
else showmessage('Błąd biblioteki');
DynLibraryName jest funkcją zwracającą tekst
kod biblioteki:
library project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces,
Forms, Unit1;
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
const
nazwa='Basic';
function NazwaBiblioteki:string;
begin
result:=nazwa;
end;
exports NazwaBiblioteki;
begin
end.
plus jeszcze wyświetlanie formy, ale to nie ma znaczenia czy dodam procedurę czy nie.
CO TAKIEGO MOGŁO SIĘ STAĆ?! ZMIENIŁAM WERSJĘ LAZARUSA I ZMIENIŁA SIĘ JAKAŚ BIBLIOTEKA?!