Текущий архив: 2009.06.07;
Скачать: CL | DM;
Вниз
Где лучше освобождать память? Найти похожие ветки
← →
AIRDIGER © (2009-04-21 05:49) [0]Где лучше освобождать память?
в том месте где она уже стала ненужной или в конце кода в секциях винализации?
(сильно не пинайте я только собираюсь поступать в инстик мне 17л.)
Пример:
//...............................
Type TResType = MakeIntResource;
PLangs = ^TLangs;
TLangs = Array of WORD;
PGroupIconNameType = ^TGroupIconNameType;
TGroupIconNameType = packed record
Name : String;
ID : DWORD;
Lang : TLangs;
end;
PGroupNameItems = ^TGroupNameItems;
TGroupNameItems = Array of PGroupIconNameType;
PIconIndex = ^TIconIndex;
TIconIndex = Record
Lang : TLangs;//array of WORD;
end;
TIconCount = Array of TIconIndex;
//...................................
{--------------------------------- ResEnum ------------------------------------}
function ResEnum(hModule: THandle; ResType: PChar; ResName: PChar; Ptr: integer): boolean; stdcall;
var
Name : String;
PINT : PGroupIconNameType;
begin
New(PINT);
FillMemory(PINT,SizeOf(PINT^),0);
SetLength(PGroupNameItems(Ptr)^,Succ(Length(PGroupNameItems(Ptr)^)));
PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))] := PINT;
try
Name:= ResName;
PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Name:= Name;
EnumResourceLanguages(hModule,RT_GROUP_ICON,PChar(Name),@LangEnumProc,
Integer(@PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang));
except
PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].ID := DWORD(ResName);
EnumResourceLanguages(hModule,RT_GROUP_ICON,PChar(DWORD(ResName)),@LangEnumProc,
Integer(@PLangs(PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang) ));
end;
Result := True;
end;
//..........................................
var
GNI: TGroupNameItems;
begin
try
//...какой то код.
// вызов функци где добавляется структура в массив
EnumResourceNames(hModule,RT_GROUP_ICON, @ResEnum, Integer(@GNI))
finally
так здесь по все логике нужно высвобождать память
end;
end;
это к коду
например был создал в функцие массив из указателей на структуры и в цикле его запонял добовляя в массив новую запись через New();
то ка нужно высвободить память? так же перебором вего массва
for i:= to Pred(Length(MyArray)) do begin
Dispose(MyArray[i]);
end;
или есть метод какой-нибудь высвобождающий всё сразу что было добавленно в массив?
← →
MBo © (2009-04-21 07:04) [1]Типы указателей на динамический массив вроде этого:
PLangs = ^TLangs;
TLangs = Array of WORD;
нужны крайне редко.
Избавься от них, тогда будет попроще прочитать и понять, что у тебя в коде делается.
← →
AIRDIGER © (2009-04-21 07:23) [2]
> MBo © (21.04.09 07:04) [1]
>
> PLangs = ^TLangs;
> TLangs = Array of WORD;
От них нелзя избавиться ... они мне не мешают...
ICON
ресурс-1
ланг
1024
1049
1033
pecурс-2
ланг
1024
1033
ресурс-3
ланг
1033
и увсех могут быть разное количесто языковых копий
если массив сделать статическим наприме lang: array [1..144] of WORD ; то не понятно будет сколько же найдено языковых копий у данного ресурса?
← →
KSergey © (2009-04-21 08:04) [3]Сроме статических массивов бывают ещ единамические
lang: array of WORD ;
Размер их легко менять по ходу пьессы, равно как и узнавать текущий размер. И не надо будет заботиться о том когда их освобождать - компилятор все сделает волшебно в нужное время.
← →
AIRDIGER © (2009-04-21 08:16) [4]
> KSergey © (21.04.09 08:04) [3]
> Сроме статических массивов бывают ещ единамическиеlang:
> array of WORD ; Размер их легко менять по ходу пьессы, равно
> как и узнавать текущий размер. И не надо будет заботиться
> о том когда их освобождать - компилятор все сделает волшебно
> в нужное время.
Так оно тут и пременяется:
TGroupIconNameType = packed record
Name : String;
ID : DWORD;
Lang : TLangs; <------ оно же и есть = lang: array of WORD ;
end; Type TLangs = Array of WORD;
← →
Ega23 © (2009-04-21 09:54) [5]
> Так оно тут и пременяется:
А нафига packed?
← →
brother © (2009-04-21 10:00) [6]> А нафига packed?
экономит?)
← →
Сергей М. © (2009-04-21 10:05) [7]
> TGroupNameItems = Array of PGroupIconNameType;
Почему не Array of TGroupIconNameType ?
Сам себе создаешь трудности для их последующего героического преодоления ?)
← →
KSergey © (2009-04-21 12:12) [8]ТопикСтартеру: по ответам видно, что про вопрос в заголовке людям как бы и есть что сказать, но в коде ничерта не понятно, выискивать в нем быги никому не охота.
И беда именно в неудачной организации работы с данными: то дин. массивы, то какие-то указатели, все это перекручено/перенавернуто.
Надо быть проще :)
← →
Игорь Шевченко © (2009-04-21 12:50) [9]
> Где лучше освобождать память?
винда сама освободит
← →
Anatoly Podgoretsky © (2009-04-21 13:10) [10]> Игорь Шевченко (21.04.2009 12:50:09) [9]
Бог простит :-)
← →
AIRDIGER © (2009-04-21 13:31) [11]
> KSergey © (21.04.09 12:12) [8]
> ТопикСтартеру: по ответам видно, что про вопрос в заголовке
> людям как бы и есть что сказать, но в коде ничерта не понятно,
> выискивать в нем быги никому не охота.И беда именно в неудачной
> организации работы с данными: то дин. массивы, то какие-
> то указатели, все это перекручено/перенавернуто.
Согласен с вами, но проще не выходит... ВИН-АПИ так устроено, что проще нельзя ... просто всего сразу не возможно расказать что да как и почему.... тут нужно больше разбираться в самой структуре и организации РЕСУРСОВ и устройства PE - формата файлов... тогда и будет понятны эти навороты..
> Сергей М. © (21.04.09 10:05) [7]
> > TGroupNameItems = Array of PGroupIconNameType;Почему не
> Array of TGroupIconNameType ?
Пришлось поменять просто раньше уже все работало и лезть что-то менять в организацию данных боязно .. то опять что-нить вылетит..
> Anatoly Podgoretsky © (21.04.09 13:10) [10]
> > Игорь Шевченко (21.04.2009 12:50:09) [9]Бог простит
> :-)
Бог с кого спросить должен с Винды или с тех кто ее разработал? :-)
← →
Игорь Шевченко © (2009-04-21 13:50) [12]
> ВИН-АПИ так устроено, что проще нельзя ... просто всего
> сразу не возможно расказать что да как и почему.... тут
> нужно больше разбираться в самой структуре и организации
> РЕСУРСОВ и устройства PE - формата файлов... тогда и будет
> понятны эти навороты
тогда и код не надо показывать
> Бог с кого спросить должен с Винды или с тех кто ее разработал?
> :-)
он прощает, а не спрашивает
← →
MBo © (2009-04-21 13:51) [13]мал-мал попроще:
function EnumLang(hm: THandle; typ, Name: PChar; wIDL: Word; lst: TStrings): Bool; stdcall;
begin
lst.Add(IntToStr(wIDL));
Result := True;
end;
function EnumNames(hm: THandle; typ, Name: PChar; lst: Tstrings): Bool; stdcall;
var
Langs: TStringList;
begin
Langs := TStringList.Create;
EnumResourceLanguages(hInstance, RT_GROUP_ICON, Name, @EnumLang, Integer(Langs));
Lst.Add(Name + " : " + Langs.CommaText);
Langs.Free;
Result := True;
end;
procedure TForm2.Button7Click(Sender: TObject);
begin
EnumResourceNames(hInstance, RT_GROUP_ICON, @EnumNames, Integer(Memo1.Lines));
end;
← →
AIRDIGER © (2009-04-21 14:11) [14]
> MBo © (21.04.09 13:51) [13]
> мал-мал попроще:function EnumLang(hm: THandle; typ, Name:
> PChar; wIDL: Word; lst: TStrings): Bool; stdcall;begin
> lst.Add(IntToStr(wIDL)); Result := True;end;function EnumNames(hm:
> THandle; typ, Name: PChar; lst: Tstrings): Bool; stdcall;
> var Langs: TStringList;begin Langs := TStringList.Create;
> EnumResourceLanguages(hInstance, RT_GROUP_ICON, Name,
> @EnumLang, Integer(Langs)); Lst.Add(Name + " : " + Langs.
> CommaText); Langs.Free; Result := True;end;procedure TForm2.
> Button7Click(Sender: TObject);begin EnumResourceNames(hInstance,
> RT_GROUP_ICON, @EnumNames, Integer(Memo1.Lines));end;
это конечно же код свашей колокольни удобен для МНУ он не приемлен
т.к.
1. используются классы (TString Listкласы в урну запихните - увеличивают код до безобразия )
2. использование Forms - это нужно туда же затокать поглубже где и классы..
мои критери:
+ должно быть создано в отдельном модуле
+ работать должно на чистом API
+ у меня весь проект после компиляции в консольной верисии не более 17кб.
а если использовать КОЛ и оптимизированные системные модули то выходит 10-11кб. + упоковать = ~5-6 кб. программа и это на Delphi - А не СИ какой-нибудь хотя я против него ничего не имею...... ГЫ :-)
← →
Andy BitOff © (2009-04-21 14:16) [15]
> AIRDIGER © (21.04.09 14:11) [14]
Молодой ысчё. Кому нужны эти размеры. Важно время разработки.
← →
AIRDIGER © (2009-04-21 14:36) [16]
> MBo © (21.04.09 13:51) [13]
> мал-мал попроще:
Весь прикол был не втом чтобы структуры перечислить и вывести на экран, а втом, что бы запомнить т.е. сохранить расположение структуры...
- при апдейте исонок из друго модуля необходимо старые удалять перед обновлением и удалять ресурс RT_GROUP_ICON, а затем уже записывать новые иконки и RT_GROUP_ICON.. Так вот перед тем как удалить старые нужно сохранить дерево ресурса и это лучше записать в деревовидную структуру.. Обясняю почему .... так как при удалении нужно вызвать две функции
1. hModule := LoadLibrary(PChar(FileSource));
hModule - через него ведется перечисление и поиск ресурсов
2. hResUpdate := BeginUpdateResource(PChar(UpDateFile), False);
BeginUpdateResource
....
UpdateResource
....
EndUpdateResource
в открытой секции делаются обновления ресурсов циклом, но ясное же дело что в этой открытой секции невозможно искать и перечислять ресурсы по открытому hModule - его нужно закрыть ранее ... BeginUpdateResource EndUpdateResource по своей сути напоминает критические секции...
поэтому дерево ресурсов т.е. расположение их нужно заренее сохранить..
← →
MBo © (2009-04-21 14:38) [17]>используются классы
да, мне так проще было написать, и легко прочитать и понять.
Нет проблем сделать с массивами, будет только немножко длиннее, и стоит избегать перлов типа:
Integer(@PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang
← →
Игорь Шевченко © (2009-04-21 14:39) [18]
> это конечно же код свашей колокольни удобен для МНУ он не
> приемлен
парься сам, все в твоих руках
← →
AIRDIGER © (2009-04-21 14:47) [19]
> Andy BitOff © (21.04.09 14:16) [15]
> > AIRDIGER © (21.04.09 14:11) [14]Молодой ысчё. Кому нужны
> эти размеры. Важно время разработки
Ну да... время оч. нужно ...вот японаписал модулей разных для всяких задачь, которые не завист там от каких-либо класов и других модулей каждый модуль сам по себе... как понадобился я его подключил к проекту быстро и удобно не нужно подгонять под что-либо и код инимум код по минимум... гы.. :-)
← →
аноним (2009-04-21 14:49) [20]>Integer(@PGroupNameItems(Ptr)^[Pred(Length(PGroupNameItems(Ptr)^))].Lang
Кто там говорил, что слишком Си запутан
← →
аноним (2009-04-21 14:51) [21]>Ну да... время оч. нужно ...вот японаписал модулей разных для всяких задачь, которые не завист там от каких-либо класов и других модулей каждый модуль сам по себе... как понадобился я его подключил к проекту быстро и удобно не нужно подгонять под что-либо и код инимум код по минимум... гы.. :-)
А КОЛ не проще использовать ?
Нужен маленький размер забуть о дельфи, учи Си
← →
Ega23 © (2009-04-21 14:53) [22]Либо очередной развод, либо очередной молодой дурачок.
← →
AIRDIGER © (2009-04-21 15:07) [23]> А КОЛ не проще использовать ?
> Нужен маленький размер забуть о дельфи, учи Си
Учи Си - И зумучишся все руками писать... подглючи модуль "виндовс" и СИ станет ничем не меньше Делфи в делфи отключи все кроме модуля "Windows" и он станет ни чем не хуже СИ ....... зато в делфи в модуде "Windows" столько полезного ... А если использовать КОЛ так и вообще ни каких не нада.. я пока и не думаю переползать на СИ .... хотя скоро придетия но лучше уже тогда на Fasm или masm32 - эти вообще еще крутяк...
← →
Amoeba © (2009-04-21 23:23) [24]
> Ega23 © (21.04.09 14:53) [22]
>
> Либо очередной развод, либо очередной молодой дурачок.
Скорей второй случай.
← →
Denis__ © (2009-04-21 23:30) [25]Кого-то он мне напоминает... Deep в молодости)))
Страницы: 1 вся ветка
Текущий архив: 2009.06.07;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.004 c