четверг, 3 июля 2014 г.

Динамическая загрузка функции из DLL

{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

var      Form1: TForm1;      GetSimpleText: function(LangRus: Boolean): PChar;      LibHandle: THandle;procedure Button1Click(Sender: TObject);begin  {"Чистим" адрес функции от "грязи"}  @GetSimpleText := nil;  {Пытаемся загрузить библиотеку}  LibHandle := LoadLibrary('MYDLL.DLL');  {Если все OK}  if LibHandle >= 32 then begin    {...то пытаемся получить адрес функции в библиотеке}    @GetSimpleText := GetProcAddress(LibHandle,'GetSimpleText');    {Если и здесь все OK}    if @GetSimpleText <> nil then      {...то вызываем эту функцию и показываем результат}      ShowMessage(StrPas(GetSimpleText(True)));  end;  {И не забываем освободить память и выгрузить DLL}  FreeLibrary(LibHandle);end;


ПРИМЕЧАНИЕ: Следует воздерживаться от использования типа string в библиотечных функциях, т.к. при его использовании существуют проблемы с "разделением памяти". Подробней об этом можно прочитать (правда, на английском) в тексте пустого проекта DLL, который создает Delphi (File -> New -> DLL). Так что лучше используйте PChar, а затем при необходимости конвертируйте его в string функцией StrPas.


Еще вариант

procedure TOptions.SetRunOnStart(const Value: boolean);
var
  LibHandle:Integer;
  Fc_AutoRun: procedure(Flag:boolean; NameParam, Path:String);

begin
  FRunOnStart := Value;
    LibHandle := LoadLibrary('autorun.dll');
      if LibHandle >=32 then
        begin
          @Fc_AutoRun := GetProcAddress(LibHandle, 'RunOnWinStart');
          Fc_autoRun(Value, Application.title, paramstr(0));
        end;
    FreeLibrary(LibHandle);

end;

Комментариев нет:

Отправить комментарий