??xml version="1.0" encoding="utf-8" standalone="yes"?>久久热这里只有精品在线观看,69SEX久久精品国产麻豆,久久国内免费视频http://m.shnenglu.com/Ipedo/zh-cnSat, 28 Jun 2025 01:41:42 GMTSat, 28 Jun 2025 01:41:42 GMT60Pass在SDK2004里被ҎBeginPass?/title><link>http://m.shnenglu.com/Ipedo/archive/2006/04/14/5516.html</link><dc:creator>Ipedo</dc:creator><author>Ipedo</author><pubDate>Fri, 14 Apr 2006 02:28:00 GMT</pubDate><guid>http://m.shnenglu.com/Ipedo/archive/2006/04/14/5516.html</guid><wfw:comment>http://m.shnenglu.com/Ipedo/comments/5516.html</wfw:comment><comments>http://m.shnenglu.com/Ipedo/archive/2006/04/14/5516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/Ipedo/comments/commentRss/5516.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/Ipedo/services/trackbacks/5516.html</trackback:ping><description><![CDATA[q去的Pass()被分成了几个函数QBeginPass()QCommitChanges()和EndPass() 所以,应该q样来用Q?<br />for( number of passes ) <br />{ <br /> pDevice->BeginPass(); <br /> pDevice->CommitChanges(); <br /> // 在这里绘制场景?br /> //。。。。?br /> pDevice->EndPass(); <br />}<img src ="http://m.shnenglu.com/Ipedo/aggbug/5516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/Ipedo/" target="_blank">Ipedo</a> 2006-04-14 10:28 <a href="http://m.shnenglu.com/Ipedo/archive/2006/04/14/5516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>农历--|页昄http://m.shnenglu.com/Ipedo/archive/2006/01/06/2463.htmlIpedoIpedoFri, 06 Jan 2006 04:04:00 GMThttp://m.shnenglu.com/Ipedo/archive/2006/01/06/2463.htmlhttp://m.shnenglu.com/Ipedo/comments/2463.htmlhttp://m.shnenglu.com/Ipedo/archive/2006/01/06/2463.html#Feedback1http://m.shnenglu.com/Ipedo/comments/commentRss/2463.htmlhttp://m.shnenglu.com/Ipedo/services/trackbacks/2463.html

<script language="javascript">
<!--
var bsYear; 
var bsDate; 
var bsWeek; 
var arrLen=8; //数组长度
var sValue=0; //当年的秒?BR>var dayiy=0; //当年W几?BR>var miy=0; //月䆾的下?BR>var iyear=0; //q䆾标记
var dayim=0; //当月W几?BR>var spd=86400; //每天的秒?/P>

var year1999="30;29;29;30;29;29;30;29;30;30;30;29"; //354
var year2000="30;30;29;29;30;29;29;30;29;30;30;29"; //354
var year2001="30;30;29;30;29;30;29;29;30;29;30;29;30"; //384
var year2002="30;30;29;30;29;30;29;29;30;29;30;29"; //354
var year2003="30;30;29;30;30;29;30;29;29;30;29;30"; //355
var year2004="29;30;29;30;30;29;30;29;30;29;30;29;30"; //384
var year2005="29;30;29;30;29;30;30;29;30;29;30;29"; //354
var year2006="30;29;30;29;30;30;29;29;30;30;29;29;30";

var month1999="正月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一?十二?
var month2001="正月;二月;三月;四月;闰四?五月;六月;七月;八月;九月;十月;十一?十二?
var month2004="正月;二月;C?三月;四月;五月;六月;七月;八月;九月;十月;十一?十二?
var month2006="正月;二月;三月;四月;五月;六月;七月;C?八月;九月;十月;十一?十二?
var Dn="初一;初二;初三;初四;初五;初六;初七;初八;初九;初十;十一;十二;十三;十四;十五;十六;十七;十八;十九;二十;廿一;廿二;廿三;廿四;廿五;廿六;廿七;廿八;廿九;三十";

var Ys=new Array(arrLen);
Ys[0]=919094400;Ys[1]=949680000;Ys[2]=980265600;
Ys[3]=1013443200;Ys[4]=1044028800;Ys[5]=1074700800;
Ys[6]=1107878400;Ys[7]=1138464000;

var Yn=new Array(arrLen);   //农历q的名称
Yn[0]="己卯q?;Yn[1]="庚辰q?;Yn[2]="辛埩q?;
Yn[3]="午q?;Yn[4]="癸未q?;Yn[5]="甲申q?;
Yn[6]="乙酉q?;Yn[7]="丙戌q?;
var D=new Date();
var yy=D.getYear();
var mm=D.getMonth()+1;
var dd=D.getDate();
var ww=D.getDay();
if (ww==0) ww="<font color=RED>星期?;
if (ww==1) ww="星期一";
if (ww==2) ww="星期?;
if (ww==3) ww="星期?;
if (ww==4) ww="星期?;
if (ww==5) ww="星期?;
if (ww==6) ww="<font color=RED>星期?;
ww=ww;
var ss=parseInt(D.getTime() / 1000);
if (yy<100) yy="19"+yy;

