Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.52 MB
Время: 0.052 c
15-1163675742
ArtemESC
2006-11-16 14:15
2006.12.10
На речке, на речке, на том бережо--ооочке...


15-1164213822
Сэм
2006-11-22 19:43
2006.12.10
DDR 1024Mb PC 3200 SAMSUNG


2-1164549497
AHTOLLlKA
2006-11-26 16:58
2006.12.10
Изменить ресурсы


15-1162923155
sniknik
2006-11-07 21:12
2006.12.10
Кому не жалко 11мег... ;о)


3-1160181676
Bogdan1024
2006-10-07 04:41
2006.12.10
Дедуктивные логические базы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский