Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из Pascal на С++, помогите преобразовать код 
:(
    Опции темы
Barabeo
Дата 15.10.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Это код диспетчера памяти.Но его нужно сделать на С++.Помогите народ переделать.
Или может есть какая-нибудь утилитка чтобы конвертировать код.
Код

unit Unit0;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellApI, Grids, ExtCtrls, Math;

type
  TFrmMain = class(TForm)
    Button1: TButton;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    lbl5: TLabel;
    label123: TLabel;
    lbl6: TLabel;
    Label12: TLabel;
    btnRefresh: TButton;
    Label11: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    lbl7: TLabel;
    lbl8: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    lbl9: TLabel;
    lbl10: TLabel;
    Label16: TLabel;
    Label23: TLabel;
    lbl11: TLabel;
    sg0: TStringGrid;
    GroupBox2: TGroupBox;
    Label17: TLabel;
    Label22: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    lbl_1: TLabel;
    lbl_2: TLabel;
    lbl_3: TLabel;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    btnReserv: TButton;
    btnAlloc: TButton;
    btnReturn: TButton;
    btnFree: TButton;
    btnExec: TButton;
    GroupBox5: TGroupBox;
    Button8: TButton;
    Button6: TButton;
    ledSize: TLabeledEdit;
    ledAdr: TLabeledEdit;
    dlgOpen: TOpenDialog;
    ledWCount: TLabeledEdit;
    ledESize: TLabeledEdit;
    ledECount: TLabeledEdit;
    GroupBox6: TGroupBox;
    Label29: TLabel;
    Label30: TLabel;
    Label31: TLabel;
    Label33: TLabel;
    Label34: TLabel;
    Label35: TLabel;
    lblR1: TLabel;
    lblR2: TLabel;
    lblR3: TLabel;
    Label40: TLabel;
    Label32: TLabel;
    Label41: TLabel;
    lblR4: TLabel;
    lblR5: TLabel;
    Label28: TLabel;
    ledHAdr: TLabeledEdit;
    Label36: TLabel;
    Label37: TLabel;
    lblr6: TLabel;
    procedure Button1Click(Sender: TObject);
    function Align(S: string): string;
//    Function step(x,n:integer):integer;
    function HexToInt64(hex: string): cardinal;
    procedure SysInfo;
    procedure FormCreate(Sender: TObject);
    procedure sgClick(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
    procedure btnExecClick(Sender: TObject);
    procedure btnReservClick(Sender: TObject);
    procedure btnReturnClick(Sender: TObject);
    procedure btnAllocClick(Sender: TObject);
    procedure btnFreeClick(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);

//    procedure CreateArrayOfProcInfo();
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;

  mbi,_mbi: array of TMemoryBasicInformation;
  fl : array of byte;
  first: boolean = true;
  si: TSystemInfo;

//  a: array of set of byte;
implementation

{$R *.dfm}

procedure TFrmMain.FormCreate(Sender: TObject);
var i: byte;
begin
  application.HintPause:=0;

  sg0.Cells[1,0]:='Адрес';// sg.Cells[2,0]:='';
  sg0.Cells[2,0]:='Имя модуля';
  sg0.Cells[3,0]:='Размер';
  sg0.Cells[4,0]:='Тип';

  SetLength(mbi,2000);
  SetLength(_mbi,2000);

  SysInfo;
  btnRefreshClick(Self);
end;

///////////////////////////////////////////////////////////////////
procedure TFrmMain.Button1Click(Sender: TObject);
begin
  ShellAbout(0,'1234','5678',0);
end;

function TFrmMain.Align(S: string): string;
begin
  result:=s;
  while length(result)<>11 do
    result:=' '+result;
end;

procedure TFrmMain.SysInfo;
//var
  //si: TSystemInfo;
begin
  GetSystemInfo(si);

  lbl1.Caption:=IntToStr(si.dwPageSize);
  lbl2.Caption:=IntToHex(Integer(si.lpMinimumApplicationAddress),8);
  lbl3.Caption:=IntToHex(Integer(si.lpMaximumApplicationAddress),8);
  lbl4.Caption:=IntToStr(si.dwAllocationGranularity);
  lbl5.Caption:=IntToStr(si.dwPageSize);

//  lbl6.Caption:='Model '+IntToStr(si.wProcessorRevision shr 8)+' Stepping '+IntToStr(si.wProcessorRevision and $00FF);
end;

procedure TFrmMain.sgClick(Sender: TObject);
var
  gr: TGridRect;
begin
  gr.Left:=100;  gr.Top:=100;  gr.Right:=100;  gr.Bottom:=100;
//  sg.Selection:=gr;
end;

procedure TFrmMain.btnRefreshClick(Sender: TObject);
var
  ms  : TMemoryStatus;
//  mbi : TMemoryBasicInformation;
  adr, PrevAdr: cardinal;
  buf : array [0..255] of char;

  FreeSize,ReservSize,CommitSize: Cardinal;
  _type: string;
  i,j : integer;//k, m
  mbS: TMemoryBasicInformation;

  l1,l2,l3,l4,l5,l6 : integer;
begin
  ms.dwLength:=sizeof(TMemoryStatus);
  GlobalMemoryStatus(ms);
  lbl5.Caption:=IntTostr((ms.dwTotalPhys) div 1024)+' Кб';
  lbl6.Caption:=IntTostr((ms.dwAvailPhys) div 1024)+' Кб';
  lbl7.Caption:=IntTostr((ms.dwTotalPageFile) div 1024)+' Кб';
  lbl8.Caption:=IntTostr((ms.dwAvailPageFile) div 1024)+' Кб';
  lbl9.Caption:=IntTostr((ms.dwTotalVirtual) div 1024)+' Кб';//+IntTostr((ms.dwTotalVirtual) mod 1024);
  lbl10.Caption:=IntTostr((ms.dwAvailVirtual) div 1024)+' Кб';
  lbl11.Caption:=IntTostr(ms.dwMemoryLoad)+'%';

  lblr1.Hint:=lblr1.Caption;  lblr4.Hint:=lblr4.Caption;
  lblr2.Hint:=lblr2.Caption;  lblr5.Hint:=lblr5.Caption;
  lblr3.Hint:=lblr3.Caption;  lblr6.Hint:=lblr6.Caption;

  l1:=0;  l2:=0;  l3:=0;
  l4:=0;  l5:=0;  l6:=0;
{  lblr1.Caption:='0';  lblr4.Caption:='0';
  lblr2.Caption:='0';  lblr5.Caption:='0';
  lblr3.Caption:='0';  lblr6.Caption:='0';}

  adr:=0;  PrevAdr:=0;
{  for i:=1 to sg0.RowCount do
    sg0.Cells[1,i]:='';}
  sg0.RowCount:=2;

  i:=0; j:=0;

 while VirtualQuery(pointer(adr),mbi[i], sizeof(TMemoryBasicInformation))=sizeof(TMemoryBasicInformation) do begin
//    mbi[i]:=mbs;
    adr:=adr+mbi[i].RegionSize;

    if mbi[i].State=MEM_RESERVE then begin
      inc(ReservSize,mbi[i].RegionSize);
      inc(l2);//lblr2.Caption:=IntToStr(StrToInt(lblr2.Caption)+1);
    end
    else
      if mbi[i].State=MEM_COMMIT then begin
        inc(CommitSize,mbi[i].RegionSize);
        inc(l3);//lblr3.Caption:=IntToStr(StrToInt(lblr3.Caption)+1);
      end
      else
        if (mbi[i].State=MEM_FREE)  then  begin
          inc(FreeSize,mbi[i].RegionSize);
          inc(l1);//lblr1.Caption:=IntToStr(StrToInt(lblr1.Caption)+1);
        end;

    if adr < Cardinal(si.lpMaximumApplicationAddress) then inc(l4)//;lblr4.Caption:=IntToStr(StrToInt(lblr4.Caption)+1)
    else inc(l5);//lblr5.Caption:=IntToStr(StrToInt(lblr5.Caption)+1);
    inc(i);
{  end
    else begin
      inc(FreeSize,mbi[i].RegionSize);
      lblr1.Caption:=IntToStr(StrToInt(lblr1.Caption)+1);
      if adr<Integer(si.lpMaximumApplicationAddress) then lblr4.Caption:=IntToStr(StrToInt(lblr4.Caption)+1)
      else lblr5.Caption:=IntToStr(StrToInt(lblr5.Caption)+1);
    end;}
  end;

    for j:=1 to i do begin
      if mbi[j-1].State=MEM_RESERVE then _type:='Reserve'
      else
        if mbi[j-1].State=MEM_COMMIT then _type:='Commit'
        else
          if mbi[j-1].State=MEM_FREE then _type:='free';
      sg0.RowCount:=sg0.RowCount+1;
      sg0.Cells[0,j]:=IntToStr(j);
      sg0.Cells[1,j]:=IntToHex(cardinal(mbi[j-1].BaseAddress),8);
      sg0.Cells[3,j]:=IntToHex(mbi[j-1].RegionSize,8);//размер
      sg0.Cells[4,j]:=_type;
      GetModuleFileName(Cardinal(mbi[j-1].BaseAddress),buf,sizeof(buf));
      if length(string(buf))>0 then
        inc(l6);//lblr6.Caption:=IntToStr(StrToInt(lblr6.Caption)+1);
      sg0.Cells[2,j]:=string(buf);
    end;

//  sg0.Cells[3,i]:=IntToHex(Adr-PrevAdr,8);//размер
//  sg0.Cells[3,0]:='Размер';
///LARGEADDRESSAWARE
  lblr1.Caption:=IntToStr(l1);  lblr2.Caption:=IntToStr(l2);
  lblr3.Caption:=IntToStr(l3);  lblr4.Caption:=IntToStr(l4);
  lblr5.Caption:=IntToStr(l5);  lblr6.Caption:=IntToStr(l6);

  sg0.Rows[i+1].Clear;
  lbl_1.Hint:=lbl_1.Caption;
  lbl_2.Hint:=lbl_2.Caption;
  lbl_3.Hint:=lbl_3.Caption;

  lbl_1.Caption:=IntToStr(FreeSize div 1024)+' Кб';
  lbl_2.Caption:=IntToStr(ReservSize div 1024)+' Кб';
  lbl_3.Caption:=IntToStr(CommitSize div 1024)+' Кб';
end;

procedure TFrmMain.btnExecClick(Sender: TObject);
Var
  lpStartupInfo : TStartupInfo;
  lpProcInfo: TprocessInformation;
begin
  If dlgOpen.Execute then begin
    FillChar(lpStartupInfo, Sizeof(lpStartupInfo),#0);
    lpStartupInfo.cb :=sizeof (lpStartupInfo);
    lpStartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
    lpStartupInfo.wShowWindow:=SW_SHOWNORMAL;
    if not CreateProcess (pchar(dlgOpen.FileName), nil, nil, nil, false,
         NORMAL_PRIORITY_CLASS, nil, nil, lpStartupInfo, lpProcInfo)
    then ShowMessage ('Ошибка '+inttostr(GetLastError))
    else begin
//      WaitForSingleObject (lpProcInfo.hProcess,100);
      CloseHandle (lpProcInfo.hProcess);
    end;
  end;
end;

///////////////////////////////////////////////////////////////////

procedure TFrmMain.btnReservClick(Sender: TObject);
var
  adr: cardinal;
//  p:pointer;
begin
  if ledSize.Text='' then begin showmessage('Введите размер'); exit end;
  if ledAdr.Text='' then adr:=0
  else adr:=HexToInt64(ledAdr.Text);
//  lbl_3.Caption:=IntTostr(adr);
  adr:=Cardinal(VirtualAlloc(Pointer(adr),StrToInt64(ledSize.Text)*1024,
    MEM_RESERVE,PAGE_READONLY));
  if adr=0 then ShowMessage('Невозможно зарезервировать память')
  else ledAdr.Text:=IntToHex(adr,8);
end;

procedure TFrmMain.btnAllocClick(Sender: TObject);
var
  adr: dword;
begin
  if ledSize.Text='' then begin showmessage('Введите размер'); exit end;
  if ledAdr.Text='' then adr:=0
  else adr:=HexToInt64(ledAdr.Text);
  adr:= cardinal(VirtualAlloc(Pointer(adr),StrToInt64(ledSize.Text)*1024,
    MEM_COMMIT,PAGE_READONLY));
  if adr=0 then ShowMessage('Невозможно спроецировать память')
  else ledAdr.Text:=IntToHex(adr,8);
end;

procedure TFrmMain.btnReturnClick(Sender: TObject);
var
  adr,size: dword;
begin
  if ledSize.Text<>'' then size:=StrToInt64(ledSize.Text)*1024
  else size:=0;
  if ledAdr.Text='' then adr:=0
  else adr:=HexToInt64(ledAdr.Text);
  if VirtualFree(Pointer(adr),size,
    MEM_RELEASE)=false then ShowMessage('Невозможно вернуть память');
end;

procedure TFrmMain.btnFreeClick(Sender: TObject);
var
  adr,size: dword;
begin
  if ledSize.Text<>'' then size:=StrToInt64(ledSize.Text)*1024
  else size:=0;
  if ledAdr.Text='' then adr:=0
  else adr:=HexToInt64(ledAdr.Text);
  if VirtualFree(Pointer(adr),size,//StrToInt64(ledSize.Text)*1024
    MEM_DECOMMIT)=false then ShowMessage('Невозможно освободить память');
end;

///////////////////////////////////////////////////////////////////
function TFrmMAin.HexToInt64(hex: string): cardinal;
const
 zmax=15;
 znak:array[0..zmax]of char = ('0','1','2','3','4','5','6','7',
                               '8','9','A','B','C','D','E','F');
var
 i,j,l: integer;
 res : cardinal;

  Function step(x,n:Cardinal): Cardinal; {^}
  var i,p: cardinal;
  begin
   if x=0 then p:=0
   else begin
      p:=1;   for i:=1 to n do  p:=p*x;
   end;
   step:=p;
  end;

begin
//  res:=step(10,2);

  res:=0; l:=length(hex);           //перевод из b в 10
  for i:=l downto 1 do
    for j:=0 to 15 do
      if hex[i]=znak[j] then  res:=res+(j*step(16,l-i));
  HexToInt64:=res;
end;



///////////////////////////////////////////////////////////////////////////
procedure TFrmMain.Button6Click(Sender: TObject);
var
  hh: THandle;
  adr:cardinal;
begin
  if ledWCount.Text='' then begin ShowMessage('Введите количество'); exit; end;
//  if (ledECount.Text='')or(ledESize.Text='') then exit;
  hh:=GetProcessHeap();
  //HEAP_ZERO_MEMORY
  adr:=cardinal(HeapAlloc(hh,8,StrToInt(ledWCount.Text)*2));
  if adr=0 then ShowMessage('1')
  else ledHAdr.Text:=IntToHex(adr,8);
end;


procedure TFrmMain.Button8Click(Sender: TObject);
var
  hh: THAndle;
  size: cardinal;
  adr:cardinal;
begin
  if (ledECount.Text='') then begin ShowMessage('Введите количество'); exit; end;
  if (ledESize.Text='') then begin ShowMessage('Введите размер'); exit; end;
  size:=StrToInt(ledECount.Text)*strtoint(ledESize.Text);
  hh:=HeapCreate(0,size,0);
  adr:=cardinal(HeapAlloc(hh,8,size));
  if adr=0 then ShowMessage('1')
  else ledHAdr.Text:=IntToHex(adr,8);
end;


{
  В Windows 2000, запущенной с ключом /3GB приложению отдаётся в
распоряжение 3 Гб адресного пространства вместо двух - ядро
загружается с минимальным набором ресурсов и тем самым предоставляет
адресное пространство от 80000000 до BFFFFFFF любому приложению,
способному его использовать.
}

////////////////////////////////////////////////////////////
{procedure TFrmMain.CreateArrayOfProcInfo();
//найти все процессы
var
  PE: TProcessEntry32;
  n : word;
begin
  n:=0;
  SH:=CreateToolHelp32SnapShot(Th32cs_SnapAll, 0);
  pe.dwSize:=sizeof(PE);//без этого она до определённого момента работала!?
  Process32First(SH, PE);
  repeat
    SetLength(pNew,n+1);
    pNew[n].pe:=PE;
    pNew[n].new:=true;
    inc(n);
  until not Process32Next(SH, PE);
  CloseHandle(SH);
end;
/////////////////////////////////////////////////////////////////////
}
end.


PM MAIL   Вверх
Barabeo
Дата 16.10.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Народ подскажите хоть чё нибудь,как переделать под С++ функцию function TFrmMAin.HexToInt64?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.