关于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;
            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);
还是有指针异常。
            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];
            
            PvPHTTP_FILTER_RAW_DATA^.cbInBuffer:=@Replace[1];
作者: sz_haitao 发布时间: 2011-10-26
             PvPHTTP_FILTER_RAW_DATA^.cbInBuffer:=@Replace[1];
能编译通过吗?
            能编译通过吗?
作者: xernet 发布时间: 2011-10-26
 相关阅读 更多  
      
    热门阅读
-   office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具 office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具阅读:74 
-   如何安装mysql8.0 如何安装mysql8.0阅读:31 
-   Word快速设置标题样式步骤详解 Word快速设置标题样式步骤详解阅读:28 
-   20+道必知必会的Vue面试题(附答案解析) 20+道必知必会的Vue面试题(附答案解析)阅读:37 
-   HTML如何制作表单 HTML如何制作表单阅读:22 
-   百词斩可以改天数吗?当然可以,4个步骤轻松修改天数! 百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!阅读:31 
-   ET文件格式和XLS格式文件之间如何转化? ET文件格式和XLS格式文件之间如何转化?阅读:24 
-   react和vue的区别及优缺点是什么 react和vue的区别及优缺点是什么阅读:121 
-   支付宝人脸识别如何关闭? 支付宝人脸识别如何关闭?阅读:21 
-   腾讯微云怎么修改照片或视频备份路径? 腾讯微云怎么修改照片或视频备份路径?阅读:28 















