很急!帮忙把这段C代码转成DELPHI代码(200分)

  • 主题发起人 主题发起人 kaiery
  • 开始时间 开始时间
K

kaiery

Unregistered / Unconfirmed
GUEST, unregistred user!
void CHD_DemoDlg::OnButtonReadfile()
{
// TODO: Add your control notification handler code here
int status;
HANDLE hHandle;
DWORD FileID;
DWORD dwOffset;
BYTE rData[1024]; // 存放读到的数据
DWORD rDataLen;
FILE *fp;
// 打开设备
status = HSConnectDev("USB1", &hHandle);
if (status != 0)
{
MessageBox("打开设备失败");
return;
}
// 读文件
FileID = 0x0007; // 要读取的文件的标识
dwOffset = 0; // 偏移量(0表示从文件头开始读起)
memset(rData, 0, sizeof(rData));
rDataLen = 80;// 要读取80个字节的数据(输入时表示要读取的数据量, 输出时返回实际读取到的数据量)
status = HSReadFile(hHandle, FileID, dwOffset, rData, &rDataLen);
if (status != 0)
{
HSDisconnectDev(hHandle);
MessageBox("读文件失败");
return;
}
// 关闭设备
HSDisconnectDev(hHandle);
// 文件保存在c:/Outtxt.txt下
if ((fp = fopen("c://Outtxt.txt", "wb")) != NULL)
{
fwrite(rData, sizeof(BYTE), rDataLen, fp);
fclose(fp);
}

MessageBox("读取文件成功, 文件保存在了c://Outtxt.txt中", "提示", MB_OK|MB_ICONINFORMATION);
==============================================================================
我转的代码是:
procedure TForm1.Button5Click(Sender: TObject);
var
// FileID:integer;
dwOffset:DWORD;
rData:pbyte;
rDataLen:DWORD;
dwcount3:dword;
begin
status:=HSConnectDev('USB1',@hHandle);
if status<>0 then
begin
showmessage('打开设备失败');
exit;
end;
//读文件
FileID :=strtoint(edit2.text); // 要读的文件的标识
showmessage(inttostr(fileid));
dwOffset:=0; // 偏移量(0表示从文件头开始写起)
rDataLen:=80;
GetMem(rData,1024);
status:=HSReadFile(hHandle,FileID,dwOffset,rData,@rDataLen);
showmessage('状态:'+inttostr(status));
if status=0 then
begin
showmessage('读出成功') ;
hTargetFile := CreateFile(PCHAR('c:/myout.txt'),
GENERIC_WRITE,
FILE_SHARE_READ,
nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
if not boolean(WriteFile(hTargetFile,rData^,rDataLen,dwcount3,nil)) then
begin
showmessage('把USB-KEY中的文件读出写入硬盘中的文件错误!');
exit;
end;
CloseHandle(hTargetFile);//关闭文件;
HSDisconnectDev(hHandle);
end
else
begin
showmessage('读操作失败');
HSDisconnectDev(hHandle);
end;
end;

这段读出来的内容 根本不是 我写进去的内容 ,是哪弄错了啊?
哪位大侠 帮我一下
 
WriteFile(hTargetFile,rData^,rDataLen,dwcount3,nil);
-->> rData^是不是应该为rData
 
刚才测试了,不报错,也可以读出来,但是内容不正确,跟上次的内容也不一样,纯粹乱码,注:写进去的是纯文本
 
最好用英文测试,不要用中文测试!
 
最大可能就是文件指针不对,你可以调试一下看读文件时的rData和写文件时的rData是否一至
 
把你的HSReadFile的C和Pascal声明都发上来.怀疑翻译的有问题.
 
//文件结构定义
typedef struct _HS_FILEINFO
{
DWORD dwFileID;
DWORD dwDeleteRight;
DWORD dwReadRight;
DWORD dwWriteRight;
DWORD dwFileSize;
DWORD dwReserved1;
DWORD dwReserved2;
}HS_FILEINFO, *PHS_FILEINFO;
//读文件操作
//IN HANDLE hCard: 输入设备句柄
//IN DWORD dwFileIndex: 输入,文件ID
//IN DWORD dwOffset: 开始读数据的偏移量
//IN BYTE *pbData:返回读出的数据
//IN DWORD *pdwReadLen:输入时,表示要读的数据的长度,此时pbData应当已经分配内存;输出时,表示实际读出的数据的长度
//返回0成功,其他失败
HD_ADT_API DWORD WINAPI HSReadFile
(
IN HANDLE hCard,
IN DWORD dwFileIndex,
IN DWORD dwOffset,
OUT BYTE *pbData,
IN DWORD *pdwReadLen
);
///////////////////////////////////////////////////////////////////////
... ... ...
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
function HSConnectDev(szDevName:LPCSTR;phCard:pointer):DWORD;
stdcall ;
external 'HD_GPAPI.dll' ;
function HSDisconnectDev(phCard:pointer):dword;
stdcall ;
external 'HD_GPAPI.dll' ;
function HSWriteFile(hCard:pointer;dwFileIndex:DWORD;dwOffset:dword;pbData:pbyte;dwDataLen:dword):DWORD ;
stdcall ;
external 'HD_GPAPI.dll' ;
function HSCreateFile( hCard:pointer;
FileInfo:HS_FILEINFO):dword;
stdcall ;
external 'HD_GPAPI.dll';
function HSReadFile(hCard:pointer;dwFileIndex:DWORD;dwOffset:dword;pbData:pbyte;pdwReadLen:pdword):DWORD ;
stdcall ;
external 'HD_GPAPI.dll' ;
function HSGetTotalSize(hcard:pointer;totalsize:pdword):dword;
stdcall ;
external 'HD_GPAPI.dll';
function HSGetFreeSize(hcard:pointer;freesize:pdword):dword;
stdcall ;
external 'HD_GPAPI.dll';
function HSGetSerial(hCard:pointer;
pbSerial:pBYTE):dword;
stdcall ;
external 'HD_GPAPI.dll';
function HSHasFileExist(hcard:pointer;dwFileIndex:dword;pdwFileState:pdword):dword;
stdcall ;
external 'HD_GPAPI.dll';
function HSDeleteFile(hCard:pointer;dwFileIndex:dword ):dword;
stdcall ;
external 'HD_GPAPI.dll';
var
status:integer;
hHandle:pointer;
FileID:integer;
hTargetFile: THANDLE;
FileInfo:HS_FILEINFO;
//前面定义的结构类型
 
USB呀。顶
 
大家帮一下我啊。。。 急死了
 
rData:pbyte;
status:=HSReadFile(hHandle,FileID,dwOffset,rData,@rDataLen);
请帮我区分 byte 和pbyte
 
procedure TForm1.Button5Click(Sender: TObject);
var
// FileID:integer;
dwOffset:DWORD;
rData:array[0..1023]of byte;//我觉得应该这样定义,你试试看,
rDataLen:DWORD;
dwcount3:dword;
begin
 
pbyte是指针。
 
rData:array[0..1023]of byte;//
改成这句 编译有问题
GetMem(rData,1024);
 
定义成数组,当然不需要使用GetMem(rData,1024);分配内存。
 
后退
顶部