Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Общий мендежер памяти / 21 сообщений из 21, страница 1 из 1
03.05.2018, 12:11
    #39639292
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Как между всеми dll разделить 1 менеджер памяти ? Для загрузки RTTI информации о классах в них

Нужно сделать динамическую автоматизацию в приложение, подгружая тот или иной модуль. Размер модуля неважен.


Пробовал с bpl но у другого пользователя требует еще bpl разные - которые delphi не кладет. И толку с этого полный ноль
...
Рейтинг: 0 / 0
03.05.2018, 12:13
    #39639296
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Версия delphi - tokyo 10.3. Платформа приложения 86
...
Рейтинг: 0 / 0
03.05.2018, 12:13
    #39639297
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
MertКак между всеми dll разделить 1 менеджер памяти ?
ShareMem=borlndmm.dll
MertДля загрузки RTTI информации о классах в них
Никак, только bpl
Mertу другого пользователя требует еще bpl разные - которые delphi не кладет
Так сам положи. Ну или Delphi пользователю поставь :)
...
Рейтинг: 0 / 0
03.05.2018, 12:26
    #39639312
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
YuRockShareMem=borlndmm.dll

спасибо

YuRockНикак, только bpl
Совсем никак ? Разве нельзя будет управлять классами из LibModuleList ? Расчёт был на то, что это 1 менеджер, и всё это будет в куче

YuRockТак сам положи. Ну или Delphi пользователю поставь :)

Я остановился класть на 10 пакете. И размер приложения стал больше чем с dll
...
Рейтинг: 0 / 0
03.05.2018, 12:55
    #39639345
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
MertРазве нельзя будет управлять классами из LibModuleList ?
Не знаю, что это такое.
Я вообще никогда не пользовался RTTI "напрямую". Мне это не нужно.
Вообще по идее должно всё работать с общим МП, но при условии, что все dll скомпилены ондой версией делфи. А там - кто его знает.
...
Рейтинг: 0 / 0
03.05.2018, 12:56
    #39639346
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
MertЯ остановился класть на 10 пакете. И размер приложения стал больше чем с dll
Когда проект перевалит через N мегабайт, то баланс пойдет в другую сторону.
...
Рейтинг: 0 / 0
03.05.2018, 13:02
    #39639350
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
MertВерсия delphi - tokyo 10.3Нет такой версии
...
Рейтинг: 0 / 0
03.05.2018, 14:48
    #39639457
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Заработало!) Общий менеджер творит чудеса

Пример модуля


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
library LoadDllCLasses;

uses
  ShareMem, UnitClass, rtti, System.SysUtils,
  System.Classes,
  Vcl.StdCtrls,
  Vcl.Menus,
  Vcl.Grids,
  Vcl.ExtDlgs,
  Vcl.ExtCtrls,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.Buttons,
  Vcl.CategoryButtons,
  Vcl.Mask,
  Vcl.Samples.DirOutln,
  Vcl.CheckLst,
  Vcl.ActnList,
  Vcl.AppEvnts,
  Vcl.ComCtrls,
  Vcl.ValEdit,
  Vcl.ButtonGroup,
  Vcl.DockTabSet,
  Vcl.Tabs,
  Vcl.Touch.Keyboard,
  Vcl.Samples.Spin,
  Vcl.Taskbar,
  SHDocVw,
  Vcl.Samples.Calendar,
  Vcl.Samples.Gauges,
  Vcl.JumpList,
  System.Bluetooth.Components;

{$R *.res}

function LibModuleListAddres(): PLibModule;
begin
  Result := LibModuleList;
end;

exports LibModuleListAddres;

begin
  RegisterClasses([TMainMenu, TPopupMenu, TLabel, TEdit, TMemo, TButton,
    TCheckBox, TRadioButton, TListBox, TComboBox, TScrollBar, TGroupBox,
    TRadioGroup, TPanel, TActionList, TSpeedButton, TMaskEdit, TStringGrid,
    TDrawGrid, TImage, TShape, TBevel, TScrollBox, TCheckListBox, TSplitter,
    TStaticText, TLinkLabel, TControlBar, TApplicationEvents, TValueListEditor,
    TButtonedEdit, TColorBox, TColorListBox, TCategoryButtons, TButtonGroup,
    TDockTabSet, TTabSet, TTrayIcon, TFlowPanel, TGridPanel, TBalloonHint,
    TCategoryPanelGroup, TTabControl, TPageControl, TImageList, TRichEdit,
    TTrackBar, TProgressBar, TUpDown, TDateTimePicker, TMonthCalendar,
    TTreeView, TListView, TStatusBar, TPageScroller, TComboBoxEx, TTaskbar,
    TJumpList, TBluetooth, TTimer, TPaintBox, TOpenDialog, TSaveDialog,
    TOpenPictureDialog, TSavePictureDialog, TOpenTextFileDialog,
    TSaveTextFileDialog, TFontDialog, TColorDialog, TPrintDialog,
    TPrinterSetupDialog, TFindDialog, TReplaceDialog, TPageSetupDialog, TGauge,
    TSpinButton, TDirectoryOutline, TCalendar, TTouchKeyboard, TWebBrowser,
    TPageControl, TTabSheet]);

end.




В самой программе
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
program SempleLoadDllClasses;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  ShareMem, Windows,
  System.SysUtils, UnitClass, RTTI;

type
  FindType = function(ClassName: string): TRttiType;
  LibModuleListAddres = function(): PLibModule;

var
  FindTypeCall: FindType;
  GetLibM: LibModuleListAddres;
  DllHandle: THandle;
  UnitClass: TUnitClass;
  c: TRttiType;

begin
  try
    DllHandle := LoadLibrary('LoadDllCLasses.dll');

    Pointer(@GetLibM) := getprocaddress(DllHandle, 'LibModuleListAddres');

    RegisterModule(GetLibM());

    c := UnitClass.FindType('Vcl\StdCtrls\TMemo');

    writeln(c.QualifiedName);

  except
    on E: Exception do
      writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.




Видим в консоле Vcl.StdCtrls.TMemo

Проект прикладываю
...
Рейтинг: 0 / 0
03.05.2018, 14:53
    #39639461
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Не увидел ограничения. Удалил dll и exe
...
Рейтинг: 0 / 0
03.05.2018, 14:54
    #39639462
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Открепился из за капчи...
...
Рейтинг: 0 / 0
03.05.2018, 18:45
    #39639619
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Mert,
1. Используй FastMM
2. Создай свой собственный bpl с rtl, vcl и fastmm
3. Компилируй exe и dll с этим созданным bpl
...
Рейтинг: 0 / 0
03.05.2018, 19:27
    #39639643
Mert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
ziv-2014Mert,
3. Компилируй exe и dll с этим созданным bpl

Это нарушает идею о создании модульного функционала - расширяющий возможности однотипной программы.


Есть ли вообще нормальная документация о создании единого bpl ? Без таскания за собою 30 дополнительных
...
Рейтинг: 0 / 0
03.05.2018, 20:08
    #39639652
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
MertЭто нарушает идею о создании модульного функционала - расширяющий возможности однотипной программы.

Интересно как?

MertЕсть ли вообще нормальная документация о создании единого bpl ? Без таскания за собою 30 дополнительных

Вы вообще понимаете, что такое bpl и зачем они нужны?
Добавляете в bpl все нужные вам .pas модули и таскаете эту bpl с собой, компилируя программу. Другие bpl больше вам не нужны.

Если вы задумались о модульности функционала, то вам нужно использовать interface-сы.
...
Рейтинг: 0 / 0
04.05.2018, 01:25
    #39639711
AWSVladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
YuRockShareMem=borlndmm.dll


Хосподя, ну нафига это старье?
У FastMM есть опции SharedMem.
Обыкновенные string спокойно передаются м/у DLL и Application без утечек.
На взлет не помню названия, но их там не так много, этих опций.
+ они хорошо документированны и переводы этих опций были в инете.
...
Рейтинг: 0 / 0
20.04.2019, 15:41
    #39804260
shonli95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Mert,

оно работает через (_|_) так как у всех dll свои внутренние классы, и они никак между собою не могут работать, включая те что уже в dll даже с общим менеджером памяти. Изменения предков никак не удаётся произвести, при записи в память класса вызывается исключение записи в память. Зря убил время проверяя это, в добавок переписав класс под загрузку модульную

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
unit UnitClass;

interface

uses Rtti, TypInfo, System.SysUtils;

Type
  UnitStringType = UTF8String;
  UnitArray = array of UnitStringType;

  TUnitType = record
    LowerName, LowerName2: string;
    Base: PTypeInfo;
  end;

  TUnitTypeArray = array of TUnitType;

  TUnitClass = record
  private
    UnitCountAll, AllCountType: Integer;

    TypesAll: TUnitTypeArray;
    UnitsAll: UnitArray;

  public
    Rtti: TRttiContext;

    function GetUnitsCount(): Integer;
    function GetUnits(Tt: PLibModule): UnitArray;
    function IsUnits(UnitName: UnitStringType): Boolean;
    function IsUnitsNoLower(UnitName: UnitStringType): Boolean;
    procedure AddUnit(UnitsAdd: UnitArray);

    function FindTypeInfo(ClassName: string; var S: string): PTypeInfo; overload;
    function FindTypeInfo(TType: PTypeInfo): string; overload;

    function FindType(ClassName: string; var S: string): TRttiType; overload;
    function FindType(TType: PTypeInfo): TRttiType; overload;
    function GetList(): TUnitTypeArray;
    function GetAllListCount(): Integer;
  end;

VAR
  TClassUnits: TUnitClass;

implementation

function TUnitClass.GetAllListCount(): Integer;
var
  Curr: PLibModule;
begin
  Result := 0;
  Curr := LibModuleList;
  repeat
    Inc(Result, Curr^.TypeInfo^.TypeCount);
    Curr := Curr.Next;
  until Curr = nil;
end;

function TUnitClass.GetList(): TUnitTypeArray;
label
  GotoEnd;
var
  Units: UnitArray;
  T: TPackageTypeInfo;
  Curr: PLibModule;
  ModuleCountTypes, LengthList, I, R, CurrUnit, Indx: Integer;
  TypeIter: PPTypeInfo;
  TypeName, LowStr: string;
begin
  if AllCountType <> GetAllListCount() then
  begin
    LengthList := Length(TypesAll);
    Curr := LibModuleList;
    Indx := 0;
    repeat
      Inc(Indx);
      Units := GetUnits(Curr);
      CurrUnit := 0;

      ModuleCountTypes := Curr^.TypeInfo^.TypeCount;
      Inc(AllCountType, ModuleCountTypes);

      SetLength(TypesAll, LengthList + ModuleCountTypes);

      T := Curr^.TypeInfo^;
      for I := 0 to ModuleCountTypes - 1 do
      begin
        TypeIter := T.TypeTable^[I];
        if TypeIter <> nil then
        begin
          if NativeInt(TypeIter) = 1 then
          begin
            Inc(CurrUnit);
            Continue;
          end else if (PPointer(TypeIter)^ = nil) then
            Continue;

          if Indx > 1 then
            if IsUnitsNoLower(Units[CurrUnit]) then
              Continue;

          TypeName := Units[CurrUnit] + '.' + TypeIter^^.Name;
          for R := 1 to Length(TypeName) do
            case TypeName[R] of
              '<', '>': goto GotoEnd;
              ',', '.': TypeName[R] := '\';
              'A' .. 'Z': TypeName[R] := Char(Word(TypeName[R]) or $0020);
            end;

          LowStr := Lowercase(TypeIter^^.NameFld.ToString);

          TypesAll[LengthList].LowerName := TypeName;
          TypesAll[LengthList].LowerName2 := LowStr;
          TypesAll[LengthList].Base := TypeIter^;
          Inc(LengthList);
        GotoEnd: end;
      end;

      Curr := Curr.Next;
      AddUnit(Units);
    until Curr = nil;
    SetLength(TypesAll, LengthList);
  end;

  Result := TypesAll;
end;

function TUnitClass.FindTypeInfo(ClassName: string; var S: string): PTypeInfo;
var
  V: TUnitType;
begin
  ClassName := Lowercase(ClassName);
  for V in GetList do
  begin
    if (V.LowerName = ClassName) or (V.LowerName2 = ClassName) then
    begin
      S := V.LowerName;
      Exit(V.Base);
    end;
  end;

  Result := nil;
end;

function TUnitClass.FindTypeInfo(TType: PTypeInfo): string;
var
  V: TUnitType;
begin
  for V in GetList do
  begin
    if V.Base = TType then
      Exit(V.LowerName);
  end;
  Result := '';
end;

function TUnitClass.FindType(ClassName: string; var S: string): TRttiType;
begin
  Result := Rtti.GetType(FindTypeInfo(ClassName, S));
end;

function TUnitClass.FindType(TType: PTypeInfo): TRttiType;
begin
  Result := Rtti.GetType(TType);
end;

function TUnitClass.GetUnitsCount(): Integer;
var
  Curr: PLibModule;
