Napisałem sobie kiedyś program wykorzystujący prosty system pluginów, całość była dość prosta: w każdej bibliotece DLL znajdowała się funkcja "start" pobierająca ciąg PAnsiChar i taki sam zwracająca. Pozwalało to dość znacznie rozszerzyć działanie programu, bez ingerencji w główny exe. Efektem była dynamiczna podmiana jednej z funkcji programu, zależnie od załadowanej biblioteki.

W pewnym momencie przestało mi to wystarczać i napisałem bardziej zaawansowany system obsługi pluginów, jednak do poprzedniej wersji powstało kilkanaście użytecznych bibliotek z których chcę korzystać do czasu powstania nowych odpowiednio przystosowanych wersji, wpadłem więc na pomysł napisania pluginu pełniącego rolę "przejściówki" między starym, a nowym systemem, czyli biblioteki DLL, która ładuje bibliotekę DLL starego typu, wykonuje zawartą w niej funkcję i zwraca dane do EXE.

Stworzyłem więc DLL z takim kodem:

function start(cmd: TPolecenie):TPluginControl;stdcall;
var
DL : THandle;
startuj : function(par: PAnsiChar):PAnsiChar; stdcall;
begin
DL := LoadLibrary(PChar(cmd.pr1+'.dll'));
  try
    @startuj := GetProcAddress(DL, 'start');
     if @startuj = nil then Result.data:='Nie można załadować biblioteki' else
    begin
    Result.data:=startuj(PAnsiChar(cmd.pr2));
    end;
  finally
    FreeLibrary(DL);
  end;


end;

Wszystko ładnie się skompilowało, ale przy próbie wykorzystania starej biblioteki dostaję AccessViolation.

Wie ktoś może jak to zrobić nie modyfikując exe?