for (i=0;i<arrLen;i++)
 if (ss>=Ys[i]){
  iyear=i;
  sValue=ss-Ys[i];    //当年的秒?BR>  }
dayiy=parseInt(sValue/spd)+1;    //当年的天?/P>

var dpm=year1999;
if (iyear==1) dpm=year2000;
if (iyear==2) dpm=year2001;
if (iyear==3) dpm=year2002;
if (iyear==4) dpm=year2003;
if (iyear==5) dpm=year2004;
if (iyear==6) dpm=year2005;
if (iyear==7) dpm=year2006;
dpm=dpm.split(";");

var Mn=month1999;
if (iyear==2) Mn=month2001;
if (iyear==5) Mn=month2004;
if (iyear==7) Mn=month2006;
Mn=Mn.split(";");

var Dn="初一;初二;初三;初四;初五;初六;初七;初八;初九;初十;十一;十二;十三;十四;十五;十六;十七;十八;十九;二十;廿一;廿二;廿三;廿四;廿五;廿六;廿七;廿八;廿九;三十";
Dn=Dn.split(";");

dayim=dayiy;

var total=new Array(13);
total[0]=parseInt(dpm[0]);
for (i=1;i<dpm.length-1;i++) total[i]=parseInt(dpm[i])+total[i-1];
for (i=dpm.length-1;i>0;i--)
 if (dayim>total[i-1]){
  dayim=dayim-total[i-1];
  miy=i;
  }
bsWeek=ww;
bsDate=yy+"q?+mm+"?;
bsDate2=dd;
bsYear="农历"+Yn[iyear];
bsYear2=Mn[miy]+Dn[dayim-1];
if (ss>=Ys[7]||ss<Ys[0]) bsYear=Yn[7];
/* 修改下面的表格属?/
function CAL(){
document.write("<table border='1' cellspacing='3' width='120' bordercolor='#009B00' bgcolor='#FFFFFF' height='110' cellpadding='2'");
document.write("<tr><td align='center'><b><font color=#008040>"+bsDate+"</font><br><font face='Arial' size='6' color=#FF8040>"+bsDate2+"</font><br><font color=#008040><span style='FONT-SIZE: 10.5pt'>");
document.write(bsWeek+"</span><br>"+"<br></b><font color=#9B4E00>");
document.write(bsYear+"<br>"+bsYear2+"</td></tr></table>");
}
//-->
</script><script language="javascript">CAL();</script>





Ipedo 2006-01-06 12:04 发表评论
]]>
关于C++中RTTI的编码实?/title><link>http://m.shnenglu.com/Ipedo/archive/2005/12/12/1699.html</link><dc:creator>Ipedo</dc:creator><author>Ipedo</author><pubDate>Mon, 12 Dec 2005 11:39:00 GMT</pubDate><guid>http://m.shnenglu.com/Ipedo/archive/2005/12/12/1699.html</guid><wfw:comment>http://m.shnenglu.com/Ipedo/comments/1699.html</wfw:comment><comments>http://m.shnenglu.com/Ipedo/archive/2005/12/12/1699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/Ipedo/comments/commentRss/1699.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/Ipedo/services/trackbacks/1699.html</trackback:ping><description><![CDATA[<b><font color="#ac0000">摘要Q?/font></b><br><br>  RTTI (Run-Time Type Identification)是面向对象程序设计中一U重要的技术。现行的C++标准对RTTI已经有了明确的支持。不q在某些情况下出于特D的开发需 要,我们需要自q码来实现。本文介l了一些关于RTTI的基知识及其原理和实现。  <br><br><b><font color="#ac0000">RTTI需求:</font></b><br><br>   和很多其他语a一PC++是一U静态类型语a。其数据cd是在~译期就定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求QC++? 的指针或引用(Reference)本n的类型,可能与它实际代表(指向或引?的类型ƈ不一致。有时我们需要将一个多态指针{换ؓ其实际指向对象的c? 型,需要知道运行时的类型信息,q就产生了运行时cd识别的要求?br><br>  <b><font color="#ac0000">C++对RTTI的支?/font>Q?/b><br><br>  C++提供了两个关键字typeid和dynamic_cast和一个type_infocL支持RTTIQ?br><br>  <b>dynamic_cast操作W:</b>它允许在q行时刻q行cd转换Q从而ɽE序能够在一个类层次l构安全地{换类型。dynamic_cast提供了两U{换方式,把基cL针{换成zcL针,或者把指向基类的左D{换成zcȝ引用。见下例讲述Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>void company::payroll(employee *pe) {<br>//Ҏ针{换失败,dynamic_castq回NULL<br>if(programmer *pm=dynamic_cast<programmer*>(pe)){<br>pm->bonus(); <br>}<br>}<br>void company::payroll(employee &re) {<br>try{<br>//对引用{换失败的话,则会以抛出异常来报告错误<br>programmer &rm=dynamic_cast<programmer*>(re);<br>pm->bonus();<br>}<br>catch(std::bad_cast){<br><br>}<br>}<br></programmer*></programmer*></td></tr></tbody></table><br>  q里bonus是programmer的成员函敎ͼ基类employee不具备这个特性。所以我们必M用安全的由基cdzcȝ型{换,识别出programmer指针?br><br>  <b>typeid操作W:</b>它指出指针或引用指向的对象的实际zcd?br><br>  例如Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>employee* pe=new manager;<br>typeid(*pe)==typeid(manager) //true</td></tr></tbody></table><br>  typeid可以用于作用于各U类型名Q对象和内置基本数据cd的实例、指针或者引用,当作用于指针和引用将q回它实际指向对象的cd信息。typeid的返回是type_infocd?br><br>  type_infoc:q个cȝ切定义是与~译器实现相关的Q下面是《C++ Primer》中l出的定?参考资料[2]中谈到编译器必须提供的最信息量)Q?br><br> <table bgcolor="#ffffff" width="100%"><tbody><tr><td>class type_info {<br>private:<br>type_info(const type_info&);<br>type_info& operator=( const type_info& );<br>public:<br>virtual ~type_info();<br>int operator==( const type_info& ) const;<br>int operator!=( const type_info& ) const;<br>const char* name() const;<br>};<br><br><span id="jdht799" class="txt"><b><font color="#ac0000">实现目标Q?/font></b><br><br>  <b>实现的方?/b><br><br>  <b>Ҏ一Q利用多态来取得指针或应用的实际cd信息</b><br><br>  q是一个最单的ҎQ也是作者目前所采用的办法?br><br>  实现Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>enum ClassType{<br>UObjectClass,<br>URectViewClass,<br>UDialogClass,<br>…?br>};<br>class UObject{<br>virtual char* GetClassName() const {<br>return "UObject";<br>};<br>virtual ClassType TypeOfClass(){<br>return UObjectClass;<br>};<br>};<br>class UDialog{<br>virtual char* GetClassName() const {<br>return "UDialog";<br>};<br>virtual ClassType TypeOfClass(){<br>return UDialogClass;<br>};<br>};</td></tr></tbody></table><br>  CZQ?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>UObject po=new UObject;<br>UObject pr=new URectView;<br>UObject pd=new UDialog;<br>cout << "po is a " << po->GetClassName() << endl;<br>cout << "pr is a " << pr->GetClassName() << endl;<br>cout << "pd is a " << pd->GetClassName() << endl;<br>cout<<po->TypeOfClass()==UObjectClass<<endl; typeid(po="=typeid(UObject)<br"> cout<<pr->TypeOfClass()==URectViewClass<<endl; ?""><br> cout<<pd->TypeOfClass()==UDialogClass<<endl;><br> cout<<pr->TypeOfClass()==UObjectClass<<endl;><br> cout<<po->TypeOfClass()==UDialogClass<<endl;>< td> </endl;></po-></endl;></pr-></endl;></pd-></endl;></pr-></endl;></po-></td></tr></tbody></table><br>  输出Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>po is a UObjectClass<br>pr is a URectViewClass<br>pd is a UDialogClass<br>true<br>true<br>true<br>false<br>false</td></tr></tbody></table><br>  q种实现Ҏ也就是在基类中提供一个多态的ҎQ这个方法返回一个类型信息。这h们能够知道一个指针所指向对象的具体类型,可以满一些简单的要求?br><br>  但是很显Ӟq样的方法只实现了typeid的部分功能,q存在很多缺点:<br><br>  1?用户每增加一个类必须覆盖GetClassName和TypeOfClass两个ҎQ如果忘了,会导致程序错误?br><br>  2?q里的类名和cL识信息不以实现dynamic_cast的功能,从这个意义上而言此方案根本不能称为RTTI?br><br>  3?用户必须手工l护每个cȝcd与标识,q限制了以库的方式提供给用户的可能?br><br>  4?用户必须手工dGetClassName和TypeOfClass两个ҎQ用ƈ不方ѝ?br><br>  其中上面的部分问题我们可以采用C/C++中的宏技?Macro Magic)来解冻Iq个可以在我们的最l解x案的代码中看到。下面采用方案二中将予以解决上述问题?br><br></span><span id="xvz7lt7" class="txt">  <b>Ҏ二:以一个类型表来存储类型信?/b><br><br>  q种Ҏ考虑使用一个类l构Q除了保留原有的整型cIDQ类名字W串外,增加了一个指向基cTypeInfo成员的指针?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>struct TypeInfo<br>{<br>char* className;<br>int type_id;<br>TypeInfo* pBaseClass;<br>operator== (const TypeInfo& info){<br>return this==&info;<br>}<br>operator!= (const TypeInfo& info){<br>return this!=&info;<br>}<br>};</td></tr></tbody></table><br>   从这里可以看刎ͼ以这U方式实现的RTTI不支持多重ѝ所q多重承在E序设计中ƈ非必,而且也不推荐。下面的代码中,我将为DP9900软g? 目组中类层次l构中的几个cL加RTTI功能。DP9900目中,l大部分的类都以单承方式从UObjectq个根类直接或间接承而来。这h们就 可以从UObject开始,加入我们RTTI支持所需要的数据和方法?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>class UObject<br>{<br>public:<br>bool IsKindOf(TypeInfo& cls); //判别某个对象是否属于某一个类<br>public:<br>virtual int GetTypeID(){return rttiTypeInfo.type_id;}<br>virtual char* GetTypeName(){return rttiTypeInfo.className;}<br>virtual TypeInfo& GetTypeInfo(){return rttiTypeInfo;}<br>static TypeInfo& GetTypeInfoClass(){return rttiTypeInfo;}<br>private:<br>static TypeInfo rttiTypeInfo; <br>};<br>//依次为className、type_id、pBaseClass赋?br>TypeInfo UObject::rttiTypeInfo={"UObject",0,NULL};</td></tr></tbody></table><br>   考虑从UObject这个TypeInfocM为每一个新增类的静态成员,q样一个类的所有对象将׃nTypeInfo的唯一实例。我们希望能够在E? 序运行之前就为type_id,className做好初始化,q让pBaseClass指向基类的这个TypeInfo?br><br>  每个cȝTypeInfo成员U定使用rttiTypeInfo的命名,Z避免命名冲突Q我们将其作为private成员。有了基cȝ支持q不够,当用户需要RTTI支持Q还需要自己来做一些事情:<br><br>  1?zc需要从UObjectl承?br><br>  2?drttiTypeInfo变量?br><br>  3?在类外正初始化rttiTypeInfo静态成员?br><br>  4?覆盖GetTypeID、GetTypeName、GetTypeInfo、GetTypeInfoClass四个成员函数?br><br>  如下所C:<br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>class UView:public UObject<br>{<br>public:<br>virtual int GetTypeID(){return rttiTypeInfo.type_id;} <br>virtual char* GetTypeName(){return rttiTypeInfo.className;} <br>virtual TypeInfo& GetTypeInfo(){return rttiTypeInfo;} <br>static TypeInfo& GetTypeInfoClass(){return rttiTypeInfo;} <br>private: <br>static TypeInfo rttiTypeInfo; <br>};</td></tr></tbody></table><br>  有了前三步,q样我们可以得C个不太复杂的链表――这是一늱型信息构成的"?Q与数据l构中的树的唯一差别是其指针方向相反?br><br>  q样Q从M一个UObject的子c,着pBaseClass往上找Q总能遍历它的所有父c,最l到达UObject?br><br>  在这个链表的基础上,要判别某个对象是否属于某一个类很单。下面给出UObject::IsKindOf()的实现?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>bool UObject::IsKindOf(TypeInfo& cls)<br>{<br>TypeInfo* p=&(this->GetTypeInfo());<br>while(p!=NULL){<br>if(p->type_id==cls.type_id)<br>return true;<br>p=p->pBaseClass;<br>}<br>return false;<br>}<br></td></tr></tbody></table><br>  有了IsKindOf的支持,dynamic_cast的功能也可以用一个简单的safe_cast来实玎ͼ<br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>template <typename t=""><br>inline T* safe_cast(UObject* ptr,TypeInfo& cls)<br>{<br>return (ptr->IsKindOf(cls)?(T*)ptr:NULL);<br>}</typename></td></tr></tbody></table><br>   xQ我们已l能够从功能上完成前面的目标了,不过用户要用这个类库的RTTI功能q很ȝQ要敲入一大堆对他们毫无意义的函数代码Q要在初始化 rttiTypeInfo静态成员时手工讄cID与类名。其实这些麻烦完全不必交l我们的用户Q适当采用一些宏技?Macro Magic)Q就可以让C++的预处理器来替我们写很多枯燥的代码。关于宏不是本文的重点,你可以从最l代码清单看到它们。下面再谈谈关于cID的问题?br><br>  <font color="#ac0000"><b>cID</b></font><br><br>  Z使不同类型的对象可区分,用一个给每个TypeInfo对象一个类ID来作为比较的依据是必要的?br>? 实对于我们这里的需求和实现Ҏ而言Q其实类IDq不是必ȝ。每一个支持RTTI的类都包含了一个静态TypeInfo对象Q这个对象的地址是在进E? 中全局唯一。但考虑到其他一些技术如Q动态对象创建、对象序列化{,它们可能会要求RTTIl出一个静态不变的ID。在本文的实CQ对此作了有益的? 试?br><br>  首先声明一个用来生递增cID的全局变量。再声明如下一个结构,没有数据成员Q只有一个构造函数用于初始化TypeInfo的类IDQ?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>extern int TypeInfoOrder=0;<br>struct InitTypeInfo<br>{<br>InitTypeInfo(TypeInfo* info)<br>{<br>info->type_id=TypeInfoOrder++;<br>}<br>};</td></tr></tbody></table><br>  为UObjectd一个private的静态成员及其初始化Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>class UObject<br>{<br>//…?br>private:<br>static InitTypeInfo initClassInfo;<br>};<br>InitTypeInfo UObject::initClassInfo(&(UObject::rttiTypeInfo));</td></tr></tbody></table><br>   q且Ҏ一个从UObjectz的子cMq行同样的添加。这h看刎ͼ在C++d数执行前Q启动代码将替我们调用每一个类? initClassInfo成员的构造函数InitTypeInfo::InitTypeInfo(TypeInfo* info)Q而正是这个函数替我们产生q设|了cID。InitTypeInfo的构造函数还可以替我们做其他一些有用的初始化工作,比如所有的 TypeInfo信息dC个表格里Q让我们可以很方便的遍历它?br><br>  但实践与查阅资料让我们发玎ͼ׃C++中对静态成员初始化的顺序没有明的规定Q所以这L方式产生出来的类IDq完全静态,换一个编译器~译执行产生的结果可能完全不同?br><br>  q有一个可以考虑的方案是采用某种无冲HHASH法Q将cd转换成ؓ一个唯一整数。用标准CRC32法从类型名计算Z个整C为类ID也许是个不错的想法[3]?br><br>  E序清单<br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>// URtti.h <br>#ifndef __URTTI_H__<br>#define __URTTI_H__<br><br>class UObject;<br><br>struct TypeInfo<br>{<br>char* className;<br>int type_id;<br>TypeInfo* pBaseClass;<br>operator== (const TypeInfo& info){<br>return this==&info;<br>}<br>operator!= (const TypeInfo& info){<br>return this!=&info;<br>}<br>};<br><br>inline std::ostream& operator<< (std::ostream& os,TypeInfo& info)<br>{<br>return (os<< "[" << &info << "]" << "\t"<br><< info.type_id << ":"<br><< info.className << ":"<br><< info.pBaseClass << std::endl);<br>}<br><br>extern int TypeInfoOrder;<br><br>struct InitTypeInfo<br>{<br>InitTypeInfo(/*TypeInfo* base,*/TypeInfo* info)<br>{<br>info->type_id=TypeInfoOrder++;<br>}<br>};<br><br>#define TYPEINFO_OF_CLASS(class_name) (class_name::GetTypeInfoClass())<br>#define TYPEINFO_OF_OBJ(obj_name) (obj_name.GetTypeInfo())<br>#define TYPEINFO_OF_PTR(ptr_name) (ptr_name->GetTypeInfo())<br><br>#define DECLARE_TYPEINFO(class_name) \<br>public: \<br>virtual int GetTypeID(){return TYPEINFO_MEMBER(class_name).type_id;} \<br>virtual char* GetTypeName(){return TYPEINFO_MEMBER(class_name).className;} \<br>virtual TypeInfo& GetTypeInfo(){return TYPEINFO_MEMBER(class_name);} \<br>static TypeInfo& GetTypeInfoClass(){return TYPEINFO_MEMBER(class_name);} \<br>private: \<br>static TypeInfo TYPEINFO_MEMBER(class_name); \<br>static InitTypeInfo initClassInfo; \<br><br>#define IMPLEMENT_TYPEINFO(class_name,base_name) \<br>TypeInfo class_name::TYPEINFO_MEMBER(class_name)= \<br>{#class_name,0,&(base_name::GetTypeInfoClass())}; \<br>InitTypeInfo class_name::initClassInfo(&(class_name::TYPEINFO_MEMBER(class_name)));<br><br>#define DYNAMIC_CAST(object_ptr,class_name) \<br>safe_cast<class_name>(object_ptr,TYPEINFO_OF_CLASS(class_name))<br><br>#define TYPEINFO_MEMBER(class_name) rttiTypeInfo<br><br>class UObject<br>{<br>public:<br>bool IsKindOf(TypeInfo& cls);<br>public:<br>virtual int GetTypeID(){return TYPEINFO_MEMBER(UObject).type_id;}<br>virtual char* GetTypeName(){return TYPEINFO_MEMBER(UObject).className;}<br>virtual TypeInfo& GetTypeInfo(){return TYPEINFO_MEMBER(UObject);}<br>static TypeInfo& GetTypeInfoClass(){return TYPEINFO_MEMBER(UObject);}<br>private:<br>static TypeInfo TYPEINFO_MEMBER(UObject);<br>static InitTypeInfo initClassInfo;<br>};<br><br>template <typename t=""><br>inline T* safe_cast(UObject* ptr,TypeInfo& cls)<br>{<br>return (ptr->IsKindOf(cls)?(T*)ptr:NULL);<br>}<br>#endif<br>// URtti.cpp <br>#include "urtti.h"<br><br>extern int TypeInfoOrder=0;<br><br>TypeInfo UObject::TYPEINFO_MEMBER(UObject)={"UObject",0,NULL};<br>InitTypeInfo UObject::initClassInfo(&(UObject::TYPEINFO_MEMBER(UObject)));<br><br>bool UObject::IsKindOf(TypeInfo& cls)<br>{<br>TypeInfo* p=&(this->GetTypeInfo());<br>while(p!=NULL){<br>if(p->type_id==cls.type_id)<br>return true;<br>p=p->pBaseClass;<br>}<br>return false;<br>}<br>// mail.cpp <br>#include <iostream><br>#include "urtti.h"<br>using namespace std;<br><br>class UView:public UObject<br>{<br>DECLARE_TYPEINFO(UView)<br>};<br>IMPLEMENT_TYPEINFO(UView,UObject)<br><br>class UGraph:public UObject<br>{<br>DECLARE_TYPEINFO(UGraph)<br>};<br>IMPLEMENT_TYPEINFO(UGraph,UObject)<br><br>void main()<br>{<br>UObject* po=new UObject;<br>UView* pv=new UView;<br>UObject* pg=new UGraph;<br>if(DYNAMIC_CAST(po,UView)) <br>cout << "po => UView succeed" << std::endl;<br>else<br>cout << "po => UView failed" << std::endl;<br>if(DYNAMIC_CAST(pv,UView))<br>cout << "pv => UView succeed" << std::endl;<br>else<br>cout << "pv => UView failed" << std::endl;<br>if(DYNAMIC_CAST(po,UGraph)) <br>cout << "po => UGraph succeed" << std::endl;<br>else<br>cout << "po => UGraph failed" << std::endl;<br>if(DYNAMIC_CAST(pg,UGraph))<br>cout << "pg => UGraph succeed" << std::endl;<br>else<br>cout << "pg => UGraph failed" << std::endl;<br>}</iostream></typename></class_name></td></tr></tbody></table><br>  <b><font color="#ac0000">实现l果</font></b><br><br>  本文实现了如下几个宏来支持RTTIQ它们的使用Ҏ都可以在上面的代码中扑ֈQ?br>   <table align="center" border="1" cellspacing="0" width="627"> <tbody> <tr> <td>宏函?/td> <td>功能及参数说?/td></tr> <tr> <td>DECLARE_TYPEINFO(class_name) </td> <td>为类dRTTI功能攑֜cd明的起始位置</td></tr> <tr> <td>IMPLEMENT_TYPEINFO(class_name,base)</td> <td>同上Q放在类定义M位置</td></tr> <tr> <td>TYPEINFO_OF_CLASS(class_name)</td> <td>相当于typeid(cd)</td></tr> <tr> <td>TYPEINFO_OF_OBJ(obj_name)</td> <td>相当于typeid(对象)</td></tr> <tr> <td>TYPEINFO_OF_PTR(ptr_name)</td> <td>相当于typeid(指针)</td></tr> <tr> <td>DYNAMIC_CAST(object_ptr,class_name)</td> <td>相当于dynamic_cast<class_name>object_ptr</class_name></td></tr></tbody></table></span><br><p align="right"><br></p><br><span id="9f9l7r1" class="txt">  <b><font color="#ac0000">性能试</font></b><br><br>  <b>试代码Q?/b><br><br>  q里使用相同ơ数的DYNAMIC_CAST和dynamic_castq行Ҏ试Q在VC6.0下编译运行,使用默认的Release~译配置选项。ؓ了避免编译器优化D的不公^试l果Q我在@环中加入了无意义的计数操作?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>void main()<br>{<br>UObject* po=new UObject;<br>UView* pv=new UView;<br>UObject* pg=new UGraph;<br>int a,b,c,d;<br>a=b=c=d=0;<br>const int times=30000000;<br>cerr << "旉试输出Q? << endl;<br>cerr << "start my DYNAMIC_CAST at: " << time(NULL) << endl;<br>for(int i=0;i<times;i++){><br> if(DYNAMIC_CAST(po,UView)) a++; else a--;<br>if(DYNAMIC_CAST(pv,UView)) b++; else b--;<br>if(DYNAMIC_CAST(po,UGraph)) c++; else c--;<br>if(DYNAMIC_CAST(pg,UGraph)) d++; else d--;<br>}<br>cerr << "end my DYNAMIC_CAST at: " << time(NULL) << endl;<br>cerr << "start c++ dynamic_cast at: " << time(NULL) << endl;<br>for(i=0;i<times;i++){><br> if(dynamic_cast<uview*>(po)) a++; else a--;<br>if(dynamic_cast<uview*>(pv)) b++; else b--;<br>if(dynamic_cast<ugraph*>(po)) c++; else c--;<br>if(dynamic_cast<ugraph*>(pg)) d++; else d--;<br>}<br>cerr << "end c++ dynamic_cast at: " << time(NULL) << endl;<br>cerr << a << b << c << d << endl;<br>}</ugraph*></ugraph*></uview*></uview*></times;i++){></times;i++){></td></tr></tbody></table><br>  q行l果Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>start my DYNAMIC_CAST at: 1021512140<br>end my DYNAMIC_CAST at: 1021512145<br>start c++ dynamic_cast at: 1021512145<br>end c++ dynamic_cast at: 1021512160</td></tr></tbody></table><br>  q是上述条g下的试输出Q我们可以看刎ͼ本文实现的这个精RTTIҎq行DYNAMIC_CAST的时间开销只有dynamic_cast?/3。ؓ了得到更全面的数据,q进行了DEBUG~译配置选项下的试?br><br>  输出Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>start my DYNAMIC_CAST at: 1021512041<br>end my DYNAMIC_CAST at: 1021512044<br>start c++ dynamic_cast at: 1021512044<br>end c++ dynamic_cast at: 1021512059</td></tr></tbody></table><br>   q种情况下DYNAMIC_CASTq行速度要比dynamic_cast慢一倍左叟뀂如果在Release~译配置选项下将UObject:: IsKindOfҎҎ如下inline函数Q我们将得到更让人兴奋的l果QDYNAMIC_CASTq行旉只有dynamic_cast? 1/5Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>inline bool UObject::IsKindOf(TypeInfo& cls)<br>{<br>for(TypeInfo* p=&(this->GetTypeInfo());p!=NULL;p=p->pBaseClass)<br>if(p==&cls) return true;<br>return false;<br>}</td></tr></tbody></table><br>  输出Q?br><br> <table bgcolor="#ffffff" width="100%"> <tbody> <tr> <td>start my DYNAMIC_CAST at: 1021512041<br>end my DYNAMIC_CAST at: 1021512044<br>start c++ dynamic_cast at: 1021512044<br>end c++ dynamic_cast at: 1021512059</td></tr></tbody></table><br>  <font color="#ac0000"><b>l论Q?/b></font><br><br>   由本文的实践可以得出l论Q自己动手编码实现RTTI是简单可行的。这L实现可以在编译器优秀的代码优化中表现出比dynamic_cast更好的? 能,而且没有带来q多的存储开销。本文的RTTI以性能Z要设计目标,在实C一定程度上受到了MFC的媄响。适于嵌入式环境?/span><br></td></tr></tbody></table><img src ="http://m.shnenglu.com/Ipedo/aggbug/1699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/Ipedo/" target="_blank">Ipedo</a> 2005-12-12 19:39 <a href="http://m.shnenglu.com/Ipedo/archive/2005/12/12/1699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cQ+随笔1http://m.shnenglu.com/Ipedo/archive/2005/12/06/1567.htmlIpedoIpedoTue, 06 Dec 2005 09:01:00 GMThttp://m.shnenglu.com/Ipedo/archive/2005/12/06/1567.htmlhttp://m.shnenglu.com/Ipedo/comments/1567.htmlhttp://m.shnenglu.com/Ipedo/archive/2005/12/06/1567.html#Feedback0http://m.shnenglu.com/Ipedo/comments/commentRss/1567.htmlhttp://m.shnenglu.com/Ipedo/services/trackbacks/1567.html2、当函数参数是大的结构的时候,量使用l构的指针或引用Q避免大的内存操作(复制的开销Q,参数使用的时候注意不希望函数内改变原来值时Q应该加上const修饰W号Q?BR>3、用多重承时应该避免出现DODQ钻矛_l承树)Q虚l承可以解决q个问题Q但是应用时应该量避免q二者;
4、尽量多的用constQ?BR>5、引用只能被初始化一ơ,指针可以被多ơ赋|可以q么_引用是const指针Q引用必dx的时候初始化Q指针则不用Q引用不能ؓNULLQ也不能new和deleteQ它更象一个对象;
6、四UcQ+风格的强制{换,static_cast(规定被{换的二者存在联p,在同一l承体系?Qconst_castQ将帔R转换为非帔RQ,reinterpret_castQ{换Q何类型,同c的强制{换)Qdynamic_castQ动态类型{换,需要编译器支持q行期类型信息RTTIQ?img src ="http://m.shnenglu.com/Ipedo/aggbug/1567.html" width = "1" height = "1" />

Ipedo 2005-12-06 17:01 发表评论
]]>
实用宏-QvcQ+中方便注?/title><link>http://m.shnenglu.com/Ipedo/archive/2005/12/02/1495.html</link><dc:creator>Ipedo</dc:creator><author>Ipedo</author><pubDate>Fri, 02 Dec 2005 06:46:00 GMT</pubDate><guid>http://m.shnenglu.com/Ipedo/archive/2005/12/02/1495.html</guid><wfw:comment>http://m.shnenglu.com/Ipedo/comments/1495.html</wfw:comment><comments>http://m.shnenglu.com/Ipedo/archive/2005/12/02/1495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/Ipedo/comments/commentRss/1495.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/Ipedo/services/trackbacks/1495.html</trackback:ping><description><![CDATA[<P>    'd文g头定?BR>    Public Sub AddFileHead()</P> <P>        Dim objTextSelection As TextSelection<BR>        Dim comment As String<BR>        objTextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection)<BR>        'objTextSelection.LineUp()<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "http://==================================================================="<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "/** \file"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*  Filename: " + DTE.ActiveDocument.Name<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*  Desc:"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*  His:      Ipedo create @ " + Date.Now<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*/"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "http://==================================================================="</P> <P>    End Sub<BR>    'd文g函数定义<BR>    Public Sub AddFunctionHead()</P> <P>        Dim objTextSelection As TextSelection<BR>        Dim comment As String<BR>        objTextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection)<BR>        'objTextSelection.LineUp()<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "/** \brief"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + " " + "* 函数功能Q?<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "* 函数说明Q?<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "* \param  _f1   W一个Q点参?"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "* \param  _f2   W二个Q点参?"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "* \return  bool   q回两个点数是否相{?q回true时表C相{?"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "* 法描述Q?<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "* Q描q内容)"<BR>        objTextSelection.NewLine()<BR>        objTextSelection.Text = comment + "*/"</P> <P>    End Sub<BR><BR>    Sub 文g注释()<BR>        DTE.ActiveDocument.Selection.Text = "http://==================================================================="<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        DTE.ActiveDocument.Selection.Text = "/** \file  "<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        'DTE.ActiveDocument.Selection.Indent()<BR>        DTE.ActiveDocument.Selection.Text = "* Filename :   " + DTE.ActiveDocument.Name<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        DTE.ActiveDocument.Selection.Text = "* Desc     :   "<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        DTE.ActiveDocument.Selection.Text = "* His      :   Windy create @" + Date.Now<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        DTE.ActiveDocument.Selection.DeleteLeft()<BR>        DTE.ActiveDocument.Selection.Text = "*/"<BR>        DTE.ActiveDocument.Selection.NewLine()<BR>        DTE.ActiveDocument.Selection.Text = "http://==================================================================="<BR>        DTE.ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText)<BR>    End Sub</P><img src ="http://m.shnenglu.com/Ipedo/aggbug/1495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/Ipedo/" target="_blank">Ipedo</a> 2005-12-02 14:46 <a href="http://m.shnenglu.com/Ipedo/archive/2005/12/02/1495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BMP文gl构 http://m.shnenglu.com/Ipedo/archive/2005/11/12/1104.htmlIpedoIpedoSat, 12 Nov 2005 09:34:00 GMThttp://m.shnenglu.com/Ipedo/archive/2005/11/12/1104.htmlhttp://m.shnenglu.com/Ipedo/comments/1104.htmlhttp://m.shnenglu.com/Ipedo/archive/2005/11/12/1104.html#Feedback2http://m.shnenglu.com/Ipedo/comments/commentRss/1104.htmlhttp://m.shnenglu.com/Ipedo/services/trackbacks/1104.html---- 1. BMP文gl成

---- BMP文g由文件头、位图信息头、颜色信息和囑Ş数据四部分组成?

---- 2. BMP文g?

---- BMP文g头数据结构含有BMP文g的类型、文件大和位图起始位置{信息?

---- 其结构定义如?

typedef struct tagBITMAPFILEHEADER
{
WORDbfType;   // 位图文g的类型,必须为BM
DWORD   bfSize;   // 位图文g的大,以字节ؓ单位
WORDbfReserved1;  // 位图文g保留字,必须?
WORDbfReserved2;  // 位图文g保留字,必须?
DWORD   bfOffBits; // 位图数据的v始位|,以相对于位图
// 文g头的偏移量表C,以字节ؓ单位
} BITMAPFILEHEADER;

---- 3. 位图信息?

BMP位图信息头数据用于说明位囄寸{信息?
typedef struct tagBITMAPINFOHEADER{
   DWORD  biSize;   // 本结构所占用字节?
   LONGbiWidth;  // 位图的宽度,以像素ؓ单位
   LONGbiHeight; // 位图的高度,以像素ؓ单位
   WORD   biPlanes; // 目标讑֤的别,必须?
   WORD   biBitCount// 每个像素所需的位敎ͼ必须?(双色),
  // 4(16?Q?(256??4(真彩?之一
   DWORD  biCompression;   // 位图压羃cdQ必L 0(不压~?,
  // 1(BI_RLE8压羃cd)?(BI_RLE4压羃cd)之一
   DWORD  biSizeImage; // 位图的大,以字节ؓ单位
   LONGbiXPelsPerMeter; // 位图水^分L率,每米像素?
   LONGbiYPelsPerMeter;  // 位图垂直分L率,每米像素?
   DWORD  biClrUsed;// 位图实际使用的颜色表中的颜色?
   DWORD  biClrImportant;// 位图昄q程中重要的颜色?
} BITMAPINFOHEADER;

---- 4. 颜色?

---- 颜色表用于说明位图中的颜Ԍ它有若干个表,每一个表Ҏ一个RGBQUADcd的结构,定义一U颜艌ӀRGBQUADl构的定义如?

typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色的亮?D围ؓ0-255)
BYTErgbGreen;   // l色的亮?D围ؓ0-255)
BYTErgbRed; // U色的亮?D围ؓ0-255)
BYTErgbReserved;// 保留Q必Mؓ0
} RGBQUAD;
颜色表中RGBQUADl构数据的个数有biBitCount来确?
当biBitCount=1,4,8Ӟ分别?,16,256个表?
当biBitCount=24Ӟ没有颜色表项?
   位图信息头和颜色表组成位图信息,BITMAPINFOl构定义如下:
typedef struct tagBITMAPINFO {
   BITMAPINFOHEADER bmiHeader;   // 位图信息?
   RGBQUAD  bmiColors[1];  // 颜色?
} BITMAPINFO;

---- 5. 位图数据

---- 位图数据记录了位囄每一个像素|记录序是在扫描行内是从左到?扫描行之间是从下C。位囄一个像素值所占的字节?

当biBitCount=1Ӟ8个像素占1个字?
当biBitCount=4Ӟ2个像素占1个字?
当biBitCount=8Ӟ1个像素占1个字?
当biBitCount=24?1个像素占3个字?

Windows规定一个扫描行所占的字节数必L 4的倍数(即以long为单?,不的以0填充Q?

一个扫描行所占的字节数计方? DataSizePerLine= (biWidth* biBitCount+31)/8;

// 一个扫描行所占的字节?DataSizePerLine= DataSizePerLine/4*4; // 字节数必L4的倍数

位图数据的大?不压~情况下): DataSize= DataSizePerLine* biHeight;



Ipedo 2005-11-12 17:34 发表评论
]]>
关于MFC对象http://m.shnenglu.com/Ipedo/archive/2005/11/12/1103.htmlIpedoIpedoSat, 12 Nov 2005 08:57:00 GMThttp://m.shnenglu.com/Ipedo/archive/2005/11/12/1103.htmlhttp://m.shnenglu.com/Ipedo/comments/1103.htmlhttp://m.shnenglu.com/Ipedo/archive/2005/11/12/1103.html#Feedback0http://m.shnenglu.com/Ipedo/comments/commentRss/1103.htmlhttp://m.shnenglu.com/Ipedo/services/trackbacks/1103.html阅读全文

Ipedo 2005-11-12 16:57 发表评论
]]>
内存泄露?/title><link>http://m.shnenglu.com/Ipedo/archive/2005/10/27/867.html</link><dc:creator>Ipedo</dc:creator><author>Ipedo</author><pubDate>Thu, 27 Oct 2005 07:49:00 GMT</pubDate><guid>http://m.shnenglu.com/Ipedo/archive/2005/10/27/867.html</guid><wfw:comment>http://m.shnenglu.com/Ipedo/comments/867.html</wfw:comment><comments>http://m.shnenglu.com/Ipedo/archive/2005/10/27/867.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.shnenglu.com/Ipedo/comments/commentRss/867.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/Ipedo/services/trackbacks/867.html</trackback:ping><description><![CDATA[    cQ+中检内存泄漏可以引入系l定义的宏来查看Q内存在哪个位置泄漏<BR><BR>文g开始处加入下列定义<BR>#define _CRTDBG_MAP_ALLOC<BR>#include <stdlib.h><BR>#include <crtdbg.h><BR><BR>E序退出时加入以下函数Q?BR><BR>_CrtDumpMemoryLeaks();<BR><BR>如果有泄漏会昄<BR>e:\myproject\mltithrd.14\mltithrd.cpp(95) : {68} client block at 0x00372550, subtype c0, 144 bytes long.<BR>a CMultiDocTemplate object at $00372550, 144 bytes long<img src ="http://m.shnenglu.com/Ipedo/aggbug/867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/Ipedo/" target="_blank">Ipedo</a> 2005-10-27 15:49 <a href="http://m.shnenglu.com/Ipedo/archive/2005/10/27/867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于list control控ghttp://m.shnenglu.com/Ipedo/archive/2005/10/26/861.htmlIpedoIpedoWed, 26 Oct 2005 06:44:00 GMThttp://m.shnenglu.com/Ipedo/archive/2005/10/26/861.htmlhttp://m.shnenglu.com/Ipedo/comments/861.htmlhttp://m.shnenglu.com/Ipedo/archive/2005/10/26/861.html#Feedback1http://m.shnenglu.com/Ipedo/comments/commentRss/861.htmlhttp://m.shnenglu.com/Ipedo/services/trackbacks/861.htmlm_list1.SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES );
LVS_EX_FULLROWSELECT表示可以点中行中的Q意一个列选中q一条记?BR>LVS_EX_GRIDLINES表示列之间有分隔W号
LVS_EX_CHECKBOXES 表示每一行第一列是checkbox


