Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Проблема с DLL. Уже совсем ничё не понимаю....   Найти похожие ветки 

 
Konsul   (2006-08-01 09:07) [0]

Здравствуйте, народ!
Проблема у меня с использованием DLL. В одной книге вычитал как вызвать dll на этапе выполнения.Осуществляю это таким образом:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

type TDetFunction=function(): string; stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var
HInst: THandle;
FPointer: TFarProc;
DetLib: TDetFunction;
dllType: string;
begin
HInst:=loadLibrary(PChar("D:\my_progs\Cont_prot\libs\Prot_Gen.dll"));
if HInst>0 then
try
 FPointer:=GetProcAddress(HInst,PChar("DetLib"));
 if FPointer<>nil then
  begin
  DetLib:=TDetFunction(FPointer);
  dllType:=DetLib;
  showmessage(dllType);
  end
 else showmessage("Функция DLL не найдена!");
finally
  FreeLibrary(Hinst);
 end
else
 showmessage("Библиготека не найдена!");
end;

end.


Т.е. в данном примере мы просто получаем от DLL некое значение для переменной dllType (неважно, что оно значит).
Главное - что имя файла библиотеки можно назначать уже по ходу выполнения программы.
А исходник DLL вот:

library Prot_Gen;

uses
 SysUtils,
 Classes;

{$R *.res}

function DetLib(): string; stdcall;
begin
result:="Простой текст";
end;

exports
DetLib;

end.


И при запуске проги всё в принципе выолняется как надо, т.е. она выводит сообщение "Простой текст". Но по завершению процедуры TForm1.Button1Click выскакивает ошибка EAccessViolation. Методом комментирования разных строк в процедуре TForm1.Button1Click выяснил, что ошибка не генерируется только если закомментровать строку dllType:=DetLib, т.е. предотвратить само выполение процедуры, ради которой пишется вызов библиотеки и т.п.
Вот в чём проблема? Почему такая ошибка возникает?
Плз, помогите!!!


 
begin...end ©   (2006-08-01 09:17) [1]

Поскольку функция, находящаяся в DLL, возвращает длинную строку (string), нужно добавить модуль ShareMem первым:

1) в список uses библиотеки;
2) в список uses файла проекта (DPR, а не PAS) основного приложения.

Об этом написано в комментарии, который Вы видите в окне редактора при создании новой библиотеки.

Есть и другие методы решения: например, компиляция обоих проектов с runtime-пакетами или отказ от длинных строк.


 
DprYg ©   (2006-08-01 09:21) [2]

Лучше применять передачу строк через тип PChar


 
Ketmar ©   (2006-08-01 09:52) [3]

и, кстати, раз уж всё-равно DLL жёстко "заточена" под Delphi (string) -- можно выкинуть stdcall.


 
iva ©   (2006-08-01 09:57) [4]

либо использовать короткие строки


 
Konsul   (2006-08-01 10:16) [5]

Всё, получилось! Всем спасибо!



Страницы: 1 вся ветка

Текущий архив: 2006.08.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
5-1137761437
olegz77
2006-01-20 15:50
2006.08.20
Запись/Чтение неопубликованных свойств компонента


4-1145613419
EvilIJ
2006-04-21 13:56
2006.08.20
Баги при спользовании иконок в Области уведомления(systray)


2-1154521483
Id
2006-08-02 16:24
2006.08.20
Функции в Delphi


3-1150376816
Pe+erBuild
2006-06-15 17:06
2006.08.20
ScroolBar DBGrid


2-1153393351
Mintos
2006-07-20 15:02
2006.08.20
Перевод фамилий