使用内存映射查找文件,在Windows2000下正常,在Windows98下却会出内存错误的代码,请大家指点!谢谢啦!(100分)

  • 主题发起人 主题发起人 zbsfg
  • 开始时间 开始时间
Z

zbsfg

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的代码是Delphi 5开发人员指南中的一段,在Windows2000下正常,在
Windows98下却会出内存错误

procedure TMainForm.btnSearchClick(Sender: TObject);
var
MemMapFile: TMemMapFile;
SearchRec: TSearchRec;
RetVal: Integer;
FoundStr: PChar;
FName: String;
FindString: String;
WordCount: Integer;
begin
memFileText.Lines.Clear;
btnFindNext.Enabled := False;
lbFilesFound.Items.Clear;
RetVal := FindFirst(dlbDirectories.Directory+'/*.txt', faAnyFile, SearchRec);
try
while RetVal = 0 do
begin
FName := SearchRec.Name;
MemMapFile := TMemMapFile.Create(FName, fmOpenRead, 0, True);
try
FindString := edtSearchString.Text;
WordCount := 0; // Initialize the WordCount to zero
//就是下面这句在2000和NT中正常,在98中出错
FoundStr := StrPos(PChar(MemMapFile.Data), PChar(FindString));
if FoundStr <> nil then
begin
//找到
end;
RetVal := FindNext(SearchRec);
finally
MemMapFile.Free; { Free the memory mapped file instance }
end;
end;
finally
FindClose(SearchRec);
end;
end;
 
MemMapFile.Data 我想问题应该是在这儿 请把例子说的详细一点。
 
[Delphi 5开发人员指南]中的例子,它只是把一些功能集成了一下,据说是WIN98和WIN2000对
内存处理机制不同造成的,在WIN98中要用独占方式,可我试了一下也不行.
奇怪的是,如果我在调试时如果一句一句的执行,却又成功的.如果我将出错的信息忽略,也能
找出2条符合条件的记录
代码如下:
try
//就是下面这句在2000和NT中正常,在98中出错
FoundStr := StrPos(PChar(MemMapFile.Data), PChar(FindString));
except
end;
 
按记忆修改了一些,您自己编译一下看能不能通过.
procedure TMainForm.btnSearchClick(Sender: TObject);
var
MemMapFile: TMemMapFile;
SearchRec: TSearchRec;
RetVal,WordCount,FoundPos: Integer;
FName,FindString,Buffer: String;
begin
memFileText.Lines.Clear;
btnFindNext.Enabled := False;
lbFilesFound.Items.Clear;
FindString := edtSearchString.Text;
RetVal := FindFirst(dlbDirectories.Directory+'/*.txt', faAnyFile, SearchRec);
try
while RetVal = 0 do
begin
FName := SearchRec.Name;
MemMapFile := TMemMapFile.Create(FName, fmOpenRead, 0, True);
try
WordCount := 0; // Initialize the WordCount to zero
SetLength(Buffer,MemMapFile.Size);
FileRead(MemMapFile.FileHandle,Pointer(Buffer)^,MemMapFile.Size);
Foundpos:=Pos(FindString,Buffer);
if Foundpos <> 0 then
begin
//找到
end;
RetVal := FindNext(SearchRec);
finally
MemMapFile.Free; { Free the memory mapped file instance }
end;
end;
finally
FindClose(SearchRec);
end;
end;
 
谢谢,我试试
 
行了,多谢
Foundpos:=Pos(FindString,Buffer);
if Foundpos <> 0 then
begin
//找到
end;
 
后退
顶部