﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-爱生活 爱技术-随笔分类-Delphi</title><link>http://www.cppblog.com/hktk/category/7092.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 14 Sep 2009 14:53:29 GMT</lastBuildDate><pubDate>Mon, 14 Sep 2009 14:53:29 GMT</pubDate><ttl>60</ttl><item><title>Delphi解释这三个的区别：new、getmem、Allocmem</title><link>http://www.cppblog.com/hktk/archive/2009/09/14/96089.html</link><dc:creator>海 阔 天 空</dc:creator><author>海 阔 天 空</author><pubDate>Mon, 14 Sep 2009 01:39:00 GMT</pubDate><guid>http://www.cppblog.com/hktk/archive/2009/09/14/96089.html</guid><description><![CDATA[new动态生成一个指针，初始化指针为空，用dispose释放 <br><clk></clk>getmem申请一块<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">内存</nobr>，用freemem释放 <br>allocmem从堆中申请内存，并且用#0进行初始化！用freemem释放
<img src ="http://www.cppblog.com/hktk/aggbug/96089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hktk/" target="_blank">海 阔 天 空</a> 2009-09-14 09:39 <a href="http://www.cppblog.com/hktk/archive/2009/09/14/96089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi的指针</title><link>http://www.cppblog.com/hktk/archive/2009/09/14/96087.html</link><dc:creator>海 阔 天 空</dc:creator><author>海 阔 天 空</author><pubDate>Mon, 14 Sep 2009 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/hktk/archive/2009/09/14/96087.html</guid><description><![CDATA[<p>大家都认为，C语言之所以强大，以及其自由性，很大部分体现在其灵活的指针运用上。因此，说指针是C语言的灵魂，一点都不为过。同时，这种说法也让很多人产生误解，似乎只有C语言的指针才能算指针。Basic不支持指针，在此不论。其实，Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal，可以说在指针运用上，丝毫不会逊色于C语言的指针。&nbsp;&nbsp;<br><br>以下内容分为八个部分，分别是&nbsp;&nbsp;<br>一、类型指针的定义&nbsp;&nbsp;<br>二、无类型指针的定义&nbsp;&nbsp;<br>三、指针的解除引用&nbsp;&nbsp;<br>四、取地址（指针赋值）&nbsp;&nbsp;<br>五、指针运算&nbsp;&nbsp;<br>六、动态内存分配&nbsp;&nbsp;<br>七、字符数组的运算&nbsp;&nbsp;<br>八、函数指针&nbsp;&nbsp;<br><br><br>一、类型指针的定义。对于指向特定类型的指针，在C中是这样定义的：&nbsp;&nbsp;<br>int *ptr;&nbsp;&nbsp;<br>char *ptr;&nbsp;&nbsp;<br>与之等价的Object Pascal是如何定义的呢？&nbsp;&nbsp;<br>var&nbsp;&nbsp;<br>ptr : ^Integer;&nbsp;&nbsp;<br>ptr : ^char;&nbsp;&nbsp;<br>其实也就是符号的差别而已。&nbsp;&nbsp;<br><br>二、无类型指针的定义。C中有void *类型，也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型：Pointer。于是，&nbsp;&nbsp;<br>ptr : Pointer;&nbsp;&nbsp;<br>就与C中的&nbsp;&nbsp;<br>void *ptr;&nbsp;&nbsp;<br>等价了。&nbsp;&nbsp;<br><br>三、指针的解除引用。要解除指针引用（即取出指针所指区域的值），C 的语法是 (*ptr)，Object Pascal则是 ptr^。&nbsp;&nbsp;<br><br>四、取地址（指针赋值）。取某对象的地址并将其赋值给指针变量，C 的语法是&nbsp;&nbsp;<br>ptr = &amp;Object;&nbsp;&nbsp;<br>Object Pascal 则是&nbsp;&nbsp;<br>ptr := @Object;&nbsp;&nbsp;<br>也只是符号的差别而已。&nbsp;&nbsp;<br><br>五、指针运算。在C中，可以对指针进行移动的运算，如：&nbsp;&nbsp;<br>char a[20];&nbsp;&nbsp;&nbsp;&nbsp;<br>char *ptr=a;&nbsp;&nbsp;&nbsp;&nbsp;<br>ptr++;&nbsp;&nbsp;<br>ptr+=2;&nbsp;&nbsp;<br>当执行ptr++;时，编译器会产生让ptr前进sizeof(char)步长的代码，之后，ptr将指向a[1]。ptr+=2;这句使得ptr前进两 个sizeof(char)大小的步长。同样，我们来看一下Object Pascal中如何实现：&nbsp;&nbsp;<br>var&nbsp;&nbsp;<br>&nbsp;&nbsp; a : array [1..20] of Char;&nbsp;&nbsp;<br>&nbsp;&nbsp; ptr : PChar; //PChar 可以看作 ^Char&nbsp;&nbsp;<br>begin&nbsp;&nbsp;<br>&nbsp;&nbsp; ptr := @a;&nbsp;&nbsp;<br>&nbsp;&nbsp; Inc(ptr); // 这句等价于 C 的 ptr++;&nbsp;&nbsp;<br>&nbsp;&nbsp; Inc(ptr, 2); //这句等价于 C 的 ptr+=2;&nbsp;&nbsp;<br>end;&nbsp;&nbsp;<br><br>六、动态内存分配。C中，使用malloc()库函数分配内存，free()函数释放内存。如这样的代码：&nbsp;&nbsp;<br>int *ptr, *ptr2;&nbsp;&nbsp;<br>int i;&nbsp;&nbsp;<br>ptr = (int*) malloc(sizeof(int) * 20);&nbsp;&nbsp;<br>ptr2 = ptr;&nbsp;&nbsp;<br>for (i=0; i&lt;20; i++){&nbsp;&nbsp;<br>&nbsp;&nbsp; *ptr = i;&nbsp;&nbsp;<br>&nbsp;&nbsp; ptr++;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br>free(ptr2);&nbsp;&nbsp;<br>Object Pascal中，动态分配内存的函数是GetMem()，与之对应的释放函数为FreeMem()（传统Pascal中获取内存的函数是New()和 Dispose()，但New()只能获得对象的单个实体的内存大小，无法取得连续的存放多个对象的内存块）。因此，与上面那段C的代码等价的 Object Pascal的代码为：&nbsp;&nbsp;<br>var ptr, ptr2 : ^integer;&nbsp;&nbsp;<br>&nbsp;&nbsp; i : integer;&nbsp;&nbsp;<br>begin&nbsp;&nbsp;<br>&nbsp;&nbsp; GetMem(ptr, sizeof(integer) * 20);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; //这句等价于C的 ptr = (int*) malloc(sizeof(int) * 20);&nbsp;&nbsp;<br>&nbsp;&nbsp; ptr2 := ptr; //保留原始指针位置&nbsp;&nbsp;<br>&nbsp;&nbsp; for i := 0 to 19 do&nbsp;&nbsp;<br>&nbsp;&nbsp; begin&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; ptr^ := i;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; Inc(ptr);&nbsp;&nbsp;<br>&nbsp;&nbsp; end;&nbsp;&nbsp;<br>&nbsp;&nbsp; FreeMem(ptr2);&nbsp;&nbsp;<br>end;&nbsp;&nbsp;<br>对于以上这个例子（无论是C版本的，还是Object Pascal版本的），都要注意一个问题，就是分配内存的单位是字节（BYTE），因此在使用GetMem时，其第二个参数如果想当然的写成 20，那么就会出问题了（内存访问越界）。因为GetMem(ptr, 20);实际只分配了20个字节的内存空间，而一个整形的大小是四个字节，那么访问第五个之后的所有元素都是非法的了（对于malloc()的参数同样）。&nbsp;&nbsp;<br><br>七、字符数组的运算。C语言中，是没有字符串类型的，因此，字符串都是用字符数组来实现，于是也有一套str打头的库函数以进行字符数组的运算，如以下代码：&nbsp;&nbsp;<br>char str[15];&nbsp;&nbsp;<br>char *pstr;&nbsp;&nbsp;<br>strcpy(str, "teststr");&nbsp;&nbsp;<br>strcat(str, "_testok");&nbsp;&nbsp;<br>pstr = (char*) malloc(sizeof(char) * 15);&nbsp;&nbsp;<br>strcpy(pstr, str);&nbsp;&nbsp;<br>printf(pstr);&nbsp;&nbsp;<br>free(pstr);&nbsp;&nbsp;<br>而在Object Pascal中，有了String类型，因此可以很方便的对字符串进行各种运算。但是，有时我们的Pascal代码需要与C的代码交互（比如：用 Object Pascal的代码调用C写的DLL或者用Object Pascal写的DLL准备允许用C写客户端的代码）的话，就不能使用String类型了，而必须使用两种语言通用的字符数组。其实，Object Pascal提供了完全相似C的一整套字符数组的运算函数，以上那段代码的Object Pascal版本是这样的：&nbsp;&nbsp;<br>var str : array [1..15] of char;&nbsp;&nbsp;<br>&nbsp;&nbsp; pstr : PChar; //Pchar 也就是 ^Char&nbsp;&nbsp;<br>begin&nbsp;&nbsp;<br>&nbsp;&nbsp; StrCopy(@str, 'teststr'); //在C中，数组的名称可以直接作为数组首地址指针来用&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //但Pascal不是这样的，因此 str前要加上取地址的运算符&nbsp;&nbsp;<br>&nbsp;&nbsp; StrCat(@str, '_testok');&nbsp;&nbsp;<br>&nbsp;&nbsp; GetMem(pstr, sizeof(char) * 15);&nbsp;&nbsp;<br>&nbsp;&nbsp; StrCopy(pstr, @str);&nbsp;&nbsp;<br>&nbsp;&nbsp; Write(pstr);&nbsp;&nbsp;<br>&nbsp;&nbsp; FreeMem(pstr);&nbsp;&nbsp;<br>end;&nbsp;&nbsp;<br><br>八、函数指针。在动态调用DLL中的函数时，就会用到函数指针。假设用C写的一段代码如下：&nbsp;&nbsp;<br>typedef int (*PVFN)(int); //定义函数指针类型&nbsp;&nbsp;<br>int main()&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp; HMODULE hModule = LoadLibrary("test.dll");&nbsp;&nbsp;<br>PVFN pvfn = NULL;&nbsp;&nbsp;<br>&nbsp;&nbsp; pvfn = (PVFN) GetProcAddress(hModule, "Function1");&nbsp;&nbsp;<br>&nbsp;&nbsp; pvfn(2);&nbsp;&nbsp;<br>&nbsp;&nbsp; FreeLibrary(hModule);&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br>就我个人感觉来说，C语言中定义函数指针类型的typedef代码的语法有些晦涩，而同样的代码在Object Pascal中却非常易懂：&nbsp;&nbsp;<br>type PVFN = Function (para : Integer) : Integer;&nbsp;&nbsp;<br>var&nbsp;&nbsp;<br>&nbsp;&nbsp; fn : PVFN;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; //也可以直接在此处定义，如：fn : function (para:Integer):Integer;&nbsp;&nbsp;<br>&nbsp;&nbsp; hm : HMODULE;&nbsp;&nbsp;<br>begin&nbsp;&nbsp;<br>&nbsp;&nbsp; hm := LoadLibrary('test.dll');&nbsp;&nbsp;<br>&nbsp;&nbsp; fn := GetProcAddress(hm, 'Function1');&nbsp;&nbsp;<br>&nbsp;&nbsp; fn(2);&nbsp;&nbsp;<br>&nbsp;&nbsp; FreeLibrary(hm);&nbsp;&nbsp;<br>end;&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/hktk/aggbug/96087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hktk/" target="_blank">海 阔 天 空</a> 2009-09-14 09:37 <a href="http://www.cppblog.com/hktk/archive/2009/09/14/96087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi中函数指针的使用</title><link>http://www.cppblog.com/hktk/archive/2009/09/14/96084.html</link><dc:creator>海 阔 天 空</dc:creator><author>海 阔 天 空</author><pubDate>Mon, 14 Sep 2009 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/hktk/archive/2009/09/14/96084.html</guid><description><![CDATA[<p>Delphi中可以通过函数指针把一个函数作为参数来传递，然后在另外一个函数中调用。</p>
<p>1) 首先，申明函数指针类型TFunctionParameter<br>&nbsp;&nbsp;&nbsp; type<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TFunctionParameter = function(const value : integer) : string; //函数指针</p>
<p>2) 定义准备被作为参数传递的函数<br>&nbsp;&nbsp;&nbsp; function One(const value : integer) : string;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //函数-实例1<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result := IntToStr(value) ;<br>&nbsp;&nbsp;&nbsp; end;</p>
<p>&nbsp;&nbsp;&nbsp; function Two(const value : integer) : string;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //函数-实例2<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result := IntToStr(2 * value) ;<br>&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>3) 定义将要使用动态函数指针参数的函数<br>&nbsp;&nbsp;&nbsp; function DynamicFunction(f : TFunctionParameter; const value : integer) : string;<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result := f(value) ;<br>&nbsp;&nbsp;&nbsp; end;</p>
<p>4) 上面这个动态函数的使用实例<br>&nbsp;&nbsp;&nbsp; var<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s : string;<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s := DynamicFunction(One,2006) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(s) ; //will display "2006"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s := DynamicFunction(Two,2006) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(s) ; // will display "4012"<br>&nbsp;&nbsp;&nbsp; end;</p>
<p><br>&lt;====================================================================================================&gt;<br>指向非对象（一般的）函数/过程的函数指针<br><br>&nbsp;Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表；如果是函数，再加个返回值。例如声明一个过程类型，该类型带一个通过引用传递的整型参数：</p>
<p>type<br>&nbsp; IntProc = procedure (var Num: Integer);</p>
<p>这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。下面是一个兼容例程：</p>
<p>procedure DoubleTheValue (var Value: Integer);<br>begin<br>Value := Value * 2;<br>end;</p>
<p>函数指针能用于两种不同的目的：声明函数指针类型的变量；或者把函数指针作为参数传递给另一例程。利用上面给定的类型和过程声明，你可以写出下面的代码：</p>
<p>var<br>&nbsp; IP: IntProc;<br>&nbsp; X: Integer;<br>begin<br>&nbsp; IP := DoubleTheValue;<br>&nbsp; X := 5;<br>&nbsp; IP (X);<br>end;</p>
<p>虽然这种调用方法比直接调用麻烦了,那么我们为什么要用这种方式呢？</p>
<p>(1)因为在某些情况下，调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活.</p>
<p>(2)利用函数指针我们可以实现委托,委托在.NEt中被发挥的淋漓尽致,但Delphi同样能实现</p>
<p>(3)实现回调机制</p>
<p>函数指针很有用啊,是高级程序员的必修。</p>
<p>例子</p>
<p>&nbsp;&nbsp; 1. {********************************************************<br>&nbsp;&nbsp; 2.&nbsp;&nbsp; 函数指针(指向一般函数和过程)<br>&nbsp;&nbsp; 3. UnitOwner:coco.zhang&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; 4.&nbsp;&nbsp; Last Modified:2008-10-5&nbsp;&nbsp; <br>&nbsp;&nbsp; 5. *********************************************************}<br>&nbsp;&nbsp; 6. unit DelegateUnit;<br>&nbsp;&nbsp; 7. interface<br>&nbsp;&nbsp; 8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; procedure Func1;<br>&nbsp;&nbsp; 9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {定义两个函数型构相同但功能不同的函数} <br>&nbsp; 10.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp;&nbsp; FuncAdd(VarA , VarB : Integer):Integer;<br>&nbsp; 11.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp;&nbsp; FuncSub(VarA , VarB : Integer):Integer;<br>&nbsp; 12. type<br>&nbsp; 13.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DelegateFunc1 = procedure;<br>&nbsp; 14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DelegateFuncCalc = function(VarA , VarB : Integer):Integer;<br>&nbsp; 15. var<br>&nbsp; 16.&nbsp;&nbsp;&nbsp; I : Integer;<br>&nbsp; 17. implementation<br>&nbsp; 18.<br>&nbsp; 19.&nbsp;&nbsp;&nbsp; procedure Func1;<br>&nbsp; 20.&nbsp;&nbsp;&nbsp; begin<br>&nbsp; 21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writeln('Func1 was called!');<br>&nbsp; 22.&nbsp;&nbsp;&nbsp; end;<br>&nbsp; 23.&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp;&nbsp; FuncAdd(VarA , VarB : Integer):Integer;<br>&nbsp; 24.&nbsp;&nbsp;&nbsp; begin<br>&nbsp; 25.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := VarA + VarB;<br>&nbsp; 26.&nbsp;&nbsp;&nbsp; end;<br>&nbsp; 27.&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp;&nbsp; FuncSub(VarA , VarB : Integer):Integer;<br>&nbsp; 28.&nbsp;&nbsp;&nbsp; begin<br>&nbsp; 29.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := VarA - VarB;<br>&nbsp; 30.&nbsp;&nbsp;&nbsp; end;<br>&nbsp; 31.&nbsp;&nbsp;&nbsp; end.</p>
<p>客户端调用</p>
<p>&nbsp;&nbsp; 1. program Delegate;<br>&nbsp;&nbsp; 2. {$APPTYPE CONSOLE}<br>&nbsp;&nbsp; 3. uses<br>&nbsp;&nbsp; 4.&nbsp;&nbsp; DelegateUnit;<br>&nbsp;&nbsp; 5. var<br>&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp; ADelegateFunc1 : DelegateFunc1;<br>&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp; ADelegateFuncCalc : DelegateFuncCalc;<br>&nbsp;&nbsp; 8. begin<br>&nbsp;&nbsp; 9.&nbsp;&nbsp;&nbsp;&nbsp; {通过函数指针调用过程}<br>&nbsp; 10.&nbsp;&nbsp;&nbsp;&nbsp; ADelegateFunc1&nbsp; := Func1;<br>&nbsp; 11.&nbsp;&nbsp;&nbsp;&nbsp; ADelegateFunc1 ;<br>&nbsp; 12.&nbsp;&nbsp;&nbsp;&nbsp; {通过同种方式调用不同函数}<br>&nbsp; 13.&nbsp;&nbsp;&nbsp;&nbsp; ADelegateFuncCalc&nbsp; := FuncAdd;<br>&nbsp; 14.&nbsp;&nbsp;&nbsp;&nbsp; Writeln(ADelegateFuncCalc(3,5));<br>&nbsp; 15.&nbsp;&nbsp;&nbsp;&nbsp; ADelegateFuncCalc&nbsp; := FuncSub;<br>&nbsp; 16.&nbsp;&nbsp;&nbsp;&nbsp; Writeln(ADelegateFuncCalc(3,5));<br>&nbsp; 17. end.</p>
<p>运行结果<br>D:\Projects\Delphi7\src\GofProjects\Delegate&gt;Delegate<br>Func1 was called!<br>8<br>-2<br></p>
<img src ="http://www.cppblog.com/hktk/aggbug/96084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hktk/" target="_blank">海 阔 天 空</a> 2009-09-14 09:34 <a href="http://www.cppblog.com/hktk/archive/2009/09/14/96084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>