Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
14-33755
Экселенц
2003-08-24 07:26
2003.09.11
бесплатный helpmaker


9-33418
TWINk
2003-03-04 16:33
2003.09.11
Shoot!


14-33749
Marser
2003-08-20 21:30
2003.09.11
Довольно полный список


9-33415
MeF88
2003-03-06 10:42
2003.09.11
Когда ж будет реальный GLScene


4-33839
Antipich
2003-07-12 15:14
2003.09.11
Как сэмулировать нажатие Ctrl+V





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский