Динамическая загрузка dll

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Динамическая загрузка dll

Сообщение son » 12.10.2015 11:54:29

Здравствуйте. Выдает ошибку при динамической загрузке в Windows.
Код: Выделить всё

type
  Teda_get_one_float = function (Node: pchar;Tag: pchar;Field:pchar;Val:pointer): Integer;

procedure TForm1.Button1Click(Sender: TObject);
var LibLangFile : TLibHandle;
    NameComponent : Teda_get_one_float;
    fileName : string;
    ret : Single;
    rez : integer;
begin
  fileName:=Edit1.Text;
  LibLangFile := LoadLibrary(fileName);
  if LibLangFile >= 32 then begin
    NameComponent := nil;
    NameComponent := Teda_get_one_float(GetProcAddress(LibLangFile,'eda_get_one_float'));
    if @NameComponent<>nil then begin
      try
        ret:=99;
        rez:=NameComponent(Pchar(Edit2.Text),Pchar(Edit3.Text),Pchar(Edit4.Text),@ret);
        Memo1.Lines.Add('rez='+inttostr(rez)+' val='+floattostr(ret));
      except
        Memo1.Lines.Add('ERROR');
      end;
    end else begin
      Memo1.Lines.Add('NameComponent=nill');
    end;
  FreeLibrary(LibLangFile);
  end else begin
    Memo1.Lines.Add('LibLangFile<32');
  end;
end;



Ошибку выдает при вызове функции. Если использовать статическое подключение все ок.

Код: Выделить всё

//рабочий код

function eda_get_one_float(Node: pchar;Tag: pchar;Field:pchar;Val:pointer): Integer;stdcall;external 'vdba.dll';

procedure TForm1.Button2Click(Sender: TObject);
var
    ret : Single;
    rez : integer;
begin
  try
    ret:=99;
    rez:=eda_get_one_float(Pchar(Edit2.Text),Pchar(Edit3.Text),Pchar(Edit4.Text),@ret);
    Memo1.Lines.Add('rez='+inttostr(rez)+' val='+floattostr(ret));
  except
    Memo1.Lines.Add('ERROR');
  end;
end;



мне нужно что бы подключалось динамически, что бы не компилировать два разных exe для машин где есть эта dll и где нет. возможно я что то не так делаю? Заранее спасибо
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Динамическая загрузка dll

Сообщение Zhanat » 12.10.2015 12:06:59

попробуй добавить stdcall
Код: Выделить всё
type
  Teda_get_one_float = function (Node: pchar;Tag: pchar;Field:pchar;Val:pointer): Integer; stdcall;
Zhanat
новенький
 
Сообщения: 21
Зарегистрирован: 06.09.2013 08:46:40

Re: Динамическая загрузка dll

Сообщение son » 12.10.2015 12:20:25

О сработало! Спасибо большое! В примерах нигде не было я и не ставил, хотя явно ошибка с адресами была. Спасибо большое!
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 245

Рейтинг@Mail.ru