Текущий архив: 2003.09.11;
Скачать: CL | DM;
Вниз
CreateFileMapping всё работает просто замечтательно, почти. Найти похожие ветки
← →
3223(jab) (2003-07-14 12:15) [0]Мне нужно было в одном файле найтиадреса смещений ресурсов... Для этого можно конечно тупо перебрать все байты в файле. Вот я послушался совета знатаков и использовал для этого АПИ функции и получилось достаточно не плохо.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
ListView1: TListView;
procedure Fin(const OldName: string; b1,b2,b3,b4: Char);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
type
PByteArray = ^TByteArray;
TByteArray = array[0..10192111] of Byte;
{$R *.DFM}
procedure TForm1.Fin(const OldName: string; b1,b2,b3,b4: Char);
var
HFile, HMap: THandle;
PView: PByteArray;
Size, i: integer;
s1,s2,s3,s4: Byte;
lvItem : TListItem;
begin
s1 := Ord(b1);
s2 := Ord(b2);
s3 := Ord(b3);
s4 := Ord(b4);
HFile := FileOpen(OldName, fmOpenRead);
if HFIle <> INVALID_HANDLE_VALUE then
begin
Size := GetFileSize(HFile, nil);
HMap := CreateFileMapping(HFile, nil, PAGE_READONLY, 0, 0, nil);
if HMap > 0 then
begin
PView:= MapViewOfFile(HMap, FILE_MAP_READ, 0, 0, Size);
if PView <> nil then
begin
for i := 0 to Size - 1 do
begin
if (PView[i]=s1) and (PView[i+1]=s2) and (PView[i+2]=s3) and (PView[i+3]=s4) then
if PView[i]=s1 then
begin
lvItem:=ListView1.Items.Add;
with lvItem do begin
caption:="wave";
subitems.Add(IntToStr(i-8));
end;
end;
end;
UnMapViewOfFile(PView);
end;
CloseHandle(HMap);
end;
( HFile) Мне нужно было в одном файле найтиадреса смещений ресурсов... Для этого можно конечно тупо перебрать все байты в файле. Вот я послушался совета знатаков и использовал для этого АПИ функции и получилось достаточно не плохо.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
ListView1: TListView;
procedure Fin(const OldName: string; b1,b2,b3,b4: Char);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
type
PByteArray = ^TByteArray;
TByteArray = array[0..10192111] of Byte;
{$R *.DFM}
procedure TForm1.Fin(const OldName: string; b1,b2,b3,b4: Char);
var
HFile, HMap: THandle;
PView: PByteArray;
Size, i: integer;
s1,s2,s3,s4: Byte;
lvItem : TListItem;
begin
s1 := Ord(b1);
s2 := Ord(b2);
s3 := Ord(b3);
s4 := Ord(b4);
HFile := FileOpen(OldName, fmOpenRead);
if HFIle <> INVALID_HANDLE_VALUE then
begin
Size := GetFileSize(HFile, nil);
HMap := CreateFileMapping(HFile, nil, PAGE_READONLY, 0, 0, nil);
if HMap > 0 then
begin
PView:= MapViewOfFile(HMap, FILE_MAP_READ, 0, 0, Size);
if PView <> nil then
begin
for i := 0 to Size - 1 do
begin
if (PView[i]=s1) and (PView[i+1]=s2) and (PView[i+2]=s3) and (PView[i+3]=s4) then
if PView[i]=s1 then
begin
lvItem:=ListView1.Items.Add;
with lvItem do begin
caption:="wave";
subitems.Add(IntToStr(i-8));
end;
end;
end;
UnMapViewOfFile(PView);
end;
CloseHandle(HMap);
end;
FileClose(HFile);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Fin("c:\Sfx.res","W","A","V","E");
end;
end.
Работает очень быстро (по сравнению с asignfile и перебором баитов). А проблема возникла с TByteArray = array[0..10192111] of Byte; по умолчанию меня не устраивает его размер, по этой причине я переопределяю тип... Можно ли как то в программе организовать автоматически переопределение размера массива в зависимости от Size??? Если можно напишите плиз, а то голова очень бобо и не работает...
← →
MBo (2003-07-14 12:25) [1]2 гига хватит?
PByteArray = ^TByteArray;
TByteArray = array[0..$3FFFFFFF] of Byte;
BTW, можно и оставить определение PByteArray из Sysutils
← →
3223(jab) (2003-07-14 12:33) [2]to MBo
Вообще наверно хватит! :) Просто я хотел динамически менять этот размер... у меня не получилось. Я так понимаю, нужно создать массив нужного мне размера of byte и получить его pointer всё вроде очень просто, но у меня не получилось с ним что то ...
← →
MBo (2003-07-14 12:40) [3]да не нужно вообще этот размер менять!
Ты ведь не выделяешь память под массив, а только используешь удобное приведение типа, так что это может волновать только с точки зрения Range Checking, которое обычно отключено.
← →
3223(jab) (2003-07-14 12:44) [4]хм... ок спасибо!
Страницы: 1 вся ветка
Текущий архив: 2003.09.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c