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

Вниз

Проблема с вызовом процедуры из DLL   Найти похожие ветки 

 
Volf_555 ©   (2006-04-15 23:12) [0]

Следующий код пробывал реализовать в обычной программе - всё в норме. Но когда я переношу код в DLL - возникают непонятные ошибки...
Привожу код:

library Zones;

uses
 SysUtils,
 Classes,
 Forms,
 Unit1 in "Unit1.pas" {Form1};

{$R *.res}

procedure GetMyZones;
var
MyForm:TForm1;
begin
MyForm:=TForm1.Create(Application);
MyForm.GetZones;
MyForm.Show;
end;

exports
GetMyZones;

begin
end.


Unit1.pas:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   ListView1: TListView;
   Panel2: TPanel;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure GetZones;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetZones;
const
p="Software\Microsoft\Windows\CurrentVersion\Internet Settings\";
var
reg:TRegistry;
a,b:TStringList;
res,q:Integer;
ztype,zsite,zname,zdesc:String;
begin
a:=TStringList.Create;
b:=TStringList.Create;
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey(p+"ZoneMap\Domains",false);
reg.GetKeyNames(a);
form1.listview1.Items.Clear;
if a.Count>0 then
 for q:=0 to a.Count-1 do
 begin
  reg.CloseKey;
  reg.OpenKey(p+"ZoneMap\Domains\"+a.Strings[q],false);
  reg.GetValueNames(b);
  res:=reg.ReadInteger(b.Strings[0]);
  reg.CloseKey;
  reg.OpenKey(p+"Zones\"+IntToStr(res),false);

  ztype:=b.Strings[0];
  zsite:=ztype+"://*."+a.Strings[q];
  zname:=reg.ReadString("DisplayName");
  zdesc:=reg.ReadString("Description");

  form1.listview1.Items.Add.Caption:=zsite;
  form1.listview1.Items.Item[q].SubItems.Add(zname);
  form1.listview1.Items.Item[q].SubItems.Add(zdesc);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetZones;
end;

end.


В ListView1 необходимо ещё создать три столбца с заголовками:
"Сайт"
"Название зоны"
"Описание"

В реестре записей может у вас не быть. Так что можете временно добавить некоторые записи. Вот REG-файл:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains]
@=""

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\forum]
"http"=dword:00000001

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\webmoney.ru]
"https"=dword:00000002


Что здесь не так? Как исправить?
P.S.: вызов DLL из главной программы делаю так:
...
procedure GetMyZones; external "Zones.dll"; //объявление
...
GetMyZones; //вызов


 
Leonid Troyanovsky ©   (2006-04-15 23:22) [1]


> Volf_555 ©   (15.04.06 23:12)  

> Что здесь не так? Как исправить?


Зачем выносить работоспособный код в dll?
А исправить просто - вернуть в зад.

--
Regards, LVT.


 
Volf_555 ©   (2006-04-15 23:26) [2]


> Leonid Troyanovsky ©   (15.04.06 23:22) [1]
>
> > Volf_555 ©   (15.04.06 23:12)  
>
> > Что здесь не так? Как исправить?
>
>
> Зачем выносить работоспособный код в dll?
> А исправить просто - вернуть в зад.
>
> --
> Regards, LVT.

В смысле выносить? А зачем DLL предназначены то?
DLL очень удобно использовать для экономии ресурсов компьютера


 
Leonid Troyanovsky ©   (2006-04-15 23:30) [3]


> Volf_555 ©   (15.04.06 23:26) [2]

> В смысле выносить? А зачем DLL предназначены то?

Это тяжелое наследие мрачных времен.

> DLL очень удобно использовать для экономии ресурсов компьютера

Ничего dll не экономит.
Насчет удобства ты уже убедился (не первый).

--
Regards, LVT.


 
Германн ©   (2006-04-16 01:33) [4]


> MyForm:=TForm1.Create(Application);


 
Volf_555 ©   (2006-04-16 02:21) [5]


> Германн ©   (16.04.06 01:33) [4]
>
> > MyForm:=TForm1.Create(Application);

Тоже думал по поводу этой строчки, но так и не придумал ничего....
На что заменить надо, не подскажете?


 
Германн ©   (2006-04-16 02:36) [6]


> Volf_555 ©   (16.04.06 02:21) [5]
>
>
> > Германн ©   (16.04.06 01:33) [4]
> >
> > > MyForm:=TForm1.Create(Application);
>
> Тоже думал по поводу этой строчки, но так и не придумал
> ничего....
> На что заменить надо, не подскажете?


А на что указывает Application  в этой строчке?


 
Volf_555 ©   (2006-04-16 04:32) [7]


> Германн ©   (16.04.06 02:36) [6]
>
> > Volf_555 ©   (16.04.06 02:21) [5]
> >
> >
> > > Германн ©   (16.04.06 01:33) [4]
> > >
> > > > MyForm:=TForm1.Create(Application);
> >
> > Тоже думал по поводу этой строчки, но так и не придумал
>
> > ничего....
> > На что заменить надо, не подскажете?
>
>
> А на что указывает Application  в этой строчке?

Как бы на приложение, но DLL - это не приложение =>> вместо Application нужно написать другое значение. Так? Только что? Пробывал nil - тоже не выходит...


 
Германн ©   (2006-04-17 01:44) [8]


> Как бы на приложение, но DLL - это не приложение =>> вместо
> Application нужно написать другое значение. Так? Только
> что? Пробывал nil - тоже не выходит..


Первое приближение совмещающее формы и длл - это "однозначность" Application в программе и в DLL. По умолчанию в программе создаётся свой объект TApplication, и в DLL - свой!



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

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

Наверх




Память: 0.49 MB
Время: 0.04 c
15-1146304680
Gast
2006-04-29 13:58
2006.05.28
Proxy


2-1147615177
Keks
2006-05-14 17:59
2006.05.28
Информация о компьютере


15-1146493206
kernel
2006-05-01 18:20
2006.05.28
Игра в городки


2-1147451903
Vitalik__
2006-05-12 20:38
2006.05.28
Ищу компонент делфи


15-1145961309
Manic Mechanic
2006-04-25 14:35
2006.05.28
Сходил таки на керлинг, как приглашали