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

Вниз

Экспорт из 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
1-1161948280
alucard
2006-10-27 15:24
2006.12.10
Подскажите как сделать прогу чтоб подменяла нажатие клавиш


1-1161710150
7D7
2006-10-24 21:15
2006.12.10
Как узнать объем памяти для данных?


2-1163774326
312kbps
2006-11-17 17:38
2006.12.10
Опрос конкретного порта во всей локальной сети !


2-1163397990
Lebedev
2006-11-13 09:06
2006.12.10
Событие TmediaPlayer’а по завершению воспроизведения видео.


2-1164205905
doncova1
2006-11-22 17:31
2006.12.10
как открыть html