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?