Главная страница
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.047 c
4-1145723538
V0va
2006-04-22 20:32
2006.08.20
AnimateWindow и TPanel


15-1153461311
tButton
2006-07-21 09:55
2006.08.20
<select>


15-1153423356
Ломброзо
2006-07-20 23:22
2006.08.20
GPRS от MTC


1-1152464349
iNV
2006-07-09 20:59
2006.08.20
Работа с XML как с реестром., Запись чтение.


4-1146043988
Сергей М.
2006-04-26 13:33
2006.08.20
Всегда ли BaseAddr = ImageBase для user32.dll ?