是不是fun(srcData:Pointer;srcLen:Longword;tagData:Pointer;tagLen:PLongword);?
我这样写,但在函数中
    ms:=TMemoryStream.Create();
    ms.Write(srcData,srcLen);
运行时write报错,错误信息看不懂,好像是内存错。src和tag两个缓冲区并没有特别意义,只是某一块内存。
调用:
buf1,buf2:array[0..100] of char;
len1,len2:Longword;
fun(@buf1[0],len1,@buf2[0],@len2);

解决方案 »

  1.   

    fun(var strData: String;long strLen; var tagData: String;var long tagLen);
      

  2.   

    fun(var strData: String; strLen: long; var tagData: String;var tagLen: long);
    不好意思刚睡醒-_-#
      

  3.   

    fun(srcData: PChar; srcLen: Longint; tagData: PChar; var tagLen: Longint);
    ------------------------------------------
    var
      buf1,buf2:array[0..100] of char;
      len1,len2:Longint;
    begin  ...
      fun(buf1,len1,buf2,len2);end;
      

  4.   

    谢谢,刚才的错误好像是出在write上,出错时srcLen比较大(当然srcData的空间也比较大),不是100,好像是100万时,write出错。
    仔细试了一下,当len1(也就是srcLen)大于4608,即0x1200时报错,反之无错,为什么?ms是函数内的局部变量。
      

  5.   

    函数中
    try
    begin
        ms:=TMemoryStream.Create();
        ms.Write(srcData,srcLen);
        ms.Position:=0;
    end;
    except
        i:=GetLastError();
        ShowMessage(IntToStr(i));
    end;
    结果ShowMessage显示0,到底是什么错误呀?
      

  6.   

    这么写就 ok 了:ms.Write(srcData^, srcLen);
      

  7.   

    谢谢,为什么要这样?srcData不是指针吗?而write函数不就是需要一个缓冲区的指针吗?
      

  8.   

    procedure TForm1.fun(srcData: PChar; srcLen: LongInt; tagData: PChar; var tagLen: LongInt);
    var
      ms: TMemoryStream;
    begin  ms := TMemoryStream.Create;
      ms.Write(srcData,srcLen);
      ms.Free;end;procedure TForm1.FormCreate(Sender: TObject);
    var
      buf1,buf2:array[0..100000] of char;
      len1,len2:Longint;
    begin  len1 := 100000;
      fun(buf1,len1,buf2,len2);end;
    以上代码可以正常运行,如果你buf开了100万,运行的时候出错在内存申请的时候,不在ms.write
      

  9.   

    Write 的第一个参数是 var Buffer; <--- 注意:无类型
    但是,Buffer 是个实参,其实就是以指针的形式传参。表示:缓冲区起始地址为 Buffer 的起始地址。所以,应写为
    ms.Write(srcData^, srcLen);
      

  10.   

    to lynmison(菻梓) :
     
    此代码有可能正常运行(不出访问异常),但是,数据对吗?不防修改一下 buf1 试试看。
      

  11.   

    呵呵,你说的是,write第一个参数是const buff,所以直接写
    ms.Write(srcData,srcLen)是错误的,可以这样写
    ms.Write(srcData[0],srcLen)或者如你的代码ms.Write(srcData^,srcLen)
      

  12.   

    谢谢大家,仔细看了cb和delphi中有关Stream的write和read方法,确实是有差别的,以前没有注意。我的buf定义没有写在函数内部,那样确实在内存申请时就会报错,如何在函数内部申请这种很大的缓冲区变量,如果函数内部定义
    buf:array of char;
    函数中再SetLength(buf,1000000);那么ms.Read(buf,ms.size);就会出错,这是怎么回事?
      

  13.   

    这么写试试:
      ms.Position := 0; 
      ms.Read(buf[0], ms.size);
      

  14.   

    呵呵,刚说的错误就又犯了,写成ms.Read(buf[0], ms.size);就可以了,但写成ms.Read(buf^, ms.size);编译不通过,提示Pointer type required