-
Програмка, висит в трее и вызывает другую прогу. Собственно заготовка для небольшого менеджера в рамках предприятия. Размер после компиляции 28,5 кб. Что отлично. Но вот только в оперативной памяти приложение это занимается 2048 кб!!! Не такая это задача чтобы в оперативной памяти 2 метра занимать. Тем более что висеть ей там планируется на постоянке. Подскажите можно ли уменьшить размер хотя бы до 50-200 кб? Или что пользовать вместо Кола, для решения таких задач? собственно текст программы:
program KolTray;
uses
windows,
messages,
kol;
var
frmMain,
panel:pControl;
Tray:pTrayIcon;
Menu:pMenu;
function CrProcess(s1,s2:string):thandle;
var
StInfo:TStartupInfo; SeAttr: TSecurityAttributes; ProcInfo: TProcessInformation;
begin
FillChar(StInfo, SizeOf(StInfo), 0); StInfo.cb:=SizeOf(StInfo);
stInfo.dwFlags:=STARTF_USESHOWWINDOW;
StInfo.wShowWindow:=SW_SHOWDEFAULT;
with seAttr do begin
nLength:=SizeOf(SeAttr);
bInheritHandle:=true;
lpSecurityDescriptor:=nil;
end;
if CreateProcess (nil, PChar(s1),
@SeAttr, @SeAttr, false, Normal_priority_class,
nil,
PChar(s2),
StInfo, ProcInfo) then begin
result:= ProcInfo.hProcess; end
else begin
end;
end;
procedure doTrayMouse(dummy:pointer;sender:Tobject;Message:Word);
var
P:Tpoint;
begin
if message = WM_LBUTTONUP then
begin
getcursorpos(p); Menu.PopUp(p.x,p.y); end;
end;
procedure doWorkMenu(Dummy:pointer;Sender:pMenu;Item:Integer);
begin
case Item of
0:begin
CrProcess('Y:\Programming\PSPMainProjectDBClient\MainProject.exe ','c:\');
end;
1:;
2:; end;
end;
begin
Applet := NewApplet('KOL Procedure');
frmMain := NewForm(nil,'KOL Procedure');
frmMain.Icon:=LoadIcon(hinstance,'MainIco');
frmMain.Hide;
panel := NewPanel(frmMain,esNone);
Menu := NewMenu(panel,0,
[ 'PSP Main Doc',
'-',
'Exit'],
TOnMenuItem( MakeMethod( nil, @doWorkMenu ))
);
Tray := NewTrayIcon(panel,frmMain.Icon) ; Tray.OnMouse:=TOnTrayIconMouse(Makemethod(nil,@doTrayMouse));
run(frmMain)
end.
-
Привет... Вопрос такой тут уже поднимался. В поиске должно быть. ...А по поводу вопроса...KOL тут не причем. Даже следующий код: program api_test;
function MessageBox(hWnd: WORD; lpText, lpCaption: PChar; uType: WORD): Integer; stdcall;
external 'user32.dll' name 'MessageBoxA';
begin
MessageBox(0, 'Test!!!', 'api_test', 0);
end. будет занимать в памяти ~1.9 МБ. Дело в компиляторе Дельфи, который добавляет не только user32, но еще kernel32 и advapi32...а насколько я помню, эти библы, еще "тянут" за собой "кучу" всего...
-
-
DonJad, честно говоря ерундой маетесь... зачем такой геморой? на какой машине\системе будет работать прога?
-
На большом кол-ве разных по характеристикам. И висеть по тз должна постоянно. Потому и хотелось бы 200-300 кб.
Может можно принудительно в настройках компилятора отрубить какие-нибудь лишнии библиотеки?
-
тьфу, 50-200 т.е. :)
-
Ха, нашел!!! 348кб в памяти. Вполне приемлемый результат. :) Всем спасибо! MTsv DN - отдельное, за то, что подтолкнул в правильном направлении. Рецепт найдет здесь: http://www.delphilab.ru/content/view/215/1/
program KolTray;
uses
windows,
sysutils,
messages,
kol;
var
frmMain,
panel:pControl;
Tray:pTrayIcon;
Menu:pMenu;
procedure TrimWorkingSet;
var
MainHandle: THandle;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
CloseHandle(MainHandle);
end;
end;
function CrProcess(s1,s2:string):thandle;
var
StInfo:TStartupInfo; SeAttr: TSecurityAttributes; ProcInfo: TProcessInformation;
begin
FillChar(StInfo, SizeOf(StInfo), 0); StInfo.cb:=SizeOf(StInfo);
stInfo.dwFlags:=STARTF_USESHOWWINDOW;
StInfo.wShowWindow:=SW_SHOWDEFAULT;
with seAttr do begin
nLength:=SizeOf(SeAttr);
bInheritHandle:=true;
lpSecurityDescriptor:=nil;
end;
if CreateProcess (nil, PChar(s1),
@SeAttr, @SeAttr, false, Normal_priority_class,
nil,
PChar(s2),
StInfo, ProcInfo) then begin
result:= ProcInfo.hProcess; end
else begin
end;
end;
procedure doTrayMouse(dummy:pointer;sender:Tobject;Message:Word);
var
P:Tpoint;
begin
if message = WM_LBUTTONUP then
begin
getcursorpos(p); Menu.PopUp(p.x,p.y); end;
end;
procedure doWorkMenu(Dummy:pointer;Sender:pMenu;Item:Integer);
begin
case Item of
0:begin
CrProcess('Y:\Programming\PSPMainProjectDBClient\MainProject.exe ','c:\');
end;
1:;
2:; end;
end;
begin
Applet := NewApplet('KOL Procedure');
frmMain := NewForm(nil,'KOL Procedure');
frmMain.Icon:=LoadIcon(hinstance,'MainIco');
frmMain.Hide;
panel := NewPanel(frmMain,esNone);
Menu := NewMenu(panel,0,
[ 'PSP Main Doc',
'-',
'Exit'],
TOnMenuItem( MakeMethod( nil, @doWorkMenu ))
);
Tray := NewTrayIcon(panel,frmMain.Icon) ; Tray.OnMouse:=TOnTrayIconMouse(Makemethod(nil,@doTrayMouse));
TrimWorkingSet;
run(frmMain)
end.
-
-
Каждая dll-ка проецируются в виртуальное адресное пространство процесса, что само по себе не занимает памяти как таковой, поскольку всякая dll-ка загружается системой только один раз. Однако глобальные и статические данные dll-ки дублируются отдельно для каждого процесса в целях безопасности, что собственно и составляет ~1.5Мб физ. памяти, добавьте еще к этому "кучу" вашей программы(+ стэк + др.) и получите те самые ~1.9Мб. Но есть одно маленькое НО, в случае если системе понадобяться ресурсы, она сможет освободить физ. память процесса до минимум 200кб(50 страниц), и эта цифра не измениться до тех пор пока вы грубо говоря "не наведете мышку на значок в трее", и даже в этом случае будет 300-400 кб. Это происходит из-за того что страницы с глобальными и статическими данными многих из загруженных библиотек невостребованны и потому система удаляет их из памяти (не в своп, а вообще). И практически оставляет только те с которыми необходимо работать (в вашем случае ntdll.dll, kernel32.dll, user32.dll, msctf.dll и код вашей программы) и только в необходимом объеме.
|