Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизЭкспорт из DLL Найти похожие ветки
← →
Sp1r1t (2006-11-24 04:38) [0]Library MYDLL
Procedure FillList;
У меня есть список типа TList. В него я записываю например дни недели. Понедельник - Суббота. Мне нужно передать этот список в главную форму программы в такойже компонент типа TList. Как это сделать
end;
exports FillList;
end.
Только не надо предлагать что лучше использовать функцию и т.п. Скажите пожалуйста как экспортировать этот список.
← →
Palladin © (2006-11-24 05:10) [1]Ну во первых: самое правильное будет, создание буфера, заполнение его всеми значениями элементов и передача указателя в параметре процедуры, а во вторых
> Только не надо предлагать что лучше использовать функцию
> и т.п.
Это почему? По религиозным причинам (коран не велит, библия запрещает)? По психологическим (в детстве по рукам били, в угол ставили)? Ты определись, а то так ведь повеситься можно от без исходности то...
← →
Sp1r1t (2006-11-24 05:16) [2]А можно поточнее? : передача указателя в параметре процедуры
← →
Palladin © (2006-11-24 05:16) [3]А что именно поточнее?
← →
Sp1r1t (2006-11-24 05:26) [4]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.
Вот небольшой код с помощью которого я хочу вывести список установленных программ на моем компьютере в главную форму. Как реализовать указатели?
← →
Sp1r1t (2006-11-24 05:31) [5]А вот рабочий код если хочешь посмотреть че мне надо и как. Ток мне надо в библиотеку запихнуть.
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.
← →
Palladin © (2006-11-24 05:45) [6]мммать... попроси Анатолия удалить этот пост пока LVT не пришел...
не создавай элементы управления в dll или создавай, но используй не dll, а bpl (пакеты), если уж так нужно dll, то создавай просто массив...
← →
Sp1r1t (2006-11-24 05:46) [7]да че тут такого. В библиотеках и формы валяются!
← →
Palladin © (2006-11-24 05:55) [8]во первых если уж и валяются там формы, то работает это совсем не так как у тебя, во вторых, ты думаешь, что бы получить данные приложение не создает DBGrid и показывает в нем данные, а тянет этот DBGrid вместе с данными из БД?
для того что бы получить набор пар строк абсолютно незачем создавать TListView, тем более зачем использовать stdcall ? если, все равно, при таком подходе, твоей dll никакое другое приложение, написанное на другом ЯП и даже на другой версии Delphi, работать не станет.
← →
Sp1r1t (2006-11-24 06:02) [9]может я в дальнейшем хочу чтоб ListView тянулся из библиотеки, ну а нащет стдколл то это лишнее.
Ок, скажи тада плс как используя в этой процедуре двумерный массив вывести список установленных программ в глав форме. (Если че глянь последний исходник для лучшего понямания)
← →
Palladin © (2006-11-24 06:37) [10]просто
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 тоже точно так же должен быть деларирован в приложении-хосте...
← →
Palladin © (2006-11-24 06:38) [11]упс...
with Reg do
нужно убрать
← →
Sp1r1t (2006-11-24 07:45) [12]Выскакивает ошибка Invalid Pointer Operation когда вызываю эту процедуру. Можешь чето подсказать? а тоя уже не знаю что исправлять.
← →
Sp1r1t (2006-11-24 07:50) [13]А, нет, то не из-за нее. Сори. Вопрос другой Как мне принять этот массив?
← →
Palladin © (2006-11-24 08:03) [14]ShareMem так же должен быть самым первым указан и в приложении-хосте, именно в самом файле проекта (dpr)
так и принять
Var
a:TProgramsList;
Begin
GetProgramsList(a);
End;
← →
Sp1r1t (2006-11-24 08:05) [15]Ну с этим все ок )). Последний вопрос в строках
a[i][0]:=ReadString("DisplayName");
a[i][1]:=ReadString("UninstallString");
вылетает ошибка - выход за предел массива. Че так????
← →
Palladin © (2006-11-24 08:08) [16]такого не может быть...
← →
Sp1r1t (2006-11-24 08:10) [17]вот и я о чем. Все ок - тока сдесь срабатывает исключение Access Violation at addres ... in module ServerFuncionLibrary.dll ...
← →
Palladin © (2006-11-24 08:17) [18]with reg do - убрал?
← →
Sp1r1t (2006-11-24 08:19) [19]да, убрал. Извиняюсь эта ошибка выскакивает в строке
SetLength(a,SubKeys.Count);
!
Я проверил закоментировав части кода.
← →
Sp1r1t (2006-11-24 08:28) [20]Так помоему размер массива задавать неззя
← →
Palladin © (2006-11-24 08:36) [21]хем, а как же можно тогда по твоему?
ShareMem точно прописал первым в файле проекта?
← →
Sp1r1t (2006-11-24 08:38) [22]хотя судя по справке можно. Но тада правильнее
TProgramsList=Array of Array of String;
SetLength(a,SubKeys.Count,SubKeys.Count);
но это ниче не меняет. Не устанавливается всеравно размерность массива
← →
Sp1r1t (2006-11-24 08:40) [23]ой ))) Это слишком многомерный получится. Блин не спал них-а плужу. Лано пока пойду на пары схожу. Если будет какоето решение буду очень благодарен.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.044 c