Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.09.2011, 17:12   #1
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию Console 2 Win32

Приветствую Вас. Хотелось бы получить помощь по такому вопросу. Переписал одно CONSOLE приложение под форму, вроде все WriteLN переделан на отправку в мемо результата, и что-то перестало работать, при запуске основной процедуры форма виснет до тех пор, пока не открыл любой из файлов. Это еще ладно, после того она просто вылетает с ошибкой, не записывая ничего в Memo. Хотя в консольном варианте компилится нормально и работает, прада только при первом запуске сливает в лог PID процесса а дальше уже не реагирует на запуски других программ... Ума не приложу в чем может быть проблема . Бился с ней долгое время, но к сожалению пока не одолел. PLS, мне хотя бы с первой траблой помогите разобраться.
Всем ответившим спасибо за помощь.
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума
Старый 04.09.2011, 17:12   #2
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Вот код:
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogstintlistStdCtrls;

type
  TForm1 
= class(TForm)
    
Button1TButton;
    
Memo1TMemo;
    
procedure Button1Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;


  
type
  NTStatus 
cardinal;
  
PVOID    pointer;
  
USHORT WORD;
  
UCHAR byte;
  
PWSTR PWideChar;

CONST  
//Статус константы

  
STATUS_SUCCESS              NTStatus($00000000);
  
STATUS_ACCESS_DENIED        NTStatus($C0000022);
  
STATUS_INFO_LENGTH_MISMATCH NTStatus($C0000004);

const 
SystemProcessesAndThreadsInformation 5;

type
PClientID 
= ^TClientID;
TClientID packed record

 UniqueProcess
:cardinal;
 
UniqueThread:cardinal;
end;

PUnicodeString = ^TUnicodeString;
  
TUnicodeString packed record
    Length
Word;
    
MaximumLengthWord;
    
BufferPWideChar;
end;

PVM_COUNTERS = ^VM_COUNTERS;
VM_COUNTERS packed record
   PeakVirtualSize
,
   
VirtualSize,
   
PageFaultCount,
   
PeakWorkingSetSize,
   
WorkingSetSize,
   
QuotaPeakPagedPoolUsage,
   
QuotaPagedPoolUsage,
   
QuotaPeakNonPagedPoolUsage,
   
QuotaNonPagedPoolUsage,
   
PagefileUsage,
   
PeakPagefileUsagedword;
  
end;

PIO_COUNTERS = ^IO_COUNTERS;
IO_COUNTERS packed record

   ReadOperationCount
,
   
WriteOperationCount,
   
OtherOperationCount,
   
ReadTransferCount,
   
WriteTransferCount,
   
OtherTransferCountLARGE_INTEGER;
  
end;

PSYSTEM_THREADS = ^SYSTEM_THREADS;
SYSTEM_THREADS packed record
  KernelTime
,
  
UserTime,
  
CreateTimeLARGE_INTEGER;
  
WaitTimedword;
  
StartAddresspointer;
  
ClientIdTClientId;
  
Priority,
  
BasePriority,
  
ContextSwitchCountdword;
  
Statedword;
  
WaitReasondword;
 
end;

PSYSTEM_PROCESSES = ^SYSTEM_PROCESSES;
SYSTEM_PROCESSES packed record
   NextEntryDelta
,
   
ThreadCountdword;
   
