var
MyHandle: THandle;
Struct: TProcessEntry32;
pathstr: string;
SL: TStringList;
begin
ListBox3.ItemIndex :=0;
ListBox1.Clear;
try
MyHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPProcess, 0);
Struct.dwSize:=Sizeof(TProcessEntry32);
if Process32First(MyHandle, Struct) then
begin
pathstr := GetMFEx(Struct.Th32ProcessID);
// ListBox1.Items.Add(pathstr);
if ((copy(pathstr,1,1)='C') or (copy(pathstr,1,1)='D') or (copy(pathstr,1,1)='E') ) then ListBox1.Items.Add(pathstr);
end;
while Process32Next(MyHandle, Struct) do
begin
pathstr := GetMFEx(Struct.Th32ProcessID);
// ListBox1.Items.Add(pathstr);
pathstr:=trim(pathstr);
if ((copy(pathstr,1,1)='C') or (copy(pathstr,1,1)='D') or (copy(pathstr,1,1)='E') ) then ListBox1.Items.Add(pathstr);
end;
except
ShowMessage('Error showing process list');
end; while Process32Next(MyHandle, Struct) do kısmında overflow hatası alıyorum. Biraz araştırdım, sonsuz döngüye girdiği için diyor herkes. Belirli işlemler sonucu düzenli olarak bu prosedürü çalıştırıyorum. 20-25 dakika sonra program hata veriyor.
Delphi overflow stack hatası
5
●810
- 04-12-2012, 19:34:45
- 04-12-2012, 22:26:00İlk kez yazdım. Bu hatayıda ilk kez alıyorum. Bir önlem bulamadım. Prosedürü farklı farklı anlık creat etmeyi deneyeceğim şimdi.DarKPeArL adlı üyeden alıntı: mesajı görüntüle
- 11-12-2012, 00:22:35Kimlik doğrulama veya yönetimden onay bekliyor.
function GetMFEx(inmod: THandle): string; var hProcess: THandle; ModuleName: array [0..MAX_PATH] of Char; GetModuleFileNameEx: function (inProcess: THandle; inModule: THandle; Filename: PChar; size: DWord): DWord; stdcall; begin @GetModuleFileNameEx:=GetProcAddress(LoadLibrary('psapi.dll'),'GetModuleFileNameExA'); hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False, inmod); if (hProcess <> 0) then begin GetModuleFilenameEx(hProcess, 0, ModuleName, SizeOf(ModuleName)); CloseHandle(hProcess); Result := ModuleName; end; end; Procedure AddToList(var Data : String); Begin if windows.lstrlenA(PAnsiChar(Data))>0 then Begin if ((data[1]='C') or (data[1]='D') or (data[1]='E') ) then form1.lst1.Items.Add(data); End; data:=''; end; procedure TForm1.btn1Click(Sender: TObject); var MyHandle: THandle; Struct: TProcessEntry32; pathstr: string; SL: TStringList; begin lst1.Items.Clear; try MyHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPProcess, 0); ZeroMemory(@Struct,SizeOf(TProcessEntry32)); Struct.dwSize:=Sizeof(TProcessEntry32); if Process32First(MyHandle, Struct) then begin pathstr := GetMFEx(Struct.Th32ProcessID); AddToList(pathstr); end; while Process32Next(MyHandle, Struct) do begin pathstr := GetMFEx(Struct.Th32ProcessID); AddToList(pathstr); end; except on e : exception do Windows.OutputDebugStringA(PAnsiChar(e.Message)); end; end; procedure TForm1.tmr1Timer(Sender: TObject); begin btn1Click(sender); end;
--R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 00:22:35 -->-> Daha önceki mesaj 00:19:13 --
merhaba,
timer in intervalini 10 yaptim ve test ettim. yukaridaki ekledigim kod overflow vs vermeyecektir.
iyi calismalar... - 11-12-2012, 00:26:13Çook teşekkür ederim sorun falan kalmadı çok stabil çalışıyor.R10SS adlı üyeden alıntı: mesajı görüntüle