begin
  Result := 0;
  Curr := LibModuleList;
  repeat
    Inc(Result, Curr^.TypeInfo^.UnitCount);
    Curr := Curr.Next;
  until Curr = nil;
end;

function TUnitClass.GetUnits(Tt: PLibModule): UnitArray;
var
  P: Pointer;
  I, Len, Offset, UnitsCount: Integer;
  T: TPackageTypeInfo;
  Str: UnitStringType;
begin
  T := Tt^.TypeInfo^;
  UnitsCount := T.UnitCount;
  SetLength(Result, UnitsCount);

  P := Pointer(T.UnitNames);
  Offset := 0;
  for I := 0 to UnitsCount - 1 do
  begin
    Len := PByte(NativeInt(P) + Offset)^;
    if Len = 0 then
      Continue;

    Inc(Offset, 1);

    SetLength(Str, Len);
    Move(Pointer(NativeInt(P) + Offset)^, Str[1], Len);

    Result[I] := Lowercase(Str);

    Inc(Offset, Len);
  end;
end;

function TUnitClass.IsUnits(UnitName: UnitStringType): Boolean;
var
  I: Integer;
begin
  UnitName := Lowercase(UnitName);
  for I := Low(UnitsAll) to High(UnitsAll) do
    if UnitName = UnitsAll[I] then
      Exit(True);
  Result := False;
end;

function TUnitClass.IsUnitsNoLower(UnitName: UnitStringType): Boolean;
var
  I: Integer;
begin
  for I := Low(UnitsAll) to High(UnitsAll) do
    if UnitName = UnitsAll[I] then
      Exit(True);
  Result := False;
end;

procedure TUnitClass.AddUnit(UnitsAdd: UnitArray);
var
  I: Integer;
begin
  UnitCountAll := Length(UnitsAll);
  SetLength(UnitsAll, UnitCountAll + Length(UnitsAdd));
  for I := Low(UnitsAdd) to High(UnitsAdd) do
    if not IsUnits(UnitsAdd[I]) then
    begin
      UnitsAll[UnitCountAll] := UnitsAdd[I];
      Inc(UnitCountAll);
    end;
  SetLength(UnitsAll, UnitCountAll);
end;

initialization

SetLength(TClassUnits.TypesAll, 0);
SetLength(TClassUnits.UnitsAll, 0);
TClassUnits.AllCountType := 0;

TClassUnits.GetList;

finalization

SetLength(TClassUnits.TypesAll, 0);
SetLength(TClassUnits.UnitsAll, 0);
TClassUnits.AllCountType := 0;

end.

...
Рейтинг: 0 / 0
20.04.2019, 18:59
    #39804293
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
shonli95Mert,

оно работает через (_|_) так как у всех dll свои внутренние классы, и они никак между собою не могут работать, включая те что уже в dll даже с общим менеджером памяти. Изменения предков никак не удаётся произвести, при записи в память класса вызывается исключение записи в память. Зря убил время проверяя это, в добавок переписав класс под загрузку модульную

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
unit UnitClass;

interface

uses Rtti, TypInfo, System.SysUtils;

Type
  UnitStringType = UTF8String;
  UnitArray = array of UnitStringType;

  TUnitType = record
    LowerName, LowerName2: string;
    Base: PTypeInfo;
  end;

  TUnitTypeArray = array of TUnitType;

  TUnitClass = record
  private
    UnitCountAll, AllCountType: Integer;

    TypesAll: TUnitTypeArray;
    UnitsAll: UnitArray;

  public
    Rtti: TRttiContext;

    function GetUnitsCount(): Integer;
    function GetUnits(Tt: PLibModule): UnitArray;
    function IsUnits(UnitName: UnitStringType): Boolean;
    function IsUnitsNoLower(UnitName: UnitStringType): Boolean;
    procedure AddUnit(UnitsAdd: UnitArray);

    function FindTypeInfo(ClassName: string; var S: string): PTypeInfo; overload;
    function FindTypeInfo(TType: PTypeInfo): string; overload;

    function FindType(ClassName: string; var S: string): TRttiType; overload;
    function FindType(TType: PTypeInfo): TRttiType; overload;
    function GetList(): TUnitTypeArray;
    function GetAllListCount(): Integer;
  end;

VAR
  TClassUnits: TUnitClass;

implementation

function TUnitClass.GetAllListCount(): Integer;
var
  Curr: PLibModule;