Reserved1 : array [0..5of dword;
   
CreateTime,
   
UserTime,
   
KernelTimeLARGE_INTEGER;
   
ProcessNameTUnicodeString;
   
BasePrioritydword;
   
ProcessId,
   
InheritedFromProcessId,
   
HandleCountdword;
   
Reserved2: array [0..1of dword;
   
VmCountersVM_COUNTERS;
   
IoCountersIO_COUNTERS;

   
Threads: array [0..0of SYSTEM_THREADS;
  
end;

  var 
infoinfo2PSystem_Processes;
    
ijkinteger;
    
tt1LARGE_INTEGER;
    
process_idtintegerlist;




implementation

{$R *.dfm}

Function 
ZwQuerySystemInformation(ASystemInformationClassdword;
                                  
ASystemInformationPointer;
                                  
ASystemInformationLengthdword;
                                  
AReturnLength:PCardinal): NTStatus;
                                  
stdcall;external 'ntdll.dll';
Function 
GetInfoTable(ATableType:dword):Pointer;
var
 
mSizedword;
 
mPtrpointer;
 
StNTStatus;
begin
 Result 
:= nil;
 
mSize := $4000;

 
repeat
   mPtr 
:= VirtualAlloc(nilmSizeMEM_COMMIT or MEM_RESERVEPAGE_READWRITE);
   if 
mPtr nil then Exit;
   
St := ZwQuerySystemInformation(ATableTypemPtrmSizenil);
   if 
St STATUS_INFO_LENGTH_MISMATCH then

      begin 
//надо больше памяти
        
VirtualFree(mPtr0MEM_RELEASE);
        
mSize := mSize 2;
      
end;
 
until St <> STATUS_INFO_LENGTH_MISMATCH;
 if 
St STATUS_SUCCESS
   then Result 
:= mPtr
   
else VirtualFree(mPtr0MEM_RELEASE);

end;



procedure TForm1.Button1Click(SenderTObject);
begin
  process_id 
:= TIntegerList.Create;
    
info := GetInfoTable(SystemProcessesAndThreadsInformation);
    
info2 := info;


     while (
info2^.NextEntryDelta <> 0) do

     
begin
     
if (process_id.IndexOf(info2^.ProcessId)=-1)
        
then process_id.Add(info2^.ProcessId);

       
info2 := Pointer(dword(info2)+info2.NextEntryDelta);
    
end;   

    
VirtualFree(info0MEM_RELEASE);

    
//А теперь смотрим что добавилось

  
while true do
 
begin
    Sleep
(200);
    
info := GetInfoTable(SystemProcessesAndThreadsInformation);
    
info2 := info;

    while (
info2^.NextEntryDelta <> 0) do   

    
begin
      
if (process_id.IndexOf(info2^.ProcessId)=-1)
        
then
          begin
          memo1
.Lines.Add(string(info2^.ProcessId)+' - created');
          
process_id.Add(info2^.ProcessId);
          
end;
      
info2 := Pointer(dword(info2)+info2^.NextEntryDelta);
    
end;
    
VirtualFree(info0MEM_RELEASE);
  
end;  end;



end
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума
Старый 04.09.2011, 19:14   #3
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
while true do
begin
Sleep(200);
info := GetInfoTable(SystemProcessesAndThre adsInformation);
info2 := info;

while (info2^.NextEntryDelta <> 0) do

begin
if (process_id.IndexOf(info2^.ProcessI d)=-1)
then
begin
memo1.Lines.Add(string(info2^.Proce ssId)+' - created');
process_id.Add(info2^.ProcessId);
end;
info2 := Pointer(dword(info2)+info2^.NextEnt ryDelta);
end;
VirtualFree(info, 0, MEM_RELEASE);
end; end;
А это что за мазафака? Сразу бросилось в глаза. Вы фактически зацикливаете до бесконечности этот кусок кода без вариантов выхода из цикла. В таком виде вам придётся аварийно завершать программу в любом случае. Если в консольном варианте ещё может что-то выводиться, то в GDI варианте этому же процессу надо прорисовывать окно.

Код:
while true do
 begin
    Sleep(200);
    info := GetInfoTable(SystemProcessesAndThreadsInformation);
    info2 := info;

    while (info2^.NextEntryDelta <> 0) do   

    begin
      if (process_id.IndexOf(info2^.ProcessId)=-1)
        then
          begin
          Application.ProcessMessages;
          memo1.Lines.Add(string(info2^.ProcessId)+' - created');
          process_id.Add(info2^.ProcessId);
          end;
      info2 := Pointer(dword(info2)+info2^.NextEntryDelta);
    end;
    VirtualFree(info, 0, MEM_RELEASE);
  end;  end;
В таком варианте memo1 прорисуется, но код перепиливать надо серавно. Предусмотрите условие выхода из цикла.

Цитата:
while true do Sleep(200);
Это здесь вообще ни к чему. Из-за Sleep программа будет подвисать, а цикл "наматывает" этот кусок кода на бесконечность, да и практического смысла здесь в них нет.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.

Последний раз редактировалось notHaker; 04.09.2011 в 19:23.
notHaker вне форума
Старый 04.09.2011, 19:42   #4
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Добавил Application.ProcessMessages, на счет sleep так и не понял, нужен же интервал для сверки списка PID'ов. Попробовал так как вы написали, запуститься - запустилось, после ButtonClick все ок, но при попытке открытия любого файла все равно появляется ErrorMessage и в memo ничего (((
Спасибо за ответ, а я буду ковыряться дальше...
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ

Последний раз редактировалось Den7656; 04.09.2011 в 22:55.
Den7656 вне форума
Старый 08.09.2011, 14:10   #5
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

всем спасибо, вопрос решен.
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ win32 console application pancak Помощь студентам 3 31.05.2011 19:00
Решение задачи на С++ (win32 console application).ax3+bx2+cx+d=0 alextsi Помощь студентам 2 06.11.2010 02:25
win32 API.Visual Studio 2008.Создание проекта Win32 Aleksandr_Yanov Visual C++ 2 12.09.2010 13:09
Проект Win32 Console Application (консольный режим), среда Visual C++ 6.0 Ma666oT Фриланс 8 02.04.2010 08:20
Проект Win32 Console Application (консольный режим), среда Visual C++ 6.0 Ma666oT Помощь студентам 11 01.04.2010 14:56