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

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


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

спасибо

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

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

Я остановился класть на 10 пакете. И размер приложения стал больше чем с dll
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39639345
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MertРазве нельзя будет управлять классами из LibModuleList ?
Не знаю, что это такое.
Я вообще никогда не пользовался RTTI "напрямую". Мне это не нужно.
Вообще по идее должно всё работать с общим МП, но при условии, что все dll скомпилены ондой версией делфи. А там - кто его знает.
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39639346
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MertЯ остановился класть на 10 пакете. И размер приложения стал больше чем с dll
Когда проект перевалит через N мегабайт, то баланс пойдет в другую сторону.
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39639350
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MertВерсия delphi - tokyo 10.3Нет такой версии
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #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
Общий мендежер памяти
    #39639461
Mert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не увидел ограничения. Удалил dll и exe
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39639462
Mert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Открепился из за капчи...
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39639619
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mert,
1. Используй FastMM
2. Создай свой собственный bpl с rtl, vcl и fastmm
3. Компилируй exe и dll с этим созданным bpl
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39639643
Mert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014Mert,
3. Компилируй exe и dll с этим созданным bpl

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


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

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

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

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

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


Хосподя, ну нафига это старье?
У FastMM есть опции SharedMem.
Обыкновенные string спокойно передаются м/у DLL и Application без утечек.
На взлет не помню названия, но их там не так много, этих опций.
+ они хорошо документированны и переводы этих опций были в инете.
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #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
Общий мендежер памяти
    #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
Общий мендежер памяти
    #39804308
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MertКак между всеми dll разделить 1 менеджер памяти ? Для загрузки RTTI информации о классах в них

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


Пробовал с bpl но у другого пользователя требует еще bpl разные - которые delphi не кладет. И толку с этого полный ноль
Создай свой bpl с rtl и vcl и пользуйся этой bpl для всех своих bpl и приложения. И будет все работать.
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #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
Общий мендежер памяти
    #39804333
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой фигнёй только люди не занимаются, что бы только не работать
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #39804367
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаете dll - работайте через простые функции и stdcall.
...
Рейтинг: 0 / 0
Общий мендежер памяти
    #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
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Общий мендежер памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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