当前位置:主页>销售管理软件> 列表

WriteFile函数写硬盘时会出错,帮我看看原因 找用友软件反记账

仓库管理软件版1楼: Function OpenHDD(deviceName:String):THandle;
begin
Result := CreateFile(Pchar(deviceName),GENERIC_WRITE or GENERIC_READ,0, nil, OPEN_EXISTING, 0, 0);
end;

Function CloseHDD(dev: THandle):Boolean;
begin
if CloseHandle(dev) then
begin
dev := INVALID_HANDLE_VALUE;
Result := True;
end else
Result := False;
end;


procedure WritePhysicsDisk(Const DiskID: Integer);
var
DeviceName: String;
dev: THandle;
StrLst: TStringList;
EndSector: DWORD;
begin
DeviceName := Format(''\\.\PHYSICALDRIVE%d'',[DiskID]);
dev := OpenHDD(DeviceName);
if dev <> INVALID_HANDLE_VALUE then
begin
//写硬盘制作信息
WriteHDDHeader(dev,EVHR_ATSECTOR);
//写只读文件
StrLst := TStringList.Create;
try
StrLst.Add(''d:\logo.img|1'');
StrLst.Add(''d:\Setup.ini|2'');
WriteRoFiles(dev,DataBLOCKS_STARTSECTOR,StrLst,EndSector);
//写可读写文件

WriteRwFiles(dev,EndSector,StrLst);
finally
StrLst.Free;
end;
CloseHDD(dev);
end;
end;


Function WriteHDDHeader(dev: Thandle; StartSector: DWord):Boolean;
var
hddinfo: EVHDDHeader;
dwCB: DWORD;
aa: Pchar;
begin
//zeroMemory(@hddinfo,Sizeof(hddinfo));
hddinfo.magicwords := EVHR_MAGICWORDS; //硬盘制作信息标志
hddinfo.evhddversion := $00010000; //版本号
hddinfo.evhdddesc := ''机顶盒单机版''; //机顶盒子硬盘描述文本
hddinfo.proddate := c_time(); //硬盘制作日期
hddinfo.produtil := ''硬盘制作工具1.0''; //硬盘制作工具文本描述
hddinfo.rodupshdr_startsector := RODH_STARTSECTOR; //硬盘制作起始只读始扇区描述
hddinfo.rodupshdr_sectors := RODH_SECTORS; //硬盘制作只读部份扇区数描述
hddinfo.rwdupshdr_startsector := RWDH_STARTSECTOR;
hddinfo.rwdupshdr_sectors := RWDH_SECTORS;
hddinfo.checksum := CalcChecksum(puint32(@hddinfo), sizeof(hddinfo)-sizeof(hddinfo.checksum)); //校验

//写硬盘制作头结构
SetFilePointer(dev,StartSector*512,nil,File_Begin);
dwCB := 0;
if WriteFile(dev, hddinfo, sizeof(hddinfo), dwCB, nil) then//[red]这里写不成功[/red]
Result := True
else
begin
aa := StrAlloc(1000);
Windows.FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,GetLastError,0,aa,1000,nil);
ShowMessage(aa);
StrDispose(aa);
Result := False;
end;
end;


我在C++Build中是可以的移植到delphi时WriteFile会不成功,错误是"参数错误",请高手帮帮忙

2楼: 有人知道原因吗?
帮帮忙 如用友软件反记账

3楼: C++代码我就看不太懂,但写文件有三个因素可以导致出错.
1,文件只读
2,系统保扩文件
3,被独占的文件.

4楼: 楼主的注释写着‘写只读文件’,文件只读你怎么写呢?请检查

5楼: 我是直接写的硬盘的,
其中硬盘被分为两个区一个是只读区,文件写上去后以后不会再改动了(一些系统文件,pmon文件等),另一个是可读写区,该区上的数据以后可更改.

不是写文件
不过我发现用WriteFile写pchar或pbyte类型的数据并且输入的长度等原申请(getmem)的长度时不会出错,若长度不相等就会报"参数错误",写其它的数据类型都会报"参数错误".但是在C++下面不会

6楼: 你怎么读呀,你看看你上面写的语句,你跑下来看看,能不出错吗,把你想读的语句重新写一下,语句不多,但是思路不够明确。