Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
<div><span class="tcnt"><span class="tcnt">这两天把一个使用Delphi2007成功升级到了Delphi2010。升级途中很艰辛,总结了 以下经验与大家分享。另外,D7使用的第三方组件,由于官方没有发布For Delphi2010的更新,修改的第三 方组件列表见文章尾部。<br><br>1,PChar<br>因为Delphi不支持无类型指针的算术运算,很多程序员使用 PChar来代替Pointer,即使指针指向目标并不是PAnsiChar。<br><br>考虑如下代码:<br><br></span></span><p><span class="kwd">var
<span class="pln"> P<span class="pun">:<span class="typ">PChar<span class="pun">;
<span class="pln"> <span class="typ">Buffer<span class="pun">:<span class="typ">Pointer<span class="pun">;
<span class="kwd">begin
<span class="pln"> <span class="typ">GetMem<span class="pun">(<span class="typ">Buffer<span class="pun">,<span class="lit">255<span class="pun">);
<span class="pln"> P<span class="pun">:=<span class="typ">Buffer<span class="pun">;
<span class="pln"> p<span class="pun">^:=<span class="com">#1;
<span class="pln"> <span class="typ">Inc<span class="pun">(<span class="pln">P<span class="pun">);
<span class="pln"> p<span class="pun">^:=<span class="com">#2;
<span class="pln"> <span class="typ">FreeMem<span class="pun">(<span class="typ">Buffer<span class="pun">,<span class="lit">255<span class="pun">);
<span class="kwd">end<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<span class="tcnt"><span class="tcnt"><br><br>在2010中PChar已经不再表示PAnsiChar而是表示PWideChar,如果依然这样写,运行时很可能会得到一个内存访问错误。因为每 次Inc(P),实际上指针向前移动了2字节,因为SizeOf(WideChar)=2,Inc(P)相当于 P:=P+SizeOf(WideChar)。 <br><br>解决方法是把PChar替换成PAnsiChar <br><br><br><br>2,Move FillChar CopyMemory <br>这些函数依赖的是字节长度,往往我们直接使用Length(Str)来获取,这是行不通的。 <br><br>考虑如下代码: <br><br></span></span>
<p><span class="kwd">var
<span class="pln"> P1<span class="pun">,<span class="pln">P2<span class="pun">:<span class="typ">String<span class="pun">;
<span class="kwd">begin
<span class="pln"> P1<span class="pun">:=<span class="str">'test'<span class="pun">;
<span class="pln"> <span class="typ">SetLength<span class="pun">(<span class="pln">P2<span class="pun">,<span class="typ">Length<span class="pun">(<span class="pln">P1<span class="pun">));
<span class="pln"> <span class="typ">Move<span class="pun">(<span class="pln">P1<span class="pun">[<span class="lit">1<span class="pun">],<span class="pln">P2<span class="pun">[<span class="lit">1<span class="pun">],<span class="typ">Length<span class="pun">(<span class="pln">P1<span class="pun">));</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span class="kwd">end
</span></p>
<span class="tcnt"><br>在2010中String默认映射到UnicodeString,单个字符是2字节,所以上文中P1实际占用了8字节内存,而传给Move函数的长 度只有4字节,最终结果是P2="te"。 <br><br>解决办法1: <br><br>修改String为AnsiString,该方案虽然可行,但你的程序就享受不到Unicode待遇了。 <br><br>解决办法2: <br><br>SetLength 函数不要修改,因为他的长度参数是字符长度,而不是字节长度。 <br><br>Move函数的最后一个参数 Length(P1) 修改成 Length(P1)*SizeOf(Char)。 <br><br>注意:不要偷懒使用万一老师说的ByteLength函数,该函数并没有For AnsiString的重载,编译器会 把参数隐式转化为UnicodeString然后,ByteLength函数计算UnicodeString的长度。例如:一旦你不小心传入了一个 AnsiString类型长度为4的字符串,函数会返回8,而不是你期望的长度4。 <br><br><br><br>3,Key in ['a'..'z','B','C'] <br>这类代码最好替换成CharInSet(Key,['a'..'z','B','C']) 不然会当作AnsiChar处理。 <br><br><br><br>4,WideString <br>代码中的所有WideString都考虑替换成String,现在 WideString只是为了与COM兼容而存在,且没有引用计数,性能低下。 <br><br><br><br>5,Tnt控件 <br>如果你的工程使用了Tnt控件或以前的WideTextPos WideStringReplace之类的东西都替换成标准的吧,不用曲线救国了。<br><br>---------经过修改,可以在Delphi2010下运作的第三方组件-------------- <br><br><br>1,PNGDelphi <br><br>2,EmbeddedWB <br><br>3,SynEdit的语法高亮组件 unihighlighter <br><br>4,JEDI Win32API Header <br><br><br><br>这些组件现在可以在Delphi2010下运作了。 <br><br>6,引用AnsiStrings单元 <br>如果你有必要使用 AnsiLowerCase AnsiCompareStr之类的函数,一定要引用AnsiStrings单元。 <br><br>如果你不引用该单元,即便编译不报错,你实际上是用的还是Unicode版本的函数,会有隐式的转化。不信你打开参数自动完成,看看IDE提示给你的类型是什么?天啊AnsiLowerCase参数竟然还是String,而不是AnsiString。看来Delphi2010太迫切的要抛弃Ansi字符串了,以至于你不引用AnsiStrings单元,所有Ansixxxx函数实际上还是Unicode版本。 <br><br><br><br>7,AnsiCopy AnsiPos AnsiDelete <br>不要用AnsiCopy AnsiPos AnsiDelete,因为Copy Pos Delete三个函数已经有了For Ansi的重载。 <br><br><br><br>8,把Char转化为小写用什么? <br>答案:试试看Character单元的新函数 ToUpper ToLower。以前我都是用System里面的UpCase函数,现在依然可用不过却找不到LowCase DownCase之类的函数,困扰我好久好久。索性全使用Character单元提供的新函数吧。 <br><br><br><br>9,编译期警告: Unit1.pas(31): W1057 Implicit string cast from 'AnsiString' to 'string' <br>如果你的代码中包含了两种字符串(Unicode、Ansi)之间进行隐式转化的时候就会出现该提示。 <br><br>如下代码就会触发该警告: <br><br><br><br>var Unicode:String; Ansi:AnsiString; begin Ansi:='test..'; Unicode:=Ansi; <br><br><br>把旧版本的Delphi项目升级到2010,我通常都是借助编译警告来快速寻找需要改动的部分。通常你可以把赋值双方都声明为String(默认影射到UnicodeString),就可以避免该警告。但如果你确定必须在此处保留Ansi并进行转化的时候,建议你显式的转化他们(例如:Unicode:=String(Ansi);),这样可以避免该警告,方便你在升级过程中继续寻找其他需要修改的地方。 <br><br><br><br>10,Readln Writeln 写入文件时候要注意 <br>如果你传给Writeln一个AnsiString,那么它也会在文件中写入AnsiString,那么你读取得时候就必须传给Readln一个AnsiString的类型,否则就是乱码。例如旧工程的配置文件是Ansi的,而你已经把相关读取配置的代码升级为支持Unicode,那么运行工程前你首先要用记事本之类的工具把配置文件另存为成Unicode编码。当然你还要注意跳过Unicode文件头的两个字节FE FF。 <br><br><br><br>11,别再用String来操作二进制数据了 <br>一定要记住String只是字符串,不要把它当作缓冲区、内存流使用。我的项目中,有很多地方是使用字符串来处理二进制数据,导致在本次升级中颇为费脑。如果当时用TBytes或TStream就好了。 <br><br>反面教材: <br><br>var Int1,Int2,Int3,Int4:Integer; Buf:String; begin SetLength(Buf,12); Move(Int1,Buf,SizeOf(Integer)); Move(Int1,Buf,SizeOf(Integer)); Move(Int1,Buf,SizeOf(Integer)); Buf:=Buf+'前面有3个Integer。'; <br><br><br>12,还是PChar <br>注意在2010中是这样的: <br><br>PChar= Pointer to a WideChar array; <br><br>PAnsiChar = Pointer to a AnsiChar array; <br><br>如果你还像是在Delphi 7中那样:PChar(AnsiString)那后果过是很严重的。 <br><br></span></div>
<div><span class="tcnt"> </span></div>
<div><span class="tcnt"> </span></div>
<div>一段转换例子</div>
<div>D7</div>
<div>
<div class="line number1 index0 alt2">
<code class="delphi keyword">unit</code>
<code class="delphi plain">ReCode;</code>
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="delphi keyword">interface</code>
</div>
<div class="line number4 index3 alt1">
<code class="delphi keyword">uses</code>
</div>
<div class="line number5 index4 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,</code>
</div>
<div class="line number6 index5 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Dialogs;</code>
</div>
<div class="line number7 index6 alt2">
</div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JiaMi(Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number10 index9 alt1">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JieMi(Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
</div>
<div class="line number13 index12 alt2">
<code class="delphi keyword">implementation</code>
</div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JiaMi(Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number16 index15 alt1">
<code class="delphi keyword">var</code>
</div>
<div class="line number17 index16 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number18 index17 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number19 index18 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number20 index19 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest :</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number21 index20 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number22 index21 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number23 index22 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number24 index23 alt1">
<code class="delphi keyword">begin</code>
</div>
<div class="line number25 index24 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen:=Length(Key);</code>
</div>
<div class="line number26 index25 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number27 index26 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range:=</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number28 index27 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Randomize;</code>
</div>
<div class="line number29 index28 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=Random(Range);</code>
</div>
<div class="line number30 index29 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest:=format(</code>
<code class="delphi string">'%1.2x'</code>
<code class="delphi plain">,);</code>
</div>
<div class="line number31 index30 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">for</code>
<code class="delphi plain">SrcPos := </code>
<code class="delphi value">1</code>
<code class="delphi keyword">to</code>
<code class="delphi plain">Length(Src) </code>
<code class="delphi keyword">do</code>
</div>
<div class="line number32 index31 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">begin</code>
</div>
<div class="line number33 index32 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=(Ord(Src) + offset) </code>
<code class="delphi keyword">MOD</code>
<code class="delphi value">255</code>
<code class="delphi plain">;</code>
</div>
<div class="line number34 index33 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">KeyPos < KeyLen </code>
<code class="delphi keyword">then</code>
<code class="delphi plain">KeyPos:= KeyPos + </code>
<code class="delphi value">1</code>
<code class="delphi keyword">else</code>
<code class="delphi plain">KeyPos:=</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number35 index34 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:= SrcAsc </code>
<code class="delphi keyword">xor</code>
<code class="delphi plain">Ord(Key);</code>
</div>
<div class="line number36 index35 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest:=dest + format(</code>
<code class="delphi string">'%1.2x'</code>
<code class="delphi plain">,);</code>
</div>
<div class="line number37 index36 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=SrcAsc;</code>
</div>
<div class="line number38 index37 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number39 index38 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Result:=Dest;</code>
</div>
<div class="line number40 index39 alt1">
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number41 index40 alt2">
</div>
<div class="line number42 index41 alt1">
<code class="delphi comments">//解密函数</code>
</div>
<div class="line number43 index42 alt2">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JieMi (Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number44 index43 alt1">
<code class="delphi keyword">var</code>
</div>
<div class="line number45 index44 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number46 index45 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number47 index46 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number48 index47 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest :</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number49 index48 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number50 index49 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number51 index50 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number52 index51 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number53 index52 alt2">
<code class="delphi keyword">begin</code>
</div>
<div class="line number54 index53 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen:=Length(Key);</code>
</div>
<div class="line number55 index54 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">KeyLen = </code>
<code class="delphi value">0</code>
<code class="delphi keyword">then</code>
<code class="delphi plain">key:=</code>
<code class="delphi string">'starlin'</code>
<code class="delphi plain">;</code>
</div>
<div class="line number56 index55 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number57 index56 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number58 index57 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number59 index58 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range:=</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number60 index59 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=StrToInt(</code>
<code class="delphi string">'$'</code>
<code class="delphi plain">+ copy(src,</code>
<code class="delphi value">1</code>
<code class="delphi plain">,</code>
<code class="delphi value">2</code>
<code class="delphi plain">));</code>
</div>
<div class="line number61 index60 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos:=</code>
<code class="delphi value">3</code>
<code class="delphi plain">;</code>
</div>
<div class="line number62 index61 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">repeat</code>
</div>
<div class="line number63 index62 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">try</code>
</div>
<div class="line number64 index63 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=StrToInt(</code>
<code class="delphi string">'$'</code>
<code class="delphi plain">+ copy(src,SrcPos,</code>
<code class="delphi value">2</code>
<code class="delphi plain">));</code>
</div>
<div class="line number65 index64 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">except</code>
</div>
<div class="line number66 index65 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=StrToInt(</code>
<code class="delphi string">'$00'</code>
<code class="delphi plain">);</code>
</div>
<div class="line number67 index66 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number68 index67 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">KeyPos < KeyLen </code>
<code class="delphi keyword">Then</code>
<code class="delphi plain">KeyPos := KeyPos + </code>
<code class="delphi value">1</code>
<code class="delphi keyword">else</code>
<code class="delphi plain">KeyPos := </code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number69 index68 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc := SrcAsc </code>
<code class="delphi keyword">xor</code>
<code class="delphi plain">Ord(Key);</code>
</div>
<div class="line number70 index69 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">TmpSrcAsc <= offset </code>
<code class="delphi keyword">then</code>
</div>
<div class="line number71 index70 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc := </code>
<code class="delphi value">255</code>
<code class="delphi plain">+ TmpSrcAsc - offset</code>
</div>
<div class="line number72 index71 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">else</code>
</div>
<div class="line number73 index72 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc := TmpSrcAsc - offset;</code>
</div>
<div class="line number74 index73 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest := dest + chr(TmpSrcAsc);</code>
</div>
<div class="line number75 index74 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=srcAsc;</code>
</div>
<div class="line number76 index75 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos:=SrcPos + </code>
<code class="delphi value">2</code>
<code class="delphi plain">;</code>
</div>
<div class="line number77 index76 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">until</code>
<code class="delphi plain">SrcPos >= Length(Src);</code>
</div>
<div class="line number78 index77 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Result:=Dest;</code>
</div>
<div class="line number79 index78 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Result:=Copy(Result,</code>
<code class="delphi value">1</code>
<code class="delphi plain">,Length(Result)-</code>
<code class="delphi value">1</code>
<code class="delphi plain">);</code>
</div>
<div class="line number80 index79 alt1">
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number81 index80 alt2">
</div>
<div class="line number82 index81 alt1">
<code class="delphi keyword">end</code>
<code class="delphi plain">.</code>
</div>
</div>
<div>XE5</div>
<div> </div>
<div>
<div class="line number1 index0 alt2">
<code class="delphi keyword">unit</code>
<code class="delphi plain">ReCode;</code>
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="delphi keyword">interface</code>
</div>
<div class="line number4 index3 alt1">
<code class="delphi keyword">uses</code>
</div>
<div class="line number5 index4 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,</code>
</div>
<div class="line number6 index5 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Dialogs,AnsiStrings;</code>
</div>
<div class="line number7 index6 alt2">
</div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JiaMi(Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number10 index9 alt1">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JieMi(Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
</div>
<div class="line number13 index12 alt2">
<code class="delphi keyword">implementation</code>
</div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JiaMi(Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number16 index15 alt1">
<code class="delphi keyword">var</code>
</div>
<div class="line number17 index16 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number18 index17 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number19 index18 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number20 index19 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest :</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number21 index20 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number22 index21 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number23 index22 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number24 index23 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">IntTemp:</code>
<code class="delphi keyword">integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number25 index24 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAnsi:</code>
<code class="delphi keyword">PAnsiChar</code>
<code class="delphi plain">;</code>
</div>
<div class="line number26 index25 alt1">
<code class="delphi keyword">begin</code>
</div>
<div class="line number27 index26 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen:=Length(Key);</code>
</div>
<div class="line number28 index27 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number29 index28 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range:=</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number30 index29 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Randomize;</code>
</div>
<div class="line number31 index30 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=Random(Range);</code>
</div>
<div class="line number32 index31 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest:=format(</code>
<code class="delphi string">'%1.2x'</code>
<code class="delphi plain">,);</code>
</div>
<div class="line number33 index32 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAnsi:=</code>
<code class="delphi keyword">PAnsiChar</code>
<code class="delphi plain">(</code>
<code class="delphi keyword">AnsiString</code>
<code class="delphi plain">(Src));</code>
</div>
<div class="line number34 index33 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">IntTemp:= Length(SrcAnsi);</code>
</div>
<div class="line number35 index34 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">for</code>
<code class="delphi plain">SrcPos := </code>
<code class="delphi value">1</code>
<code class="delphi keyword">to</code>
<code class="delphi plain">IntTemp </code>
<code class="delphi keyword">do</code>
</div>
<div class="line number36 index35 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">begin</code>
</div>
<div class="line number37 index36 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=(Ord(SrcAnsi[SrcPos-</code>
<code class="delphi value">1</code>
<code class="delphi plain">]) + offset) </code>
<code class="delphi keyword">MOD</code>
<code class="delphi value">255</code>
<code class="delphi plain">;</code>
</div>
<div class="line number38 index37 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">KeyPos < KeyLen </code>
<code class="delphi keyword">then</code>
<code class="delphi plain">KeyPos:= KeyPos + </code>
<code class="delphi value">1</code>
<code class="delphi keyword">else</code>
<code class="delphi plain">KeyPos:=</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number39 index38 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:= SrcAsc </code>
<code class="delphi keyword">xor</code>
<code class="delphi plain">Ord(Key);</code>
</div>
<div class="line number40 index39 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest:=dest + format(</code>
<code class="delphi string">'%1.2x'</code>
<code class="delphi plain">,);</code>
</div>
<div class="line number41 index40 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=SrcAsc;</code>
</div>
<div class="line number42 index41 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number43 index42 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">Result:=Dest;</code>
</div>
<div class="line number44 index43 alt1">
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number45 index44 alt2">
</div>
<div class="line number46 index45 alt1">
<code class="delphi comments">//解密函数</code>
</div>
<div class="line number47 index46 alt2">
<code class="delphi keyword">Function</code>
<code class="delphi plain">JieMi (Src:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">; Key:</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">):</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number48 index47 alt1">
<code class="delphi keyword">var</code>
</div>
<div class="line number49 index48 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number50 index49 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number51 index50 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number52 index51 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest :</code>
<code class="delphi keyword">String</code>
<code class="delphi plain">;</code>
</div>
<div class="line number53 index52 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number54 index53 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number55 index54 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number56 index55 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range :</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number57 index56 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAnsi:</code>
<code class="delphi keyword">PAnsiChar</code>
<code class="delphi plain">;</code>
</div>
<div class="line number58 index57 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">IntTemp,i:</code>
<code class="delphi keyword">Integer</code>
<code class="delphi plain">;</code>
</div>
<div class="line number59 index58 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">ByteArray: </code>
<code class="delphi keyword">array</code>
<code class="delphi keyword">of</code>
<code class="delphi keyword">Byte</code>
<code class="delphi plain">;</code>
</div>
<div class="line number60 index59 alt1">
<code class="delphi keyword">begin</code>
</div>
<div class="line number61 index60 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyLen:=Length(Key);</code>
</div>
<div class="line number62 index61 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">KeyLen = </code>
<code class="delphi value">0</code>
<code class="delphi keyword">then</code>
<code class="delphi plain">key:=</code>
<code class="delphi string">'starlin'</code>
<code class="delphi plain">;</code>
</div>
<div class="line number63 index62 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">KeyPos:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number64 index63 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number65 index64 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number66 index65 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Range:=</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number67 index66 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=StrToInt(</code>
<code class="delphi string">'$'</code>
<code class="delphi plain">+ copy(src,</code>
<code class="delphi value">1</code>
<code class="delphi plain">,</code>
<code class="delphi value">2</code>
<code class="delphi plain">));</code>
</div>
<div class="line number68 index67 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos:=</code>
<code class="delphi value">3</code>
<code class="delphi plain">;</code>
</div>
<div class="line number69 index68 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">IntTemp:=Length(Src) </code>
<code class="delphi keyword">div</code>
<code class="delphi value">2</code>
<code class="delphi plain">;</code>
</div>
<div class="line number70 index69 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">setlength(ByteArray,IntTemp);</code>
</div>
<div class="line number71 index70 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">i:=</code>
<code class="delphi value">0</code>
<code class="delphi plain">;</code>
</div>
<div class="line number72 index71 alt1">
<code class="delphi spaces"> </code>
<code class="delphi keyword">repeat</code>
</div>
<div class="line number73 index72 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">try</code>
</div>
<div class="line number74 index73 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=StrToInt(</code>
<code class="delphi string">'$'</code>
<code class="delphi plain">+ copy(src,SrcPos,</code>
<code class="delphi value">2</code>
<code class="delphi plain">));</code>
</div>
<div class="line number75 index74 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">except</code>
</div>
<div class="line number76 index75 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcAsc:=StrToInt(</code>
<code class="delphi string">'$00'</code>
<code class="delphi plain">);</code>
</div>
<div class="line number77 index76 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number78 index77 alt1">
</div>
<div class="line number79 index78 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">KeyPos < KeyLen </code>
<code class="delphi keyword">Then</code>
<code class="delphi plain">KeyPos := KeyPos + </code>
<code class="delphi value">1</code>
<code class="delphi keyword">else</code>
<code class="delphi plain">KeyPos := </code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number80 index79 alt1">
</div>
<div class="line number81 index80 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc := SrcAsc </code>
<code class="delphi keyword">xor</code>
<code class="delphi plain">Ord(Key);</code>
</div>
<div class="line number82 index81 alt1">
</div>
<div class="line number83 index82 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">if</code>
<code class="delphi plain">TmpSrcAsc <= offset </code>
<code class="delphi keyword">then</code>
</div>
<div class="line number84 index83 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc := </code>
<code class="delphi value">255</code>
<code class="delphi plain">+ TmpSrcAsc - offset</code>
</div>
<div class="line number85 index84 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">else</code>
</div>
<div class="line number86 index85 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">TmpSrcAsc := TmpSrcAsc - offset;</code>
</div>
<div class="line number87 index86 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">ByteArray:=TmpSrcAsc;</code>
</div>
<div class="line number88 index87 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">i:=i+</code>
<code class="delphi value">1</code>
<code class="delphi plain">;</code>
</div>
<div class="line number89 index88 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">offset:=srcAsc;</code>
</div>
<div class="line number90 index89 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">SrcPos:=SrcPos + </code>
<code class="delphi value">2</code>
<code class="delphi plain">;</code>
</div>
<div class="line number91 index90 alt2">
<code class="delphi spaces"> </code>
<code class="delphi keyword">until</code>
<code class="delphi plain">SrcPos >= Length(Src);</code>
</div>
<div class="line number92 index91 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">CopyMemory(@SrcAnsi[</code>
<code class="delphi value">0</code>
<code class="delphi plain">],@ByteArray[</code>
<code class="delphi value">0</code>
<code class="delphi plain">],IntTemp);</code>
</div>
<div class="line number93 index92 alt2">
<code class="delphi spaces"> </code>
<code class="delphi plain">dest:=</code>
<code class="delphi keyword">string</code>
<code class="delphi plain">(AnsiStrings</code>
<code class="delphi value">.</code>
<code class="delphi plain">strpas(SrcAnsi));</code>
</div>
<div class="line number94 index93 alt1">
<code class="delphi spaces"> </code>
<code class="delphi plain">Result:=Dest;</code>
</div>
<div class="line number95 index94 alt2">
</div>
<div class="line number96 index95 alt1">
<code class="delphi keyword">end</code>
<code class="delphi plain">;</code>
</div>
<div class="line number97 index96 alt2">
</div>
<div class="line number98 index97 alt1">
<code class="delphi keyword">end</code>
<code class="delphi plain">.</code></div>
</div>
</div>
<div id="MySignature" role="contentinfo">
好的代码像粥一样,都是用时间熬出来的<br><br>
来源:https://www.cnblogs.com/jijm123/p/14186934.html
頁:
[1]