Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Несколько вопросов о DLL


Автор: Foley 13.3.2006, 13:56
Несколько вопросов про DLL:
1. Как мне подмтавить в ДЛЛ свое значение? (см. код)
2. Что за ошибка выскакивает при использовании String в ДЛЛ: Invalid pointer operation?
Теория:
3. Чем отличается статистическая загрузка от динамической?
4. Преимущества использования ДЛЛ.
5. Операторы ДЛЛ (или как правильно называются) типа stdcall, far и т.п. с описанием на русском языке.
3, 4, 5 если можно дайте ссылки, только чтоб там понятно описано было.

код ДЛЛ
Код

library Pr_dll;

uses
  SysUtils,
  Classes;

{$R *.res}

function ResultCalcDouble(r: real): Real; stdcall;
begin
Result:=r*2;// сюда подставить значение из программы
end;

function GetString: string;
begin
Result := 'Привет из DLL!' ;
end;


exports
ResultCalcDouble,
GetString;
begin
end.


код юниты:
Код

implementation

{$R *.dfm}
 function ResultCalcDouble(r: real): real; stdcall; external 'Pr_dll.dll';
 function GetString: string; far; external 'Pr_dll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
ResultCalcDouble(StrToFloat(edit1.Text));
label1.Caption:=FloatToStr(ResultCalcDouble(10.5));// всегда возвращает 21
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MessageDlg(GetString, mtInformation, [ mbOK ], 0 )// выдает сообщение и после него ошибку описанную выше
end;

Автор: Alexeis 13.3.2006, 14:17
Цитата

Что за ошибка выскакивает при использовании String в ДЛЛ: Invalid pointer operation?


после создания dll появляетя текст
Цитата

ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results

который говорит о том что нужно подключить модуль ShareMem
для передачи строк в качестве параметров и получения их в виде результата(для экспортируемых функций)

Автор: Matematik 13.3.2006, 14:22
1. Уточни вопрос
2. Когда создаеь DLL там написано
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

т.е. чтобы использовать тип string надо добавить в uses проекта программы и dll модуль ShareMem (поставить его первым), плюс к этому нужна еще dll BORLNDMM.DLL
а вообще лучше вместо String использовать PChar
3. Статист. загружается при старте программы, выгружается с ней вместе
динамическая - сам отвечаешь за загрузку и выгрузку
4. написание плугинов и тд и тп
5. Есть такая вещь как поиск. ya.ru rambler.ru итд
http://ad.cctpu.edu.ru/SSP/Prof/Glava28/Index4.html а там Далее Далее ...

Автор: Alexeis 13.3.2006, 14:28
Цитата

3. Чем отличается статистическая загрузка от динамической?

Статическую не нужно ни загружать ни выгружать.
Динамическая загрузка подразумевает не только загрузку и выгрузку но и определение адресов используемых функций
Заморочки много а эффект есть если используются много разных
библиотек и требуются они в разное время работы программы
или редко. Например при создании плагинов.
Грузится в начале ядро а библиотеки по мере необходимости.

Хороший пример статической загрузки это ядро (kernel.dll ,gdi.dll и тд )windows, которое грузится автоматически при запуске любой программы на delphi (или почти любой).

Автор: Yanis 13.3.2006, 14:34
Цитата(alexeis1 @ 13.3.2006, 14:28 Найти цитируемый пост)
kernel.dll ,gdi.dll и тд

Странные какие то у тебя dll'ки smile Что за система?

Автор: Alexeis 13.3.2006, 14:51
Yanis, ладно уже ошибся чуток. Вот более точно
advapi32 = 'advapi32.dll';
kernel32 = 'kernel32.dll';
mpr = 'mpr.dll';
version = 'version.dll';
comctl32 = 'comctl32.dll';
gdi32 = 'gdi32.dll';
user32 = 'user32.dll';

Автор: Yanis 13.3.2006, 15:02
alexeis1,
Не в обиду сказано ;)

Автор: Foley 13.3.2006, 23:10
Цитата(Matematik @ 13.3.2006, 14:22 Найти цитируемый пост)
Уточни вопрос

ну вот
Код

function ResultCalcDouble(r: real): Real; stdcall;    
begin    
Result:=r*2;// r:=StrToFloat(Edit1.Text) т.е. подставить заместо "р" значение из программы    
end;

и воопще возможно ли это?

Со вторым вопросом я разобрался...3, 4 понял объяснение

а вот про stdcall по ссылке ниче не понятно, но все равно спасибо smile
Добавлено @ 23:12
ой поторопился
Цитата(Foley @ 13.3.2006, 23:10 Найти цитируемый пост)
а вот про stdcall по ссылке ниче не понятно, но все равно спасибо

понял все...

Автор: Foley 15.3.2006, 23:36
все понял сам где собака зарыта:
Код

procedure TForm1.Button1Click(Sender: TObject);    
begin    
ResultCalcDouble(StrToFloat(edit1.Text));    
label1.Caption:=FloatToStr(ResultCalcDouble(10.5));    
end;

а надо было:
Код

procedure TForm1.Button1Click(Sender: TObject);    
begin    
label1.Caption:=FloatToStr(ResultCalcDouble(StrToFloat(edit1.Text)));
end;

правильно говроится, что чем глупее ошипка тем труднее ее найти... smile

Всем спасибо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)