Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.063 c
2-1154244683
vain
2006-07-30 11:31
2006.08.20
«Дескриптор»


2-1154502870
Ironman83
2006-08-02 11:14
2006.08.20
Цвет ячеек в сетке.


2-1154143749
Василий
2006-07-29 07:29
2006.08.20
Как пользоваться функцией GetWindowplacement?


1-1151994943
PRT
2006-07-04 10:35
2006.08.20
Открыть с помощью...


4-1145024247
ShPRO_TT
2006-04-14 18:17
2006.08.20
Криптография в Windows (Crypto API)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский