+ -
当前位置:首页 → 问答吧 → 关于delphi ISAPI的替换网页内容。

关于delphi ISAPI的替换网页内容。

时间:2011-10-26

来源:互联网

代码片段:
var 
 pVPHTTP_FILTER_RAW_DATA: PHTTP_FILTER_RAW_DATA;
 Ipos:Integer;
 Replace:string;
begin
  PvPHTTP_FILTER_RAW_DATA := PHTTP_FILTER_RAW_DATA(pvNotification);
  Ipos:=pos('123',Pchar(PvPHTTP_FILTER_RAW_DATA^.pvInData));
  if(Ipos>0)
  begin
  Replace := StringReplace(Pchar(PvPHTTP_FILTER_RAW_DATA^.pvInData),
  '123','abc',[rfReplaceAll]);
  这样替换可以得到正确的显示结果,所有123的都替换成了abc,要替换的字符串和被替换的字符串长度都是3,如果改成
  Replace := StringReplace(Pchar(PvPHTTP_FILTER_RAW_DATA^.pvInData),
  '123','abcdef',[rfReplaceAll]);
  '123'的长度是3,'abcdef'的长度是6,那么替换就有提示是指针异常,很明显是长度溢出了。
  试图给PvPHTTP_FILTER_RAW_DATA^.pvInData分配内存ReallocMem(PvPHTTP_FILTER_RAW_DATA^.pvInData, Length(1024*1024*2));这样的空间已经够大了,还是提示指针异常,应该怎么样替换不一样长度的字符串呢?

  end;
end;

作者: xernet   发布时间: 2011-10-26

可能PvPHTTP_FILTER_RAW_DATA^还有其它field指明了pvInData的实际长度

作者: sz_haitao   发布时间: 2011-10-26

PHTTP_FILTER_RAW_DATA的结构里面的成员
 
  pvInData: Pointer; 数据指针 
  cbInData: DWORD; 数据大小 // Number of valid data bytes
  cbInBuffer: DWORD; 数据缓冲 // Total size of buffer 
  dwReserved: DWORD; 预留
经过测试cbInData和cbInBuffer的数值大小是一样的。
这样还是一样有错: 
  PvPHTTP_FILTER_RAW_DATA^.cbInData:=length(Replace);
  PvPHTTP_FILTER_RAW_DATA^.cbInBuffer:=length(Replace);
还是有指针异常。

作者: xernet   发布时间: 2011-10-26

Replace是个字符串吧
PvPHTTP_FILTER_RAW_DATA^.cbInBuffer:=@Replace[1];

作者: sz_haitao   发布时间: 2011-10-26

PvPHTTP_FILTER_RAW_DATA^.cbInBuffer:=@Replace[1];
能编译通过吗?

作者: xernet   发布时间: 2011-10-26