Delphi XE2 里面string 与 ansistring 转换导致kbmMW 的一个bug

    昨天本来准备写一个kbmMW 做webserver 的一个例子,可是在调试过程中发现不能正常显示图片文件。跟踪了很长时间

才发现是string 和 ansistring 在XE2 里面转换造成的问题,经过修改后,终于可以正常运行了。耽搁了半天时间,因此记录一下,

给同学们一个参考,以后在编程时注意一下。

  原来的程序代码是这样的:

procedure TkbmMWAJAXResponseTransportStream.InternalDeliver(const AInfo:IkbmMWCustomTransportInfo);var   i,j,k:integer;   s,sr:string;   // 注意,这一块原来定义的是string;   ba:TkbmMWBytes;   hlp,hlpReq:TkbmMWHTTPTransportStreamHelper;begin     hlp:=TkbmMWHTTPTransportStreamHelper(Helper);     hlpReq:=TkbmMWHTTPTransportStreamHelper(RequestTransportStream.Helper);

// Make sure we respond using same version as using for request.     hlp.HTTPVersion:=hlpReq.HTTPVersion;

// Check if to deliver XML Response or not.if not (Params.Values[KBMMW_AJAX_PARAMS_XMLRESPONSE]='1') thenbegin          // Check which HTTP header to send.if Self.IsError thenbegin               MimeType:='text/html';               s:=hlp.HTTPBuildErrorResponseHeaderFromStatusCode('',TkbmMWAJAXTransportStreamHelper(Helper).Header,                                                                                                     Self.StatusCode,Self.StatusText);               kbmMWDebugDumpString(mwdlAdvanced,mwdtTransport,kbmMWDebugWhere,'AJAX Response deliver HTML body',s);

AInfo.CloseConnectionAfterTransmit:=true;

ba:=kbmMWString2Bytes(AnsiString(s));               TProtTransport(Transport).DoTransmitBuffer(AInfo,ba,length(ba));endelsebegin               // If the result is an array, the first element is the header instead of us generating one.if not VarIsArray(Result) thenbegin                    // Send ok response with data.                    sr:=Result;   // result 原来的值是ansistring, 现在转换成string 类型了                    s:=hlp.HTTPBuildOKResponseHeader('',TkbmMWAJAXTransportStreamHelper(Helper).Header,length(sr))+sr;   //  length(sr)  是unicodestring 的长度,理论上<= ansistring 的值,因此封装是就使用了一个

// 一个错误的content-length, 导致客户端与服务器端的数据不一致。                    ba:=kbmMWString2Bytes(AnsiString(s));                    kbmMWDebugDumpString(mwdlAdvanced,mwdtTransport,kbmMWDebugWhere,'AJAX Response deliver HTML',s);                    TProtTransport(Transport).DoTransmitBuffer(AInfo,ba,length(ba));

下面是修改后的代码:

procedure TkbmMWAJAXResponseTransportStream.InternalDeliver(const AInfo:IkbmMWCustomTransportInfo);var   i,j,k:integer;   s,sr:ansistring; // 这一块使用ansistgring, 与原始的数据类型保持一致   ba:TkbmMWBytes;   hlp,hlpReq:TkbmMWHTTPTransportStreamHelper;begin     hlp:=TkbmMWHTTPTransportStreamHelper(Helper);     hlpReq:=TkbmMWHTTPTransportStreamHelper(RequestTransportStream.Helper);

// Make sure we respond using same version as using for request.     hlp.HTTPVersion:=hlpReq.HTTPVersion;

// Check if to deliver XML Response or not.if not (Params.Values[KBMMW_AJAX_PARAMS_XMLRESPONSE]='1') thenbegin          // Check which HTTP header to send.if Self.IsError thenbegin               MimeType:='text/html';               s:=hlp.HTTPBuildErrorResponseHeaderFromStatusCode('',TkbmMWAJAXTransportStreamHelper(Helper).Header,                                                                                                     Self.StatusCode,Self.StatusText);               kbmMWDebugDumpString(mwdlAdvanced,mwdtTransport,kbmMWDebugWhere,'AJAX Response deliver HTML body',s);

AInfo.CloseConnectionAfterTransmit:=true;

ba:=kbmMWString2Bytes(AnsiString(s));               TProtTransport(Transport).DoTransmitBuffer(AInfo,ba,length(ba));endelsebegin               // If the result is an array, the first element is the header instead of us generating one.if not VarIsArray(Result) thenbegin                    // Send ok response with data.                    sr:=Result;                    s:=hlp.HTTPBuildOKResponseHeader('',TkbmMWAJAXTransportStreamHelper(Helper).Header,length(sr))                                  //hlp.HTTPBuildOKResponseHeader  返回的是string, 而且是纯英文的,转换成ansistrng, 不会丢失数据。同时后面不能加sr, 不然的话,会把sr 又转换成string 了, 再转会到 ansistring, 就丢东西了
                    s:=s+sr; //  两个ansistring 相加, 保证数据类型一致,不产生隐形变换。                    ba:=kbmMWString2Bytes(s);