Ipedo 2005-10-26 14:44 发表评论
]]>
新的开?/title><link>http://m.shnenglu.com/Ipedo/archive/2005/10/26/857.html</link><dc:creator>Ipedo</dc:creator><author>Ipedo</author><pubDate>Wed, 26 Oct 2005 01:47:00 GMT</pubDate><guid>http://m.shnenglu.com/Ipedo/archive/2005/10/26/857.html</guid><wfw:comment>http://m.shnenglu.com/Ipedo/comments/857.html</wfw:comment><comments>http://m.shnenglu.com/Ipedo/archive/2005/10/26/857.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/Ipedo/comments/commentRss/857.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/Ipedo/services/trackbacks/857.html</trackback:ping><description><![CDATA[     摘要:     今天开始想写点东西了,很多时候写q的代码想翻出来看看是找不刎ͼ发在blog上也许可以提供一个很好的查询手段?nbsp;    前些天帮同学写了一个数据库blob存取的一个小E序Q从|上找了些别人的代码改了改,作ؓ一个图片存储和查看的小工具也还不错Q发到这里备份v来MyMfcPhoto?nbsp;  &nb...  <a href='http://m.shnenglu.com/Ipedo/archive/2005/10/26/857.html'>阅读全文</a><img src ="http://m.shnenglu.com/Ipedo/aggbug/857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/Ipedo/" target="_blank">Ipedo</a> 2005-10-26 09:47 <a href="http://m.shnenglu.com/Ipedo/archive/2005/10/26/857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.168lala.cn" target="_blank">ٸƷþ</a>| <a href="http://www.spfklnl.cn" target="_blank">ھƷþ鶹Ħ</a>| <a href="http://www.iaftvc.cn" target="_blank">þAV뾫Ʒ</a>| <a href="http://www.aion999.cn" target="_blank">þ99þ99Ʒӿ</a>| <a href="http://www.niutuan.com.cn" target="_blank">ɫþþþþþС˵</a>| <a href="http://www.5billion.com.cn" target="_blank">þþþþҹƷƷ</a>| <a href="http://www.shyk888.cn" target="_blank">Ʒþþ</a>| <a href="http://www.kengsai.cn" target="_blank">ɫۺϺϾþۺӿ</a>| <a href="http://www.nanning315.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.shenhoulong.com.cn" target="_blank">þþƷƵ91</a>| <a href="http://www.enikl.cn" target="_blank">þAëƬѹۿ</a>| <a href="http://www.qi-pin.cn" target="_blank">þseƷһӰԺ</a>| <a href="http://www.zhzzbjb.cn" target="_blank">þþŷղa </a>| <a href="http://www.hvgt.cn" target="_blank">ŷҹAŴƬþ</a>| <a href="http://www.918gn.cn" target="_blank">þóۺɫۺ</a>| <a href="http://www.baotou8.cn" target="_blank">þ97þ97Ʒӿ</a>| <a href="http://www.fm935.cn" target="_blank">þþƷaĻ</a>| <a href="http://www.qinghaichu.cn" target="_blank">þþ뾫Ʒҹ</a>| <a href="http://www.xx0759.cn" target="_blank">99ƷþþƷ</a>| <a href="http://www.cqxuexi.cn" target="_blank">ٸ߳ҽоþþþþ</a>| <a href="http://www.lovebuyhome.com.cn" target="_blank">ĻhdþþƷ </a>| <a href="http://www.999966.com.cn" target="_blank">ݺɫþ</a>| <a href="http://www.fragrancebeads.cn" target="_blank">ŷͽxxxxѿþþ</a>| <a href="http://www.k1822.cn" target="_blank">žžþ99ۺһ</a>| <a href="http://www.hxsnw.com.cn" target="_blank">רþۺϾĻ </a>| <a href="http://www.paysearch.cn" target="_blank">ݺɫþþһ</a>| <a href="http://www.kntcom.cn" target="_blank">һƷ˾þ</a>| <a href="http://www.yaott2.cn" target="_blank">ۺϾþü</a>| <a href="http://www.sxgyhqm.cn" target="_blank">Ůþþ</a>| <a href="http://www.qcb8.cn" target="_blank">þùƷ-þþƷ</a>| <a href="http://www.hktjj.cn" target="_blank">˸ŮѲžþþ</a>| <a href="http://www.bken.cn" target="_blank">þۺϾƷ</a>| <a href="http://www.23tlbb.cn" target="_blank">޹һ˾þþƷ</a>| <a href="http://www.fayongshicai.cn" target="_blank">һƷ˾þ</a>| <a href="http://www.35zz.cn" target="_blank">ŷպƷþ </a>| <a href="http://www.292284.cn" target="_blank">Ʒһþ㽶߿</a>| <a href="http://www.ki71.cn" target="_blank">þۺϸϾþúݺݺ97ɫ69</a>| <a href="http://www.vgunu.cn" target="_blank">þþƷAVþþ</a>| <a href="http://www.rhtyyls.cn" target="_blank">ƷۺϾþþþþ98</a>| <a href="http://www.ltak.cn" target="_blank">þþƷ99þ޶</a>| <a href="http://www.dfyxw.cn" target="_blank">69ۺϾþþƷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>