begin
  Result := 0;
  Curr := LibModuleList;
  repeat
    Inc(Result, Curr^.TypeInfo^.TypeCount);
    Curr := Curr.Next;
  until Curr = nil;
end;

function TUnitClass.GetList(): TUnitTypeArray;
label
  GotoEnd;
var
  Units: UnitArray;
  T: TPackageTypeInfo;
  Curr: PLibModule;
  ModuleCountTypes, LengthList, I, R, CurrUnit, Indx: Integer;
  TypeIter: PPTypeInfo;
  TypeName, LowStr: string;
begin
  if AllCountType <> GetAllListCount() then
  begin
    LengthList := Length(TypesAll);
    Curr := LibModuleList;
    Indx := 0;
    repeat
      Inc(Indx);
      Units := GetUnits(Curr);
      CurrUnit := 0;

      ModuleCountTypes := Curr^.TypeInfo^.TypeCount;
      Inc(AllCountType, ModuleCountTypes);

      SetLength(TypesAll, LengthList + ModuleCountTypes);

      T := Curr^.TypeInfo^;
      for I := 0 to ModuleCountTypes - 1 do
      begin
        TypeIter := T.TypeTable^[I];
        if TypeIter <> nil then
        begin
          if NativeInt(TypeIter) = 1 then
          begin
            Inc(CurrUnit);
            Continue;
          end else if (PPointer(TypeIter)^ = nil) then
            Continue;

          if Indx > 1 then
            if IsUnitsNoLower(Units[CurrUnit]) then
              Continue;

          TypeName := Units[CurrUnit] + '.' + TypeIter^^.Name;
          for R := 1 to Length(TypeName) do
            case TypeName[R] of
              '<', '>': goto GotoEnd;
              ',', '.': TypeName[R] := '\';
              'A' .. 'Z': TypeName[R] := Char(Word(TypeName[R]) or $0020);
            end;

          LowStr := Lowercase(TypeIter^^.NameFld.ToString);

          TypesAll[LengthList].LowerName := TypeName;
          TypesAll[LengthList].LowerName2 := LowStr;
          TypesAll[LengthList].Base := TypeIter^;
          Inc(LengthList);
        GotoEnd: end;
      end;

      Curr := Curr.Next;
      AddUnit(Units);
    until Curr = nil;
    SetLength(TypesAll, LengthList);
  end;

  Result := TypesAll;
end;

function TUnitClass.FindTypeInfo(ClassName: string; var S: string): PTypeInfo;
var
  V: TUnitType;
begin
  ClassName := Lowercase(ClassName);
  for V in GetList do
  begin
    if (V.LowerName = ClassName) or (V.LowerName2 = ClassName) then
    begin
      S := V.LowerName;
      Exit(V.Base);
    end;
  end;

  Result := nil;
end;

function TUnitClass.FindTypeInfo(TType: PTypeInfo): string;
var
  V: TUnitType;
begin
  for V in GetList do
  begin
    if V.Base = TType then
      Exit(V.LowerName);
  end;
  Result := '';
end;

function TUnitClass.FindType(ClassName: string; var S: string): TRttiType;
begin
  Result := Rtti.GetType(FindTypeInfo(ClassName, S));
end;

function TUnitClass.FindType(TType: PTypeInfo): TRttiType;
begin
  Result := Rtti.GetType(TType);
end;

function TUnitClass.GetUnitsCount(): Integer;
var
  Curr: PLibModule;
begin
  Result := 0;
  Curr := LibModuleList;
  repeat
    Inc(Result, Curr^.TypeInfo^.UnitCount);
    Curr := Curr.Next;
  until Curr = nil;
end;

function TUnitClass.GetUnits(Tt: PLibModule): UnitArray;
var
  P: Pointer;
  I, Len, Offset, UnitsCount: Integer;
  T: TPackageTypeInfo;
  Str: UnitStringType;
begin
  T := Tt^.TypeInfo^;
  UnitsCount := T.UnitCount;
  SetLength(Result, UnitsCount);

  P := Pointer(T.UnitNames);
  Offset := 0;
  for I := 0 to UnitsCount - 1 do
  begin
    Len := PByte(NativeInt(P) + Offset)^;
    if Len = 0 then
      Continue;

    Inc(Offset, 1);

    SetLength(Str, Len);
    Move(Pointer(NativeInt(P) + Offset)^, Str[1], Len);

    Result[I] := Lowercase(Str);

    Inc(Offset, Len);
  end;
