![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Snake_B |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
type TModuleArray = array of TModuleEntry32;
.............
function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray;
var
hSnapshot : THandle;
lpme : TModuleEntry32;
procedure AddModuleToList;
begin
SetLength(Result,High(Result)+2);
Result[high(Result)]:=lpme;
end;
begin
SetLength(Result,0);
hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId);
if hSnapshot=-1 then RaiseLastWin32Error;
lpme.dwSize:=SizeOf(lpme);
if Module32First(hSnapshot,lpme) then
begin
AddModuleToList;
while Module32Next(hSnapshot,lpme) do AddModuleToList;
end;
end;
function GetWindowPatch(Wnd: hWnd): string; // Нахождение пути к ехе по заголовку окна...
var
i: integer;
modarr : TModuleArray;
Pid: Cardinal;
begin
result:='Null';
GetWindowThreadProcessId(Wnd,@Pid);
modarr:=GetModulesListByProcessId(Pid); result:='Null';
for i:=0 to High(modarr) do
begin
if Integer(modarr[i].modBaseAddr)=$400000 then
begin
result:=modarr[i].szExePath; break;
end;
end;
end;
procedure TFormWinHide.SearchWindow; // Поиск окон...
VAR
searchTm: boolean;
searchTmInt, i, OldWC, OldWCH: integer;
name, TmpStr, Str: string;
Tmp: TMenuItem;
Wnd: hWnd;
buff: ARRAY [0..127] OF Char;
begin
OldWC:=WinCount;
WinCount:=0;
OldWCH:=WinCountH;
WinCountH:=0;
// Считаем количество окон..
Wnd:= GetWindow(Handle, gw_HWndFirst); WHILE Wnd <> 0 DO BEGIN IF (Wnd <> Application.Handle) THEN BEGIN
if IsWindowVisible(Wnd) then begin
GetWindowText(Wnd, buff, sizeof(buff)); TmpStr:=StrPas(buff);
if (GetWindowText(Wnd, buff, sizeof(buff)) = 0) then
begin name:=GetWindowPatch(Wnd); if (name<>'Null') then TmpStr:=name; end;
if (TmpStr<>'') and (TmpStr<>paramStr(0)) then begin WinCount:=WinCount+1; END;
end else begin
WinCountH:=WinCountH+1;
end; end; Wnd := GetWindow(Wnd, gw_hWndNext); END; }
1) вот... примерно так... procedure TFormWinHide.SearchWindow вызывается таймером каждые 100 мс... идет утечка памяти... не могу разабраться откуда... 2) а можно не по таймеру окна искать, а по системному сообщению (изменилось общее количество окон или одно из окон изменило статус с "IsWindowVisible(Wnd)" и наоборот)? если да, то как... 3) Ну это к другой теме, но спрошу здесь же... в контекстном меню задаю для пункта hint, ноль эмоций.. что надо сделать, чтобы он там отображался? |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата идет утечка памяти... не могу разабраться откуда... Вопрос на засыпку: с чего ты решил про утечку? Запустил приложение, оно отработало больше 7 минут, после первых 10 секунд работы максимальный объем используемой памяти не увеличился.Цитата а можно не по таймеру окна искать, а по системному сообщению По таймеру гораздо проще, но можно ставить хук на CreateProcess/ZwCreateProcess, если хочешь - спроси у Гугля...Цитата в контекстном меню задаю для пункта hint, ноль эмоций.. что надо сделать, чтобы он там отображался? Читать здесь: http://delphi.about.com/od/vclusing/a/menuitemhints.htmСообщение отредактировано: volvo - 7.08.2008 18:30 |
Snake_B |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вопрос на засыпку: с чего ты решил про утечку? Запустил приложение, оно отработало больше 7 минут, после первых 10 секунд работы максимальный объем используемой памяти не увеличился. По таймеру гораздо проще, но можно ставить хук на CreateProcess/ZwCreateProcess, если хочешь - спроси у Гугля... Читать здесь: http://delphi.about.com/od/vclusing/a/menuitemhints.htm про утечку... диспечер задач, до запуска - выделение памяти - 842 мб через 10 секунд - 890 мб через 20 - 920 ну и так далее (в первый раз, пока сообразил, 1700 мб было )... но в процессах память не растет ни у bds, ни у программы... при запуске не из делфи, а просто программы таже фигня... при закрытии программы память падает до значения перед запуском... // name:=GetWindowPatch(Wnd);
отключаю эту строку, всё нормально... Win XP sp2, delphi 2005... проще, так проще... англицкий будем учить :-) |
Snake_B |
![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
англицкий будем учить :-) там про главное меню... сделела не много по другому... может кому пригодится... ну и за одно может кто скажет де ошибки =) unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
nmuThis: TMenuItem;
mnuIs: TMenuItem;
mnuA: TMenuItem;
mnuTest: TMenuItem;
procedure FormCreate(Sender: TObject);
private
procedure ActivateHintNOW( x,y: Integer);
procedure AppHint(Sender: TObject);
public
end;
var
Form1: TForm1; var hintWnd: THintWindow;
implementation
{$R *.dfm}
procedure TForm1.ActivateHintNOW( x,y: Integer);
var
rect: TRect;
Hintlnfo: THintInfo;
begin
hintWnd.Color:=Application.HintColor;
rect := hintWnd.CalcHintRect( Screen.Width, Application.Hint, nil);
rect.Left := rect.Left+x;
rect.Right := rect.Right+x;
rect.Top := rect.Top + y;
rect.Bottom := rect.Bottom + y;
hintWnd.ActivateHint( rect, Application.Hint);
end;
procedure TForm1.AppHint(Sender: TObject);
begin
if Application.Hint = '' then
begin
hintwnd.releasehandle;
exit;
end;
ActivateHintNOW(Mouse.CursorPos.X + 16, Mouse.CursorPos.Y + 16);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hintwnd:= THintWindow.create(self);
Application.OnHint := AppHint;
self.PopupMenu := PopupMenu1;
end;
end.
ну вопрос про память в силе.. |
![]() ![]() |
![]() |
Текстовая версия | 7.08.2025 5:49 |