经过上面修改,系统可以正常在XE2 下运行了。当然在d2007 以前,原来的代码没有问题的,看来作者没有在d2009 以后的版本没有好好测试。

好隐蔽的bug, 浪费了我好几个小时。 特记之。

时间: 2024-07-31 06:47:51

Delphi XE2 里面string 与 ansistring 转换导致kbmMW 的一个bug的相关文章

Delphi 2009中string与Char的改变

在 Delphi 2009 中: string = UnicodeString; (同样: PString = PUnicodeString;) Char = WideChar; (同样: PChar = PWideChar;) 本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; t

C#中char[]与string之间的转换

  string 转换成 Char[] string ss = "abcdefg"; char[] cc = ss.ToCharArray(); Char[] 转换成string string s = new string(cc); 此外,byte[] 与 string 之间的装换 byte[] bb = Encoding.UTF8.GetBytes(ss); string s = Encoding.UTF8.GetString(bb); 下面我们利用 StringBuilder 来进

ORACLE绑定变量隐式转换导致性能问题

   年后一次系统升级后,监控数据库的工具DPA发现数据库的Total Wait时间突然飙增,如下截图所示,数据库的总体等待时间对比升级前飙增了非常多 另 外就是发现出现了较多的等待事件,主要有latch: cache buffers chains. latch: shared pool .db file scattered read.根据这边的监控发现TOP SQL里面从升级前的0次变为了一天的一万多次(有些甚至更多),分析过后我们就找开发人员了解一下系统升级变跟的内容和改动 开 发人员坚定的

java-JAVA 取值问题(Date和String,long转换)

问题描述 JAVA 取值问题(Date和String,long转换) SimpleDateFormat lst = new SimpleDateFormat("yyyy-MM-dd"); TransLogInfo transLogInfo = transLogInfoService.QueryTransLogInfo("intTxnDt"); String log = transLogInfo.getIntTxnDt(); Date logTime =lst.par

关于XML格式与String格式之间转换的问题

问题描述 关于XML格式与String格式之间转换的问题 打算把XML转换成String格式的发出去但是不知道怎么转换,而且收到String格式的时候怎么转换回XML,比如 000002小二班 小名男2 传输的时候用的是string格式,显示想用XML 解决方案 xml与string互转,方法有很多,又不知道你是用什么语言来实现,所以随便给你个java的一种实现吧.http://blog.csdn.net/sjdl9396/article/details/6869878 解决方案二: 不论什么语

C# Enum,Int,String的互相转换

原文:C# Enum,Int,String的互相转换 [C# Enum,Int,String的互相转换] 1.Enum-->String (1)利用Object.ToString()方法:如Colors.Green.ToString()的值是"Green"字符串: (2)利用Enum的静态方法GetName与GetNames: public static string GetName(Type enumType,Object value) public static string

DELPHI XE2马上推出

DELPHI XE2马上推出 将是一场技术革命 DELPHI XE2 马上要推出了,那将是一场技术革命!支持64位开发,移动平台开发,web开发等等...今天参加了Delphi XE2的产品发布会,趁热打铁,整理下笔记,看看XE 2中到底有什么新东西. 1. VCL Style 如果你对Web编程很熟,VCL Style就是delphi版的css,想像一下只要换一个style,所有的按钮菜单表格都换了新的颜色和风格,十分酷.XE2中自带了预定义的几种Style,用户可以添加新的并且和其他人分享.

bug-String转换成可变参数的BUG,求大神帮忙解决一下,实在不知道如何解决。

问题描述 String转换成可变参数的BUG,求大神帮忙解决一下,实在不知道如何解决. java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] at android.util.ArrayMap.allocArrays(ArrayMap.java:171) at android.util.ArrayMap.put(ArrayMap.java:444) at android.os.Bund

jvm-编写一个程序,它能导致JVM跑出一个OutOfMenmoryError,然后捕获和处理这个错误

问题描述 编写一个程序,它能导致JVM跑出一个OutOfMenmoryError,然后捕获和处理这个错误 编写一个程序,它能导致JVM跑出一个OutOfMenmoryError,然后捕获和处理这个错误 解决方案 try{ ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < 10000000; i++) { String temp = String.valueOf("adfasdf