end;

function TUnitClass.IsUnits(UnitName: UnitStringType): Boolean;
var
  I: Integer;
begin
  UnitName := Lowercase(UnitName);
  for I := Low(UnitsAll) to High(UnitsAll) do
    if UnitName = UnitsAll[I] then
      Exit(True);
  Result := False;
end;

function TUnitClass.IsUnitsNoLower(UnitName: UnitStringType): Boolean;
var
  I: Integer;
begin
  for I := Low(UnitsAll) to High(UnitsAll) do
    if UnitName = UnitsAll[I] then
      Exit(True);
  Result := False;
end;

procedure TUnitClass.AddUnit(UnitsAdd: UnitArray);
var
  I: Integer;
begin
  UnitCountAll := Length(UnitsAll);
  SetLength(UnitsAll, UnitCountAll + Length(UnitsAdd));
  for I := Low(UnitsAdd) to High(UnitsAdd) do
    if not IsUnits(UnitsAdd[I]) then
    begin
      UnitsAll[UnitCountAll] := UnitsAdd[I];
      Inc(UnitCountAll);
    end;
  SetLength(UnitsAll, UnitCountAll);
end;

initialization

SetLength(TClassUnits.TypesAll, 0);
SetLength(TClassUnits.UnitsAll, 0);
TClassUnits.AllCountType := 0;

TClassUnits.GetList;

finalization

SetLength(TClassUnits.TypesAll, 0);
SetLength(TClassUnits.UnitsAll, 0);
TClassUnits.AllCountType := 0;

end.



а зачем тебе миллион DLL в проекте ?
...
Рейтинг: 0 / 0
20.04.2019, 20:05
    #39804308
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
MertКак между всеми dll разделить 1 менеджер памяти ? Для загрузки RTTI информации о классах в них

Нужно сделать динамическую автоматизацию в приложение, подгружая тот или иной модуль. Размер модуля неважен.


Пробовал с bpl но у другого пользователя требует еще bpl разные - которые delphi не кладет. И толку с этого полный ноль
Создай свой bpl с rtl и vcl и пользуйся этой bpl для всех своих bpl и приложения. И будет все работать.
...
Рейтинг: 0 / 0
20.04.2019, 20:55
    #39804309
shonli95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
ziv-2014MertКак между всеми dll разделить 1 менеджер памяти ? Для загрузки RTTI информации о классах в них

Нужно сделать динамическую автоматизацию в приложение, подгружая тот или иной модуль. Размер модуля неважен.


Пробовал с bpl но у другого пользователя требует еще bpl разные - которые delphi не кладет. И толку с этого полный ноль
Создай свой bpl с rtl и vcl и пользуйся этой bpl для всех своих bpl и приложения. И будет все работать.

Там этих bpl в связке на 25 мб, не считая самого приложения на 2 мб. Так что я подумал лучше 8 библиотек по 2-4 мб чем такое чудо. Тем более плагины сразу все вместе не идут

А отдельно bpl не удаётся заставить работать, я просёк что у меня они не прописались в поле bpl и по этому ничего не компилировалось (удалил настройки проекта и заново открыл)
...
Рейтинг: 0 / 0
20.04.2019, 23:01
    #39804333
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
какой фигнёй только люди не занимаются, что бы только не работать
...
Рейтинг: 0 / 0
21.04.2019, 01:17
    #39804367
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
Делаете dll - работайте через простые функции и stdcall.
...
Рейтинг: 0 / 0
21.04.2019, 10:59
    #39804421
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Общий мендежер памяти
shonli95ziv-2014пропущено...

Создай свой bpl с rtl и vcl и пользуйся этой bpl для всех своих bpl и приложения. И будет все работать.

Там этих bpl в связке на 25 мб, не считая самого приложения на 2 мб. Так что я подумал лучше 8 библиотек по 2-4 мб чем такое чудо. Тем более плагины сразу все вместе не идут

А отдельно bpl не удаётся заставить работать, я просёк что у меня они не прописались в поле bpl и по этому ничего не компилировалось (удалил настройки проекта и заново открыл)

Значит ты что-то делаешь не так. Сделай одну bpl с rtl и vcl. Затем все проекты откомпилируй заново с ключом "компилировать с runtime-пакетами". И добавь созданную bpl в список пакетов, а остальные удали. Там должна быть одна твоя bpl.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Общий мендежер памяти / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]