![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Экспорт из DLL [D6, WinXP]
Sp1r1t © (2006-11-24 04:38:00)Library MYDLL
Procedure FillList;
У меня есть список типа TList. В него я записываю например дни недели. Понедельник - Суббота. Мне нужно передать этот список в главную форму программы в такойже компонент типа TList. Как это сделать
end;
exports FillList;
end.
Только не надо предлагать что лучше использовать функцию и т.п. Скажите пожалуйста как экспортировать этот список.
Sp1r1t (2006-11-24 08:40:00) [1]ой ))) Это слишком многомерный получится. Блин не спал них-а плужу. Лано пока пойду на пары схожу. Если будет какоето решение буду очень благодарен.
Sp1r1t (2006-11-24 08:38:00) [2]хотя судя по справке можно. Но тада правильнее
TProgramsList=Array of Array of String;
SetLength(a,SubKeys.Count,SubKeys.Count);
но это ниче не меняет. Не устанавливается всеравно размерность массива
Palladin (2006-11-24 08:36:00) [3]хем, а как же можно тогда по твоему?
ShareMem точно прописал первым в файле проекта?
Sp1r1t (2006-11-24 08:28:00) [4]Так помоему размер массива задавать неззя
Sp1r1t (2006-11-24 08:19:00) [5]да, убрал. Извиняюсь эта ошибка выскакивает в строке
SetLength(a,SubKeys.Count);!
Я проверил закоментировав части кода.
Palladin (2006-11-24 08:17:00) [6]with reg do - убрал?
Sp1r1t (2006-11-24 08:10:00) [7]вот и я о чем. Все ок - тока сдесь срабатывает исключение Access Violation at addres ... in module ServerFuncionLibrary.dll ...
Palladin (2006-11-24 08:08:00) [8]такого не может быть...
Sp1r1t (2006-11-24 08:05:00) [9]Ну с этим все ок )). Последний вопрос в строках
a[i][0]:=ReadString('DisplayName');
a[i][1]:=ReadString('UninstallString');
вылетает ошибка - выход за предел массива. Че так????
Palladin (2006-11-24 08:03:00) [10]ShareMem так же должен быть самым первым указан и в приложении-хосте, именно в самом файле проекта (dpr)
так и принять
Var
a:TProgramsList;
Begin
GetProgramsList(a);
End;
Sp1r1t (2006-11-24 07:50:00) [11]А, нет, то не из-за нее. Сори. Вопрос другой Как мне принять этот массив?
Sp1r1t (2006-11-24 07:45:00) [12]Выскакивает ошибка Invalid Pointer Operation когда вызываю эту процедуру. Можешь чето подсказать? а тоя уже не знаю что исправлять.
Palladin (2006-11-24 06:38:00) [13]упс...
with Reg do
нужно убрать
Palladin (2006-11-24 06:37:00) [14]просто
library ServerFuncionLibrary;
uses
ShareMem, Classes, Registry;
type
TProgramsList=Array of Array [0..1] of String;
{$R *.res}
procedure GetProgramsList(Var a:TProgramsList);
const
UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
Reg: TRegistry;
SubKeys: TStringList;
i: integer;
begin
SubKeys:=TStringList.Create;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
with Reg do
try
If Not Reg.OpenKeyReadOnly(UNINST_PATH) then Exit;
Reg.GetKeyNames(SubKeys);
Reg.CloseKey;
SetLength(a,SubKeys.Count);
for i:=0 to SubKeys.Count-1 do
if Reg.OpenKeyReadOnly(UNINST_PATH+'\'+SubKeys[i]) then
Try
a[i][0]:=ReadString('DisplayName');
a[i][1]:=ReadString('UninstallString');
Finally
Reg.CloseKey;
End;
Finally
SubKeys.Free;
Reg.Free;
End;
end;
Exports GetProgramsList;
end.
думаю не стоит упоминать о том что TProgramsList тоже точно так же должен быть деларирован в приложении-хосте...
Sp1r1t (2006-11-24 06:02:00) [15]может я в дальнейшем хочу чтоб ListView тянулся из библиотеки, ну а нащет стдколл то это лишнее.
Ок, скажи тада плс как используя в этой процедуре двумерный массив вывести список установленных программ в глав форме. (Если че глянь последний исходник для лучшего понямания)
Palladin (2006-11-24 05:55:00) [16]во первых если уж и валяются там формы, то работает это совсем не так как у тебя, во вторых, ты думаешь, что бы получить данные приложение не создает DBGrid и показывает в нем данные, а тянет этот DBGrid вместе с данными из БД?
для того что бы получить набор пар строк абсолютно незачем создавать TListView, тем более зачем использовать stdcall ? если, все равно, при таком подходе, твоей dll никакое другое приложение, написанное на другом ЯП и даже на другой версии Delphi, работать не станет.
Sp1r1t (2006-11-24 05:46:00) [17]да че тут такого. В библиотеках и формы валяются!
Palladin (2006-11-24 05:45:00) [18]мммать... попроси Анатолия удалить этот пост пока LVT не пришел...
не создавай элементы управления в dll или создавай, но используй не dll, а bpl (пакеты), если уж так нужно dll, то создавай просто массив...
Sp1r1t (2006-11-24 05:31:00) [19]А вот рабочий код если хочешь посмотреть че мне надо и как. Ток мне надо в библиотеку запихнуть.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Registry;
type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
num:Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
Reg: TRegistry;
SubKeys: TStringList;
ListItem: TlistItem;
i: integer;
sDisplayName, sUninstallString: string;
begin
ListView1.ViewStyle := vsReport;
ListView1.Columns.add;
ListView1.Columns.add;
ListView1.Columns[0].caption := 'DisplayName';
ListView1.Columns[1].caption := 'UninstallString';
ListView1.Columns[0].Width := 300;
ListView1.Columns[1].Width := 300;
Reg := TRegistry.Create;
with Reg do
try
with ListView1.Items do
try
BeginUpdate;
Clear;
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly(UNINST_PATH) then
begin
SubKeys := TStringList.Create;
try
GetKeyNames(SubKeys);
CloseKey;
for i := 0 to subKeys.Count - 1 do
if OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
try
sDisplayName := ReadString('DisplayName');
sUninstallString := ReadString('UninstallString');
if sDisplayName <> '' then
begin
ListItem := Add;
inc(num);
ListItem.Caption := sDisplayName;
ListItem.subitems.Add(sUninstallString);
end;
finally
CloseKey;
end;
finally
SubKeys.Free;
end;
end;
finally
ListView1.AlphaSort;
EndUpdate;
end;
finally
CloseKey;
Free;
end;
Label1.Caption:=IntToStr(num);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
num:=0;
end;
end.
Sp1r1t (2006-11-24 05:26:00) [20]library ServerFuncionLibrary;
uses
Windows, Messages, SysUtils,Classes, Dialogs, QComCtrls, Registry;
type
MArr=Array [1..256,1..256] of String;
{$R *.res}
var ListView:TListView;
ListItem: TlistItem;
procedure ShowProgramList; stdcall;
const UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var Reg: TRegistry;
SubKeys: TStringList;
Column:TCollection;
Col:TCustomListView;
i: integer;
sDisplayName, sUninstallString,ss: string;
begin
ListView:=TListView.Create(ListView);
ListView.ViewStyle := vsReport;
ListView.Columns.add;
ListView.Columns.add;
ListView.Columns[0].caption := 'DisplayName';
ListView.Columns[1].caption := 'UninstallString';
ListView.Columns[0].Width := 300;
ListView.Columns[1].Width := 300;
Reg := TRegistry.Create;
with Reg do
try
with ListView.Items do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly(UNINST_PATH) then
begin
SubKeys := TStringList.Create;
try
GetKeyNames(SubKeys);
CloseKey;
for i := 0 to subKeys.Count - 1 do
if OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
try
sDisplayName := ReadString('DisplayName');
sUninstallString := ReadString('UninstallString');
if sDisplayName <> '' then
begin
// ShowMessage(SDisplayName+#13+SUninstallString);
ListItem := Add;
ListItem.Caption := sDisplayName;
ListItem.subitems.Add(sUninstallString);
end;
finally
CloseKey;
end;
finally
SubKeys.Free;
end;
end;
finally
ListView.AlphaSort;
EndUpdate;
end;
finally
CloseKey;
Free;
end;
MessageBox(0,'End of ShowProgramList', 'HI', mb_ok);
end;
exports ShowProgramList;
end.
Вот небольшой код с помощью которого я хочу вывести список установленных программ на моем компьютере в главную форму. Как реализовать указатели?