lazarus uruchamianie DLL

0

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:

  1. program odczytujący biblioteki nie pobiera funkcji ani procedur (albo pobiera błędnie). niestety stara, działająca wersja się nadpisała.

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

0
  1. to co Patryk napisał
  2. gdzie są stdcall
0

function NazwaBiblioteki:string;

NIE WOLNO strosować typu string w wejściu ani wyjściu procedury dllki, użyj PChar (poczytaj sobie z czym to się je).

hZaczep

Po co spolszczasz nazwy? Jakoś nie łapię tego...

program odczytujący biblioteki nie pobiera funkcji ani procedur (albo pobiera błędnie). niestety stara, działająca wersja się nadpisała.

Pobiera, ale źle wykonuje, gdyż wywołanie tej procedury jest w samobójstwem (dla programu).

if not assigned(DynLibraryName) then showmessage('Błąd biblioteki');
if assigned(DynLibraryName) then

O sekcji else słyszał? :P

0

... to nie wiem czemu kiedyś mi to działało...
ale dziękuję - pomogło ;)

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