char strBuf[1024] = {0};
CFile file;
char* pReadbuf = NULL;
char* pSend = NULL;
long lSize = 0;
if(!file.Open("e:\\x1.jpg", CFile::modeRead | CFile::shareDenyWrite))
{
//_OutPut("打开文件失败\n");
}
else
{
lSize = file.GetLength();
pReadbuf = new char[lSize];
memset(pReadbuf, 0, lSize);
CString strCMD;
strCMD.Format("<ILAS>31;;T00516;%d;", lSize);
int nCmdLen = strlen(strCMD); file.ReadHuge(pReadbuf, lSize); //ADD ;</ILAS>
int nSendSize = nCmdLen + lSize + 8;
pSend = new char[nSendSize];
memset(pSend, 0, nSendSize);
memcpy(pSend, strCMD.GetBuffer(0), nCmdLen);
memcpy(pSend + nCmdLen, pReadbuf, lSize); char strTmp[] = ";</ILAS>"; memcpy(pSend + nCmdLen + lSize, strTmp, strlen(strTmp)); delete[] pReadbuf;
delete[] pSend;
}
CFile file;
char* pReadbuf = NULL;
char* pSend = NULL;
long lSize = 0;
if(!file.Open("e:\\x1.jpg", CFile::modeRead | CFile::shareDenyWrite))
{
//_OutPut("打开文件失败\n");
}
else
{
lSize = file.GetLength();
pReadbuf = new char[lSize];
memset(pReadbuf, 0, lSize);
CString strCMD;
strCMD.Format("<ILAS>31;;T00516;%d;", lSize);
int nCmdLen = strlen(strCMD); file.ReadHuge(pReadbuf, lSize); //ADD ;</ILAS>
int nSendSize = nCmdLen + lSize + 8;
pSend = new char[nSendSize];
memset(pSend, 0, nSendSize);
memcpy(pSend, strCMD.GetBuffer(0), nCmdLen);
memcpy(pSend + nCmdLen, pReadbuf, lSize); char strTmp[] = ";</ILAS>"; memcpy(pSend + nCmdLen + lSize, strTmp, strlen(strTmp)); delete[] pReadbuf;
delete[] pSend;
}
解决方案 »
- 安装DevExpress VCL 2011 后delphi启动有问题 清赐教
- 我想在数据库access中动态的创建数据表,同时以日期时间为数据表的名字
- 新人报到,连开三贴之二,来者有分
- 调查(不容错过哦):Delphi是否可以做基于Soap/webservice的大型应用(110分!)
- IntraWeb中如何使用OCX或者TSocketClient?
- 屏幕上窗体位置设置,不让所有普通窗体对大化后到达屏幕最顶端
- 如何用ADO联结Paradox的数据表?
- 怎样实现分类操作?(答完另外加80分)谢谢。
- 关于ExpressQuantumGrid的一个问题,取单元格里的内容
- 关于BLOB字段问题,高分赠送.
- 用StringGrid实现多条纪录一次性输入,可否在单元格中实现下拉列表的效果?
- 如何将插入oracle数据库的number字段的数值保留小数点后两位?
strTmp = ';</ILAS>';
var
pReadBuf,
pSendBuf: PChar;
AFileStream: TFileStream;
strCMD: String;
lSize: LongWord;
nCmdLen: Integer;
nSendsize: Integer;
aPath: String;
begin
aPath := 'c:\aaaa.TXT';
if Not FileExists(aPath) then exit; AFileStream := TFileStream.Create(APath, fmOpenRead or fmShareDenyWrite);
try
lSize := AFileStream.Size; pReadBuf := AllocMem(lSize);
try
ZeroMemory(pReadBuf, lSize);
AFileStream.Position := 0;
AFileStream.ReadBuffer(pReadBuf^, lSize);
strCMD := Format('<ILAS>31;;T00516;%d;', [lSize]);
nCmdLen := Length(strCMD); nSendsize := nCmdLen + lSize + 8; pSendBuf := AllocMem(nSendsize);
try
ZeroMemory(pSendBuf, nSendSize);
CopyMemory(pSendBuf, @strCMD[1], nCmdLen);
CopyMemory(pSendBuf+nCmdLen, pReadBuf, lSize); CopyMemory(pSendBuf+nCmdLen+lSize, @strTmp[1], Length(strTmp));
finally
FreeMem(pSendBuf);
pSendBuf := Nil;
end;
finally
FreeMem(pReadBuf);
pReadBuf := Nil;
end;
finally
FreeAndNiL(AFileStream);
end;
因为我机器上找*.jpg文件,所以就用TXT代替了,你自己测试一哈
procedure TForm1.Button1Click(Sender: TObject);
var
filem:tmemorystream;
pReadbuf:pchar;
pSend:pchar;
lSize:dword;
strCMD:String;
nCmdLen, nSendSize:integer;
strTmp:pchar;begin
filem:=tmemorystream.Create;
try
filem.LoadFromFile('e:\\x1.jpg');
except;
ShowMessage('打开文件失败');
exit;
end;
filem.Position:=0; lSize := filem.Size;
getmem(pReadbuf, lSize);
Fillchar(pReadbuf, lSize,0); strCMD:=Format('<ILAS>31;;T00516;%d;', [lSize]);
nCmdLen := length(strCMD); filem.Read(pReadbuf, lSize);
nSendSize := nCmdLen + lSize + 8;
getmem(pSend,nSendSize);
fillchar(pSend, nSendSize,0); move(pSend, pchar(strCMD)^, nCmdLen);
pSend:=pSend+nCmdLen;
move(pSend , pReadbuf, lSize); strTmp := ';</ILAS>'; pSend:=pSend+ lSize;
move(pSend, strTmp, strlen(strTmp));
freemem(pReadbuf);
freemem(pSend);end;
procedure TForm1.Button1Click(Sender: TObject);
var
filem:tmemorystream;
pReadbuf:pchar;
pSend:pchar;
lSize:integer;
strCMD:String;
nCmdLen, nSendSize:integer;
strTmp:pchar;
tmpp:pchar;begin
filem:=tmemorystream.Create;
try
filem.LoadFromFile('e:\x1.jpg');
except;
ShowMessage('打开文件失败');
exit;
end;
filem.Position:=0; lSize := filem.Size;
getmem(pReadbuf, lSize);
Fillchar(pReadbuf^, lSize,0); strCMD:=Format('<ILAS>31;;T00516;%d;', [lSize]);
nCmdLen := length(strCMD); filem.Read(pReadbuf^, lSize);
nSendSize := nCmdLen + lSize + 8;
getmem(pSend,nSendSize);
fillchar(pSend^, nSendSize,0); move( pchar(strCMD)^,pSend^, nCmdLen);
tmpp:=pSend+nCmdLen;
move( pReadbuf^,tmpp^ , lSize); strTmp := ';</ILAS>'; tmpp:=tmpp+ lSize;
move( strTmp^, tmpp^,strlen(strTmp));
freemem(pReadbuf);
freemem(pSend);
filem.Free;end;
move(pSend, pchar(strCMD)^, nCmdLen); //这个有错,跟我开始一样,如果pSend是pchar类型,要写成
move(pSend^, pchar(strCMD)^, nCmdLen);
如果是array [0..100] of char,就可以(后面的类同)
另外,不能用pSend加,因为最后 freemem(pSend);要错
还有,我只比你慢了几分钟,我们写的几乎一样
可惜,我的电脑上面没有*.jpg文件要不然可以测试一下。
在VC和DELPHI里面都测试了一下,该段代码都不能成功的读取文件的内容。
发现如果说文件的内容开始如果为‘ ’或者#0等等,用PCHAR则不能成功读取
而用CHAR BUF[INT]则可以
x1.jgp的内容为:
00 60 27 88 88 // 十六进制,以#00开头+`'后面的$88 $88为结束标记:
在 freemem(pSend);上加断点,pSend的结果为:
$3C $49 $4C $41 $53 $3E $33 $31 $3B $3B $54 $30 $30 $35 $31 $36 $3B $36 $3B $00 $60 $27 $88 $88 $88 $3B $3C $2F $49 $4C $41 $53 $3E $00
你不能用字符显示的方式,要用pSend,100m这样的方式或在cpu调试窗口它的内容
00CE3850 3C 49 4C 41 53 3E 33 31 3B 3B 54 30 <ILAS>31;;T0
00CE3860 30 35 31 36 3B 36 3B 00 2A 00 00 00 3C 49 4C 41 0516;6;.*...<ILA
00CE3870 53 3E 33 31 3B 3B 54 30 30 35 31 36 3B 36 3B 00 S>31;;T00516;6;.
00CE3880 60 27 88 88 88 3B 3C 2F 49 4C 41 53 3E `'垐?</ILAS>
用你说的方法查看了一下,我们程序都是对的,我的确只是简单的用查看字符串的方式看了一下,就妄下结论,嘿嘿,又学习了一下。