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;
}

解决方案 »

  1.   

    把CFile用TFileStream试一下,其他好象都没有什么难度
      

  2.   

    const
      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代替了,你自己测试一哈
      

  3.   

    按C程序写了一个,对与否你测试一下
    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;
      

  4.   

    //测试通过,上面有n多错
    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;
      

  5.   

    to:lonoaer() 
    move(pSend, pchar(strCMD)^, nCmdLen);  //这个有错,跟我开始一样,如果pSend是pchar类型,要写成
    move(pSend^, pchar(strCMD)^, nCmdLen);
    如果是array [0..100] of char,就可以(后面的类同)
    另外,不能用pSend加,因为最后 freemem(pSend);要错
    还有,我只比你慢了几分钟,我们写的几乎一样
      

  6.   

    是的,如果用了pSend := pSend+xxxxxxx的话其指针移动,如果在结尾把它还原还是一样的
    可惜,我的电脑上面没有*.jpg文件要不然可以测试一下。
      

  7.   

    找到一个*.jpg
    在VC和DELPHI里面都测试了一下,该段代码都不能成功的读取文件的内容。
    发现如果说文件的内容开始如果为‘ ’或者#0等等,用PCHAR则不能成功读取
    而用CHAR BUF[INT]则可以
      

  8.   

    我估计你看错了,我作以下测试,就按你所说:
    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>
      

  9.   

    在VC中,同样,要显示pSend的内容不能简单的将它用MessageBox等显示字符的方式输出,因为VC的字串以0结束,你要看它的内存或将它存到二进制文件就知了
      

  10.   

    to keiy() 
    用你说的方法查看了一下,我们程序都是对的,我的确只是简单的用查看字符串的方式看了一下,就妄下结论,嘿嘿,又学习了一下。