<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_万事皆相通，编程亦如此</title><subtitle type="text">要学会好好的懒惰</subtitle><id>http://feed.cnblogs.com/blog/u/32885/rss</id><updated>2011-06-08T07:33:49Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/32885/rss"/><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/12/29/1920912.html</id><title type="text">如何修复.Net和COM之间枚举名称的问题(续）</title><summary type="text">前面我们有一篇“如何修复.Net和COM之间枚举名称的问题”，按照那篇文章的方法做可以解决编译问题，但是运行的时候会出现run-time error “429” , ActiveX不能创建的问题，关键...</summary><published>2010-12-29T09:32:00Z</published><updated>2010-12-29T09:32:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/12/29/1920912.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/12/29/1920912.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前面我们有一篇“如何修复.Net和COM之间枚举名称的问题”，按照那篇文章的方法做可以解决编译问题，但是运行的时候会出现run-time error “429” , ActiveX不能创建的问题，关键问题是因为.net程序集没有注册的原因造成的，需要通过regasm注册一下就解决了。具体操作步骤是：&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 编写您需要.net程序&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 使用以下批处理来导出tlb文件&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;@echo Off  &lt;p&gt;set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"  &lt;p&gt;%binDir%\tlbexp PCTSEventLog.dll  &lt;p&gt;%binDir%\tlbexp PCTSAuditLog.dll  &lt;p&gt;rem "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Regasm" PCTSEventLog.dll /regfile:PCTSEventLog.reg  &lt;p&gt;rem "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Regasm" PCTSAuditLog.dll /regfile:PCTSAuditLog.reg  &lt;p&gt;Call "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\OleView.Exe"  &lt;p&gt;rem Pause&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 打开ole view之后，导出idl文件，然后使用下面的命令进行编译 &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;@echo off  &lt;p&gt;Call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86  &lt;p&gt;set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"  &lt;p&gt;%binDir%\MIDL PCTSEventLog.idl  &lt;p&gt;%binDir%\MIDL PCTSAuditLog.idl  &lt;p&gt;Pause&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 编译成功之后，将新生成的dll和tlb文件拷贝到目标机器上。然后使用以下命令进行注册，并把程序集加入到GAC(全集共享缓存区)： &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;@echo off  &lt;p&gt;gacutil /i PCTSEventLog.dll  &lt;p&gt;gacutil /i PCTSAuditLog.dll  &lt;p&gt;gacutil /i Interop.ERConnect.dll  &lt;p&gt;regasm PCTSEventLog.dll  &lt;p&gt;regasm PCTSAuditLog.dll  &lt;p&gt;regasm Interop.ERConnect.dll  &lt;p&gt;rem regedit /s PCTSEventLog.reg  &lt;p&gt;rem regedit /s PCTSAuditLog.reg  &lt;p&gt;rem "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regtlibv12" "C:\Work\Bin\Release\Net\PCTSEventLog.tlb"  &lt;p&gt;rem "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regtlibv12" "C:\Work\Bin\Release\Net\PCTSAuditLog.tlb"  &lt;p&gt;rem Regasm PCTSAuditLog.dll /t  &lt;p&gt;rem Regasm PCTSAuditLog.dll /t /u  &lt;p&gt;rem Pause&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 接下来您就可以在COM中调用.net的程序集了。 &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 当多次进行修改调试的时候，您可以使用下面的命令进行反注册： &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;@echo off  &lt;p&gt;gacutil /u PCTSEventLog  &lt;p&gt;gacutil /u PCTSAuditLog  &lt;p&gt;gacutil /u Interop.ERConnect.dll  &lt;p&gt;Regasm PCTSEventLog.dll /t /u  &lt;p&gt;Regasm PCTSAuditLog.dll /t /u  &lt;p&gt;Regasm Interop.ERConnect.dll /u  &lt;p&gt;rem "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regtlibv12" /u PCTSEventLog.tlb  &lt;p&gt;rem "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regtlibv12" /u PCTSAuditLog.tlb  &lt;p&gt;rem Pause&lt;/p&gt;&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp; 一切就大功告成了！！ &lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1920912.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/12/29/1920912.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/12/28/1918689.html</id><title type="text">通过修改IP/TCP包头伪造IP来与网页进行交互</title><summary type="text">从某种意义上说，如果能够制造TCP伪连接，那么D.o.S也就比较容易实现了。以前LionD8就曾经用这个思路做出了一个新型D.o.S，而今天，我用的也是这个思路。但是，如果直接伪造TCP三次握手而不作其他任何处理，那却是不行的。因为，当攻击的目标主机接收到我们发过去的伪造的SYN包后会发回一个SYN+ACK包(也就是第二次握手)。而当我们的系统收到这个SYN+ACK包后，由于系统内并没有发起真正的...</summary><published>2010-12-28T02:35:00Z</published><updated>2010-12-28T02:35:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/12/28/1918689.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/12/28/1918689.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font size="3"&gt;从某种意义上说，如果能够制造TCP伪连接，那么D.o.S也就比较容易实现了。以前LionD8就曾经用这个思路做出了一个新型D.o.S，而今天，我用的也是这个思路。但是，如果直接伪造TCP三次握手而不作其他任何处理，那却是不行的。因为，当攻击的目标主机接收到我们发过去的伪造的SYN包后会发回一个SYN+ACK包(也就是第二次握手)。而当我们的系统收到这个SYN+ACK包后，由于系统内并没有发起真正的TCP连接，因此系统会发回一个RST包，这个包将使目标主机重置连接。这样，这个伪连接就建立失败了。 &lt;br&gt;要解决这个问题，办法有不少，而我这里要用的方法就是ARP欺骗。首先，我们要对目标主机进行ARP欺骗，让它认为我们是同一网段中的另一台机器。然后我们就可以伪装这台机器向目标主机发起TCP伪连接了。这样一来，即使目标主机返回一个SYN+ACK包，这个包也不会进入到我们的系统(因为这个包的目的IP不会是我们而应该是我们伪装的那台主机的IP)，这样，我们的系统也不会向目标主机发送RST包了。 &lt;br&gt;打个比方，假设我们是主机A，现在我想要攻击主机B。首先，我先伪装主机C对B进行ARP欺骗(以C的IP地址和A的MAC地址构造ARP应答包发送到B)，这样，B的ARP缓存中就会记录下C的IP对应A的MAC地址。然后，我们再以C的IP为源IP构造SYN数据包，向B发起TCP伪连接。当B收到这个SYN包之后，它会构造一个SYN+ACK包发往C。但是，由于此时在B的ARP缓存中记录着：C的IP对应A的MAC地址，因此，这个SYN+ACK包实际上被发送到了A。虽然，这个包将被A的系统所丢弃(因为这个包的目的IP是C的IP而不是A的IP，所以A的系统将会丢弃这个包)，但是，我们仍然可以从链路层直接将这个数据帧获取下来。得到了这个SYN+ACK包之后，我们需要再次伪装C向B发回一个ACK包完成第三次握手。这样，TCP初始化连接的三次握手都完成了，我们的伪连接也成功建立了！ &lt;br&gt;伪连接建立之后，我们还可以继续向目标主机发送数据，来保证TCP连接的存活。 &lt;br&gt;这里，有几个需要注意的问题：首先，为了保证攻击过程中目标主机的ARP缓存不被更改，我们需要持续不断的对其进行ARP欺骗；第二，为了防止在攻击过程中我们伪装的主机向目标主机发起通信，刷新目标主机的ARP缓存，对我们的攻击造成影响，我们还可以对伪装主机也同时进行ARP欺骗，以增加攻击成功的几率&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;TCP&amp;nbsp;&amp;nbsp; 序列号预测 &lt;br&gt;IP只是发送数据包，并且保证它的完整性。如果不能收到完整的IP数据包，IP会向源地址发送一个ICMP&amp;nbsp;&amp;nbsp; 错误信息，希望重新处理。然而这个包也可能丢失。由于IP是非面向连接的，所以不保持任何连接状态的信息。每个IP数据包被松散地发送出去，而不关心前一个和后一个数据包的情况。由此看出，可以对IP堆栈进行修改，在源地址和目的地址中放入任意满足要求的IP地址，也就是说，提供虚假的IP地址。 &lt;br&gt;TCP提供可靠传输。可靠性是由数据包中的多位控制字来提供的，其中最重要的是数据序列和数据确认，分别用SYN和ACK来表示。TCP&amp;nbsp;&amp;nbsp; 向每一个数据字节分配一个序列号，并且可以向已成功接收的、源地址所发送的数据包表示确认（目的地址ACK&amp;nbsp;&amp;nbsp; 所确认的数据包序列是源地址的数据包序列，而不是自己发送的数据包序列）。ACK在确认的同时，还携带了下一个期望获得的数据序列号。显然，TCP提供的这种可靠性相对于IP来说更难于愚弄。 &lt;br&gt;序列编号、确认和其它标志信息&amp;nbsp;&amp;nbsp; &lt;br&gt;由于TCP是基于可靠性的，它能够提供处理数据包丢失，重复或是顺序紊乱等不良情况的机制。实际上，通过向所传送出的所有字节分配序列编号，并且期待接收端对发送端所发出的数据提供收讫确认，TCP&amp;nbsp;&amp;nbsp; 就能保证可靠的传送。接收端利用序列号确保数据的先后顺序，除去重复的数据包。TCP&amp;nbsp;&amp;nbsp; 序列编号可以看作是32位的计数器。它们从0至2^32－1&amp;nbsp;&amp;nbsp; 排列。每一个TCP连接（由一定的标示位来表示）交换的数据都是顺序编号的。在TCP数据包中定义序列号（SYN）的标示位位于数据段的前端。确认位（ACK）对所接收的数据进行确认，并且指出下一个期待接收的数据序列号。&amp;nbsp;&amp;nbsp; &lt;br&gt;TCP通过滑动窗口的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下，为了保证数据不丢失，显然需要进行流量控制，协调好通信双方的工作节奏。所谓滑动窗口，可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区。由于窗口由16位bit所定义，所以接收端TCP&amp;nbsp;&amp;nbsp; 能最大提供65535个字节的缓冲。由此，可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号。&amp;nbsp;&amp;nbsp; &lt;br&gt;其它TCP标示位有RST（连接复位，Reset&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; connection）、PSH（压入功能，Push&amp;nbsp;&amp;nbsp; function）和FIN&amp;nbsp;&amp;nbsp; （发送者无数据，No&amp;nbsp;&amp;nbsp; more&amp;nbsp;&amp;nbsp; data&amp;nbsp;&amp;nbsp; from&amp;nbsp;&amp;nbsp; sender）。如果RST&amp;nbsp;&amp;nbsp; 被接收，TCP连接将立即断开。RST&amp;nbsp;&amp;nbsp; 通常在接收端接收到一个与当前连接不相关的数据包时被发送。有些时候，TCP模块需要立即传送数据而不能等整段都充满时再传。一个高层的进程将会触发在TCP头部的PSH标示，并且告诉TCP模块立即将所有排列好的数据发给数据接收端。FIN&amp;nbsp;&amp;nbsp; 表示一个应用连接结束。当接收端接收到FIN时，确认它，认为将接收不到任何数据了。&amp;nbsp;&amp;nbsp; &lt;br&gt;TCP序列号预测最早是由Morris对这一安全漏洞进行阐述的。他使用TCP序列号预测，即使是没有从服务器得到任何响应，&amp;nbsp;&amp;nbsp; 来产生一个TCP包序列。这使得他能欺骗在本地网络上的主机。 &lt;br&gt;通常TCP连接建立一个包括3次握手的序列。客户选择和传输一个初始的序列号（SEQ标志）ISN&amp;nbsp;&amp;nbsp; C，并设置标志位SYN=１，告诉服务器它需要建立连接。服务器确认这个传输，并发送它本身的序列号ISN&amp;nbsp;&amp;nbsp; S，并设置标志位ACK，同时告知下一个期待获得的数据序列号是ISN=1。客户再确认它。在这三次确认后，开始传输数据。整个过程如下所示：(C:Client&amp;nbsp;&amp;nbsp; S:Server) &lt;br&gt;C---S:&amp;nbsp;&amp;nbsp; SYN(ISN&amp;nbsp;&amp;nbsp; C&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; &lt;br&gt;S---C:&amp;nbsp;&amp;nbsp; SYN(ISN&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; ,ACK(ISN&amp;nbsp;&amp;nbsp; C&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; &lt;br&gt;C---S:&amp;nbsp;&amp;nbsp; ACK(ISN&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; &lt;br&gt;C---S:数据&amp;nbsp;&amp;nbsp; 或S---C:数据 &lt;br&gt;也就是说对一个会话，C必须得到ISN&amp;nbsp;&amp;nbsp; S确认。ISN&amp;nbsp;&amp;nbsp; S可能是一个随机数。 &lt;br&gt;了解序数编号如何选择初始序列号和如何根据时间变化是很重要的。似乎应该有这种情况，当主机启动后序列编号初始化为1，但实际上并非如此。初始序列号是由tcp_init函数确定的。ISN每秒增加128000，如果有连接出现，每次连接将把计数器的数值增加64000。很显然，这使得用于表示ISN的32位计数器在没有连接的情况下每9.32&amp;nbsp;&amp;nbsp; 小时复位一次。之所以这样，是因为这样有利于最大限度地减少旧有连接的信息干扰当前连接的机会。这里运用了2MSL&amp;nbsp;&amp;nbsp; 等待时间的概念（不在本文讨论的范围之内）。如果初始序列号是随意选择的，那么不能保证现有序列号是不同于先前的。假设有这样一种情况，在一个路由回路中的数据包最终跳出了循环，回到了“旧有”的连接（此时其实是不同于前者的现有连接），显然会发生对现有连接的干扰。 &lt;br&gt;假设一个入侵者X有一种方法，能预测ISN&amp;nbsp;&amp;nbsp; S。在这种情况下，他可能将下列序号送给主机T来模拟客户的真正的ISN&amp;nbsp;&amp;nbsp; S： &lt;br&gt;X---S:&amp;nbsp;&amp;nbsp; SYN(ISN&amp;nbsp;&amp;nbsp; X&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; ,SRC&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; T&amp;nbsp;&amp;nbsp; &lt;br&gt;S---T:&amp;nbsp;&amp;nbsp; SYN(ISN&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; ,ACK(ISN&amp;nbsp;&amp;nbsp; X&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; &lt;br&gt;X---S:&amp;nbsp;&amp;nbsp; ACK(ISN&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; ,SRC&amp;nbsp;&amp;nbsp; =T&amp;nbsp;&amp;nbsp; &lt;br&gt;尽管消息S*T并不到X，但是X能知道它的内容，因此能发送数据。如果X要对一个连接实施攻击，这个连接允许执行命令，那么另外的命令也能执行。 &lt;br&gt;那么怎样产生随机的ISN？在Berkeley系统，最初的序列号变量由一个常数每秒加一产生，等到这个常数一半时，就开始一次连接。这样，如果开始了一个合法连接，并观察到一个ISN&amp;nbsp;&amp;nbsp; S在用，便可以计算，有很高可信度，ISN&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp; 用在下一个连接企图。 &lt;br&gt;Morris&amp;nbsp;&amp;nbsp; 指出，回复消息 &lt;br&gt;S---T:SYN(ISN&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; ,ACK(ISN&amp;nbsp;&amp;nbsp; X&amp;nbsp;&amp;nbsp; ) &lt;br&gt;事实上并不消失，真正主机将收到它，并试图重新连接。这并不是一个严重的障碍。 &lt;br&gt;Morris发现，通过模仿一个在T上的端口，并向那个端口请求一个连接，他就能产生序列溢出，从而让它看上去S*T消息丢失了。另外一个方法，可以等待知道T关机或重新启动。 &lt;br&gt;IP欺骗 &lt;br&gt;IP欺骗由若干步骤组成，这里先简要地描述一下，随后再做详尽地解释&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;。先做以下假定：首先，目标主机已经选定。其次，信任模式已被发现，并找到了一个被目标主机信任的主机。黑客为了进行IP欺骗，进行以下工作：使得被信任的主机丧失工作能力，同时采样目标主机发出的TCP&amp;nbsp;&amp;nbsp; 序列号，猜测出它的数据序列号。然后，伪装成被信任的主机，同时建立起与目标主机基于地址验证的应用连接。如果成功，黑客可以使用一种简单的命令放置一个系统后门，以进行非授权操作。 &lt;br&gt;使被信任主机丧失工作能力&amp;nbsp;&amp;nbsp; &lt;br&gt;一旦发现被信任的主机，为了伪装成它，往往使其丧失工作能力。由于攻击者将要代替真正的被信任主机，他必须确保真正被信任的主机不能接收到任何有效的网络数据，否则将会被揭穿。有许多方法可以做到这些。这里介绍“TCP&amp;nbsp;&amp;nbsp; SYN&amp;nbsp;&amp;nbsp; 淹没”。 &lt;br&gt;前面已经谈到，建立TCP连接的第一步就是客户端向服务器发送SYN请求。&amp;nbsp;&amp;nbsp; 通常，服务器将向客户端发送SYN/ACK&amp;nbsp;&amp;nbsp; 信号。这里客户端是由IP地址确定的。客户端随后向服务器发送ACK，然后数据传输就可以进行了。然而，TCP处理模块有一个处理并行SYN请求的最上限，它可以看作是存放多条连接的队列长度。其中，连接数目包括了那些三步握手法没有最终完成的连接，也包括了那些已成功完成握手，但还没有被应用程序所调用的连接。如果达到队列的最上限，TCP将拒绝所有连接请求，直至处理了部分连接链路。因此，这里是有机可乘的。 &lt;br&gt;黑客往往向被进攻目标的TCP端口发送大量SYN请求，这些请求的源地址是使用一个合法的但是虚假的IP地址（可能使用该合法IP地址的主机没有开机）。而受攻击的主机往往是会向该IP地址发送响应的，但可惜是杳无音信。与此同时IP包会通知受攻击主机的TCP：该主机不可到达，但不幸的是TCP会认为是一种暂时错误，并继续尝试连接（比如继续对该IP地址进行路由，发出SYN/ACK数据包等等），直至确信无法连接。&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1918689.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/12/28/1918689.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/12/24/1916246.html</id><title type="text">如何修复.Net和COM之间枚举名称的问题</title><summary type="text">由于在.Net中的枚举在通过regasm(如：Regasm PCTSEventLog.dll /t )生成tlb文件并注册的时候，会自动在枚举名称前面加上枚举的类型名称然后加上下划线，例如： enum...</summary><published>2010-12-24T09:45:00Z</published><updated>2010-12-24T09:45:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/12/24/1916246.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/12/24/1916246.html"/><content type="html">&lt;p&gt;由于在.Net中的枚举在通过regasm(如：Regasm PCTSEventLog.dll /t )生成tlb文件并注册的时候，会自动在枚举名称前面加上枚举的类型名称然后加上下划线，例如：&lt;/p&gt; &lt;p&gt;enum {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connect = 1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amelior = 2,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DailyLogs = 3,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maint = 4,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HL7PatientMatching = 5,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Secretary = 6,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Misc = 7,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SubmittedOrders = 8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } dwEventLogCategories; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;在自动生成tlb时，会变成：&lt;/p&gt; &lt;p&gt;enum {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_Connect = 1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_Amelior = 2,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_DailyLogs = 3,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_Maint = 4,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_HL7PatientMatching = 5,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_Secretary = 6,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_Misc = 7,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwEventLogCategories_SubmittedOrders = 8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } dwEventLogCategories; &lt;p&gt;如果我们是对已有的系统进行升级的时候就不得不修改我们原有的旧代码了。如果是多个小组一起开发的话，这也会存在一些问题。但是我们可以通过修改tlb的方法，来达到不修改原有代码。 &lt;p&gt;方法的原理就是：&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;从.net的dll中导出tlb文件，然后根据tlb文件导出idl文件，我们然后通过midl将idl文件编译成tlb文件，再在目标系统注册tlb就完成了。&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;下面我们就一步一步来完成这个过程：&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;1 利用以下命令导出tlb文件（tlbexp和regasm的区别就是，regasm会导出之后并注册tlb文件）：&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;@ehco Off  &lt;p&gt;set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"  &lt;p&gt;%binDir%\tlbexp PCTSEventLog.dll  &lt;p&gt;Pause &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;2 打开ole view,选择File-&amp;gt;TypeLib view…，然后打开刚才生成的tlb文件，打开之后Save As为idl文件&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;3 打开idl文件，去掉tlbexp自动增加的枚举类型名（如：dwEventLogCategories_），改成下面这个样子并保存，注意红色的地方，如果不加红色的地方，那么idl会生成一个诡异的枚举名称：&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;enum &lt;font color="#ff0080"&gt;dwEventLogCategories&lt;/font&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connect = 1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amelior = 2,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DailyLogs = 3,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maint = 4,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HL7PatientMatching = 5,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Secretary = 6,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Misc = 7,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SubmittedOrders = 8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } dwEventLogCategories;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;4 先运行vcvarsall.bat（%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86）来设置.net的环境变量，然后再运行下面的命令：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;@echo off  &lt;p&gt;set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"  &lt;p&gt;%binDir%\MIDL PCTSEventLog.idl  &lt;p&gt;Pause &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;5 注册刚刚生产的tlb文件&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;regtlib PCTSEventLog.tlb&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;好了，你大功告成了，在VB6或者其他环境中调用看看，是不是ok了。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000" size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1916246.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/12/24/1916246.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/12/22/1914018.html</id><title type="text">Compiling and Registering a Type Library</title><summary type="text">In subsequent examples you will need to be able to compile type libraries and reference them from VB...</summary><published>2010-12-22T08:39:00Z</published><updated>2010-12-22T08:39:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/12/22/1914018.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/12/22/1914018.html"/><content type="html">&lt;p&gt;In subsequent examples you will need to be able to compile type libraries and reference them from VB projects. In this example you will compile an IDL file using the Microsoft IDL compiler and register the resulting type library file with Windows, thereby allowing you to reference the type library in VB just like an ActiveX component. But first, you may require some essential background information. The MIDL compiler is a DOS based application. Because of this, you must make sure MIDL is running in a DOS shell with the proper environment variables set. MIDL must be able to locate additional files it requires to compile your IDL code. If your experience with DOS is limited this can be troublesome depending which Windows operating system your using and how you installed Visual Studio. So, the first few steps in this example are the steps I used to get my Windows 98 system ready to compile IDL files. If youre running Windows NT and you have properly installed the C++ portion of Visual Studio you will probably be able to go straight to step 5.  &lt;ol&gt; &lt;li&gt;Locate a file with the name VCVARS32.BAT, normally located in C:\Program Files\Microsoft Visual Studio\VC98\Bin\. Visual Studio will have already included this file during installation. The contents of the batch file should look like this:&lt;/li&gt;&lt;/ol&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;code&gt;@echo off&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;rem&lt;br&gt;rem Root of Visual Developer Studio Common files.&lt;br&gt;set VSCommonDir=C:\PROGRA~1\MICROS~4\COMMON&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;rem&lt;br&gt;rem Root of Visual Developer Studio installed files.&lt;br&gt;rem&lt;br&gt;set MSDevDir=C:\PROGRA~1\MICROS~4\COMMON\msdev98&lt;br&gt;rem&lt;br&gt;rem Root of Visual C++ installed files.&lt;br&gt;rem&lt;br&gt;set MSVCDir=C:\PROGRA~1\MICROS~4\VC98&lt;br&gt;rem&lt;br&gt;rem VcOsDir is used to help create either a Windows 95 or Windows NT specific path.&lt;br&gt;rem&lt;br&gt;set VcOsDir=WIN95&lt;br&gt;if "%OS%" == "Windows_NT" set VcOsDir=WINNT&lt;br&gt;rem&lt;br&gt;echo Setting environment for using Microsoft Visual C++ tools.&lt;br&gt;rem&lt;br&gt;if "%OS%" == "Windows_NT" set PATH=%MSDevDir%\BIN;%MSVCDir%\BIN;%VSCommonDir%\TOOLS\%VcOsDir%;%VSCommonDir%\TOOLS;%PATH%&lt;br&gt;if "%OS%" == "" set PATH="%MSDevDir%\BIN";"%MSVCDir%\BIN";"%VSCommonDir%\TOOLS\%VcOsDir%";"%VSCommonDir%\TOOLS";"%windir%\SYSTEM";"%PATH%"&lt;br&gt;set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%&lt;br&gt;set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%&lt;br&gt;set VcOsDir=&lt;br&gt;set VSCommonDir=&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;/blockquote&gt; &lt;ol&gt; &lt;li&gt;Next create a shortcut on your desktop to COMMAND.COM. Name the shortcut Go MIDL.  &lt;li&gt;Right mouse click over the shortcut and select to view the shortcuts properties. Select the Program tab and set the properties as follows: Cmd line: C:\WINDOWS\COMMAND.COM Working: "C:\Program Files\Microsoft Visual Studio\VC98" Batch file: BIN\VCVARS32.BAT  &lt;li&gt;Now select the Memory tab and make sure the Initial environment: property is set to at least 2048. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;When you click on this shortcut, you will be in a DOS shell that is properly set for compiling IDL files. The shortcut will run the VCVARS32.BAT file for you. This properly initializes the DOS environment variables for the MIDL compiler. &lt;ol&gt; &lt;li&gt;Next, copy the following IDL code, paste it into Notepad, and save the file as EX2.IDL:&lt;/li&gt;&lt;/ol&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;code&gt;// TypeLib : EX2.IDL (EX2)&lt;br&gt;// TargetFile : EX2.TLB&lt;br&gt;//&lt;br&gt;// Version 1.0&lt;br&gt;// - Author : Philip G. Fucich&lt;br&gt;// - Completed: 01/01/2000&lt;br&gt;// - Notes : Example 2 type library.&lt;br&gt;// UUID Usage:&lt;br&gt;// {C4408B80-EFC0-11D3-A88C-81F2B32E4671} : library EX2&lt;br&gt;// {C4408B82-EFC0-11D3-A88C-81F2B32E4671} : typedef exSampleEnum&lt;br&gt;// {C4408B84-EFC0-11D3-A88C-81F2B32E4671} : interface Box&lt;br&gt;[&lt;br&gt;uuid(C4408B80-EFC0-11D3-A88C-81F2B32E4671),&lt;br&gt;version(1.0),&lt;br&gt;helpstring("Example 2 Library")&lt;br&gt;]&lt;br&gt;library EX2&lt;br&gt;{&lt;br&gt;importlib("STDOLE2.TLB");&lt;br&gt;typedef&lt;br&gt;[&lt;br&gt;uuid(C4408B82-EFC0-11D3-A88C-81F2B32E4671),&lt;br&gt;helpstring("Sample enum declaration."),&lt;br&gt;v1_enum,&lt;br&gt;version(1.0)&lt;br&gt;]&lt;br&gt;enum exSampleEnum {&lt;br&gt;[helpstring("Helpstring for exDefault.")]&lt;br&gt;exDefault = 0,&lt;br&gt;exOne = 1,&lt;br&gt;exTwo = 2,&lt;br&gt;} exSampleEnum ;&lt;br&gt;[&lt;br&gt;uuid(C4408B84-EFC0-11D3-A88C-81F2B32E4671),&lt;br&gt;helpstring("A Box."),&lt;br&gt;nonextensible,&lt;br&gt;oleautomation,&lt;br&gt;]&lt;br&gt;interface Box : IUnknown {&lt;br&gt;[helpstring("Box height.")]&lt;br&gt;[propget] HRESULT Height ([out, retval] long* PropData );&lt;br&gt;[helpstring("Box width.")]&lt;br&gt;[propget] HRESULT Width ([out, retval] long* PropData );&lt;br&gt;[helpstring("Box depth.")]&lt;br&gt;[propget] HRESULT Depth ([out, retval] long* PropData );&lt;br&gt;};&lt;br&gt;}&lt;br&gt;&lt;/code&gt;&lt;/blockquote&gt; &lt;ol&gt; &lt;li&gt;Copy or move EX2.IDL to the following directory: &lt;/li&gt;&lt;/ol&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;code&gt;C:\Program Files\Microsoft Visual Studio\VC98\&lt;br&gt;&lt;/code&gt;&lt;/blockquote&gt; &lt;ol&gt; &lt;li&gt;Now click on your Go MIDL shortcut.  &lt;li&gt;In the DOS Window, type the following command: &lt;/li&gt;&lt;/ol&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;code&gt;bin\midl EX2.IDL &lt;br&gt;&lt;/code&gt;&lt;/blockquote&gt; &lt;p&gt;If all has gone well up to this point, you will have an EX2.TLB file. This file cannot be referenced in a VB project until it has been registered with Windows. The next steps will cover how to register your type library using some simple VB code. &lt;ol&gt; &lt;li&gt;Move the EX2.IDL and EX2.TLB files to a directory of your choice. For this example, Ill say its in C:\Example2\.  &lt;li&gt;Open VB and create a new Standard EXE project.  &lt;li&gt;Go the project references dialog and add a reference to TypeLib Information as shown here: &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;img alt="" src="http://www.devx.com/assets/articlefigs/8133.gif"&gt; &lt;ol&gt; &lt;li&gt;Click OK to return the to Form1 and add a command button to the form.  &lt;li&gt;Double click on the command button and add the following code to the Command1_Click() event procedure: &lt;/li&gt;&lt;/ol&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;code&gt;Dim o_TypeLib As TypeLibInfo&lt;br&gt;Set o_TypeLib = TLIApplication.TypeLibInfoFromFile("C:\Example2\EX2.TLB")&lt;br&gt;o_TypeLib.Register&lt;br&gt;MsgBox "The TypeLibrary is registered."&lt;br&gt;&lt;/code&gt;&lt;/blockquote&gt; &lt;ol&gt; &lt;li&gt;Now, run the project and click the Command1 button. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The EX2.TLB will now be registered with Windows and thereby ready to reference in a VB project. To check out the EX2.TLB, open a new Standard EXE project, go to the project references dialog, and add it as a reference. You will find it listed as Example 2 Library. When youve added the reference, open the VB Object Browser and select EX2 in the Project/Library combo box. Your Object Browser will look something like this: &lt;p&gt;&lt;img alt="" src="http://www.devx.com/assets/articlefigs/8134.gif"&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;注：可以使用regtlib.exe来对tlb文件进行注册。&lt;/p&gt; &lt;p&gt;在遇到.net中有枚举类型，同时COM是原有系统不能更改代码时，因为regasm或者tlbexp生成的tlb文件会修改枚举的名称，可以将tlb转换成idl文件，通过修改名称之后将idl编译成tlb，然后再使用regtlib来注册使用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1914018.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/12/22/1914018.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846395.html</id><title type="text">Objective-C札记二--</title><summary type="text">1 分类 分类为类定义的扩展提供了一种手段，分类可以访问原始类的实例变量。使用分类需要注意以下几点： 1.1 分类不能添加自身的任何变量，如果需要添加变量，可以考虑创建之类 1.2 分类可以重载该类中...</summary><published>2010-10-09T02:32:00Z</published><updated>2010-10-09T02:32:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846395.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846395.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;1 分类&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;分类为类定义的扩展提供了一种手段，分类可以访问原始类的实例变量。使用分类需要注意以下几点：&lt;/p&gt; &lt;p&gt;1.1 分类不能添加自身的任何变量，如果需要添加变量，可以考虑创建之类&lt;/p&gt; &lt;p&gt;1.2 分类可以重载该类中的另外一个方法，但是请一定不要尝试这么做。就是不要在分类中去重载（Override）类中的另一个方法。&lt;/p&gt; &lt;p&gt;1.3 一个类可以有很多分类。&lt;/p&gt; &lt;p&gt;1.4 在实现中可以不实现分类中声明的方法。（可以以后实现）&lt;/p&gt; &lt;p&gt;1.5分类也可以实现协议，如：@interface Fraction(Stuff)&amp;lt;NSCopying, NSCoding&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;2 协议&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;协议就是其他语言中所指的接口。Objective-C 2.0在协议中增加了optional关键字，表示此方法是可选择的实现。这个是替换非正式协议的。&lt;/p&gt; &lt;p&gt;非正式协议：它实际就是一个分类，列出了一组方法，但是没有实现它们。有时非正式协议也称作抽象协议。&lt;/p&gt; &lt;p&gt;id&amp;lt;NSCopying, NSCoding&amp;gt; currObj&lt;/p&gt; &lt;p&gt;这个声明告知编译器currObj将包含遵守NSCopying,NSCoding协议的对象，如果不是编译器将会给出警告。&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;&lt;strong&gt;3 类型转换&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;4 预处理程序&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;5 作用域&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1846395.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846395.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846391.html</id><title type="text">Iphone中关于Layer的opaque属性</title><summary type="text">在使用三个CALayer进行交替移动，同时在每个CALayer上都画坐标刻度，然后再刻度上画波形的程序中，如果将CALayer的opaque属性设为Yes的话，在缓慢移动的情况下，一切正常。如果进行了快速移动的话，坐标刻度会加深加粗。如果采用默认值No时，一切正常。目前不知道具体原因，只是测试有这个结果以供以后参考。</summary><published>2010-10-09T02:30:00Z</published><updated>2010-10-09T02:30:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846391.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846391.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在使用三个CALayer进行交替移动，同时在每个CALayer上都画坐标刻度，然后再刻度上画波形的程序中，如果将CALayer的opaque属性设为Yes的话，在缓慢移动的情况下，一切正常。如果进行了快速移动的话，坐标刻度会加深加粗。如果采用默认值No时，一切正常。目前不知道具体原因，只是测试有这个结果以供以后参考。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1846391.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/10/09/1846391.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/07/19/1780544.html</id><title type="text">Xcode配置SVN作为版本控制</title><summary type="text">1 配置SVN Max OS-Leopard目前自带SVN。如果不对SVN进行配置，即使在Xcode中配置了SCM，在Xcode中使用SVN也会有问题。 1.1 打开SVN的配置文件 ～/.subversion/config 注意：如果”.subversion”目录不存在，请运行”svn status”命令，虽然此命令会失败，但是会为你创建所需要的文件。 1.2 找到 global-ign...</summary><published>2010-07-19T03:27:00Z</published><updated>2010-07-19T03:27:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/07/19/1780544.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/07/19/1780544.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="4"&gt;1 配置SVN&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; Max OS-Leopard目前自带SVN。如果不对SVN进行配置，即使在Xcode中配置了SCM，在Xcode中使用SVN也会有问题。&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;1.1&lt;/font&gt;&lt;/strong&gt; 打开SVN的配置文件&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ～/.subversion/config&lt;/p&gt; &lt;p&gt;注意：如果”.subversion”目录不存在，请运行”svn status”命令，虽然此命令会失败，但是会为你创建所需要的文件。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;1.2&lt;/font&gt;&lt;/strong&gt; 找到 global-ignores 一行，去掉注释，编辑成&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective*&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;1.3&lt;/font&gt;&lt;/strong&gt; 找到 enable-auto-props = yes 把注释去掉.变成：&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enable-auto-props = yes&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;1.4&lt;/strong&gt;&lt;/font&gt; 到文件结尾的[auto-props]节，加上下面的内容：&lt;/p&gt;  *.mode* = svn:mime-type=text/X-xcode&lt;br/&gt;  *.pbxuser = svn:mime-type=text/X-xcode&lt;br/&gt;  *.perspective* = svn:mime-type=text/X-xcode&lt;br/&gt;  *.pbxproj = svn:mime-type=text/X-xcode&lt;/blockquote&gt;&amp;nbsp;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1780544.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/07/19/1780544.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772968.html</id><title type="text">Emacs快捷键</title><summary type="text">文件操作 C-x C-f 打开文件,出现提示时输入/username@host:filepath可编辑FTP文件C-x C-v 打开一个文件，取代当前缓冲区C-x C-s 保存文件C-x C-w 存为新文件C-x i 插入文件C-x C-q 切换为只读或者读写模式C-x C-c 退出Emacs 编辑操作 C-f 前进一个字符C-b 后退一个字符M-f 前进一个字M-b 后退一个字C-a 移到行首C...</summary><published>2010-07-07T08:35:00Z</published><updated>2010-07-07T08:35:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772968.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772968.html"/><content type="html">&lt;p&gt;&lt;strong&gt;文件操作&lt;/strong&gt; &lt;p&gt;C-x C-f 打开文件,出现提示时输入/username@host:filepath可编辑FTP文件&lt;br&gt;C-x C-v 打开一个文件，取代当前缓冲区&lt;br&gt;C-x C-s 保存文件&lt;br&gt;C-x C-w 存为新文件&lt;br&gt;C-x i 插入文件&lt;br&gt;C-x C-q 切换为只读或者读写模式&lt;br&gt;C-x C-c 退出Emacs &lt;p&gt;&lt;strong&gt;编辑操作&lt;/strong&gt; &lt;p&gt;C-f 前进一个字符&lt;br&gt;C-b 后退一个字符&lt;br&gt;M-f 前进一个字&lt;br&gt;M-b 后退一个字&lt;br&gt;C-a 移到行首&lt;br&gt;C-e 移到行尾&lt;br&gt;M-a 移到句首&lt;br&gt;M-e 移到句尾&lt;br&gt;C-p 后退一行&lt;br&gt;C-n 前进一行&lt;br&gt;M-x goto-line 跳到指定行&lt;br&gt;C-v 向下翻页&lt;br&gt;M-v 向上翻页&lt;br&gt;M-&amp;lt; 缓冲区头部&lt;br&gt;M-&amp;gt; 缓冲区尾部 &lt;p&gt;C-M-f 向前匹配括号&lt;br&gt;C-M-b 向后匹配括号 &lt;p&gt;C-l 当前行居中 &lt;p&gt;M-n or C-u n 重复操作随后的命令n次&lt;br&gt;C-u 重复操作随后的命令4次&lt;br&gt;C-u C-u 重复操作随后的命令8次&lt;br&gt;C-x ESC ESC 执行历史命令记录，M-p选择上一条命令，M-n选择下一条命令 &lt;p&gt;C-d 删除一个字符&lt;br&gt;M-d 删除一个字&lt;br&gt;C-k 删除一行&lt;br&gt;M-k 删除一句&lt;br&gt;C-w 删除标记区域 &lt;p&gt;C-y 粘贴删除的内容 &lt;p&gt;注意：C-y可以粘贴连续C-k删除的内容；先按C-y，然后按M-y可以选择粘贴被删除的内容 &lt;p&gt;C-@ 标记开始区域&lt;br&gt;C-x h 标记所有文字&lt;br&gt;C-x C-x 交换光标位置和区域标记区开头&lt;br&gt;M-w 复制标记区域 &lt;p&gt;C-_ or C-x u 撤消操作 &lt;p&gt;&lt;strong&gt;执行SHELL命令&lt;/strong&gt; &lt;p&gt;M-x shell 打开SHELL&lt;br&gt;M-! 执行SHELL命令 (shell-command)&lt;br&gt;M-1 M-! 执行SHELL命令,命令输出插入光标位置,不打开新输出窗口&lt;br&gt;M-| 针对某一特定区域执行命令(shell-command-on-region), 比如 C-x h M-|uuencode &lt;p&gt;&lt;strong&gt;窗口操作&lt;/strong&gt; &lt;p&gt;C-x 0 关闭本窗口&lt;br&gt;C-x 1 只留下一个窗口&lt;br&gt;C-x 2 垂直均分窗口&lt;br&gt;C-x 3 水平均分窗口&lt;br&gt;C-x o 切换到别的窗口&lt;br&gt;C-x s 保存所有窗口的缓冲&lt;br&gt;C-x b 选择当前窗口的缓冲区&lt;br&gt;C-x ^ 纵向扩大窗口&lt;br&gt;C-x } 横向扩大窗口 &lt;p&gt;&lt;strong&gt;缓冲区列表操作&lt;/strong&gt; &lt;p&gt;C-x C-b 打开缓冲区列表&lt;br&gt;d or k 标记为删除&lt;br&gt;~ 标记为未修改状态&lt;br&gt;% 标记为只读&lt;br&gt;s 保存缓冲&lt;br&gt;u 取消标记&lt;br&gt;x 执行标记的操作 &lt;p&gt;f 在当前窗口打开该缓冲区&lt;br&gt;o 在其他窗口打开该缓冲区 &lt;p&gt;&lt;strong&gt;目录操作&lt;/strong&gt; &lt;p&gt;C-x d 打开目录模式&lt;br&gt;s 按日期/文件名排序显示&lt;br&gt;v 阅读光标所在的文件&lt;br&gt;q 退出阅读的文件&lt;br&gt;d 标记为删除&lt;br&gt;x 执行标记&lt;br&gt;D 马上删除当前文件&lt;br&gt;C 拷贝当前文件&lt;br&gt;R 重名名当前文件&lt;br&gt;+ 新建文件夹&lt;br&gt;Z 压缩文件&lt;br&gt;! 对光标所在的文件执行SHELL命令&lt;br&gt;g 刷新显示&lt;br&gt;i 在当前缓冲区的末尾插入子目录的内容 &lt;p&gt;[n]m 标记光标所在的文件，如果指定n，则从光标所在的文件起后n个文件被标记&lt;br&gt;[n]u 取消当前光标标记的文件，n的含义同上&lt;br&gt;t 反向标记文件&lt;br&gt;%-m 正则标记 &lt;p&gt;q 退出目录模式 &lt;p&gt;说明：在目录模式中，如果输入!，在命令行中包含*或者?，有特殊的含义。*匹配当前光标所在的文件和所有标记的文件，?分别在每一个标记的文件上执行该命令。 &lt;p&gt;&lt;strong&gt;程序编译&lt;/strong&gt; &lt;p&gt;M-x compile 执行编译操作&lt;br&gt;M-x gdb GDB排错&lt;br&gt;M-x dbx DBX排错&lt;br&gt;M-x xdb XDB排错&lt;br&gt;M-x sdb SDB排错 &lt;p&gt;&lt;strong&gt;搜索模式&lt;/strong&gt; &lt;p&gt;C-s key 向前搜索&lt;br&gt;C-s 查找下一个&lt;br&gt;ENTER 停止搜索&lt;br&gt;C-r key 反向搜索&lt;br&gt;C-s C-w 以光标所在位置的字为关键字搜索&lt;br&gt;C-s C-s 重复上次搜索&lt;br&gt;C-r C-r 重复上次反向搜索&lt;br&gt;C-s ENTER C-w 进入单词搜索模式&lt;br&gt;C-r ENTER C-w 进入反向单词搜索模式&lt;br&gt;M-x replace-string ENTER search-string ENTER 替换&lt;br&gt;M-% search-string ENTER replace-string ENTER 交互替换&lt;br&gt;C-r 在进入查找/替换模式后，该命令进入迭代编辑模式&lt;br&gt;C-M-x 退出迭代编辑模式，返回到查找/替换模式&lt;br&gt;C-M-s 向前正则搜索&lt;br&gt;C-M-r 向后正则搜索&lt;br&gt;C-M-% 正则交互替换 &lt;p&gt;&lt;strong&gt;SHELL模式&lt;/strong&gt; &lt;p&gt;C-c C-c 相当于Bash下的C-c&lt;br&gt;C-c C-z 相当于Bash下的C-z&lt;br&gt;C-c C-d 相当于Bash下的C-d&lt;br&gt;M-p 执行前一条命令&lt;br&gt;C-n 执行下一条命令&lt;br&gt;C-c C-o 删除最后一条命令产生的输出&lt;br&gt;C-c C-r 屏幕滚动到最后一条命令输出的开头&lt;br&gt;C-c C-e 屏幕滚动到最后一套命令输出的结尾&lt;br&gt;C-c C-p 查看前一条命令的输出&lt;br&gt;C-c C-n 查看后一条命令的输出 &lt;p&gt;&lt;strong&gt;打印资料&lt;/strong&gt; &lt;p&gt;M-x print-buffer 先使用pr,然后使用lpr&lt;br&gt;M-x lpr-buffer 直接使用lpr&lt;br&gt;M-x print-region&lt;br&gt;M-x lpr-region &lt;p&gt;&lt;strong&gt;收发邮件&lt;/strong&gt; &lt;p&gt;M-x mail 发送邮件, C-c C-s 发送,C-c C-c 发送并退出&lt;br&gt;M-x rmail 接受邮件&lt;/p&gt; &lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1772968.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772968.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772626.html</id><title type="text">Objective C中的札记--字符串连接，@selector中的冒号，时间转换，局部变量</title><summary type="text">1 字符串链接 预处理程序会自动将相邻的字符串常量链接到一起。字符串可以通过0或多个空格字符来分割。如： “a” “ character ” “String” 等价于：”a character string” 常量字符串对象可通过在常量字符串前面放置一个@字符来创建，这种对象的类型是NSConstan...</summary><published>2010-07-07T01:32:00Z</published><updated>2010-07-07T01:32:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772626.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772626.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;1 字符串链接&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp; 预处理程序会自动将相邻的字符串常量链接到一起。字符串可以通过0或多个空格字符来分割。如：&lt;/p&gt; &lt;p&gt;&amp;#8220;a&amp;#8221;&amp;nbsp; &amp;#8220; character &amp;#8221;&lt;/p&gt; &lt;p&gt;&amp;#8220;String&amp;#8221;&lt;/p&gt; &lt;p&gt;等价于：&amp;#8221;a character string&amp;#8221;&lt;/p&gt; &lt;p&gt;常量字符串对象可通过在常量字符串前面放置一个@字符来创建，这种对象的类型是NSConstantString。同样预处理程序会将相邻的常量字符串对象链接在一起：例如：&lt;/p&gt; &lt;p&gt;@&amp;#8221;a&amp;#8221; @&amp;#8221;character &amp;#8220;&lt;/p&gt; &lt;p&gt;@&amp;#8221;string&amp;#8221;&lt;/p&gt; &lt;p&gt;等价于：@&amp;#8221;a character string&amp;#8221;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;2 @selector中的方法中的冒号&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;在调用respondsToSelector:@selector(method)时，这个method只有在该方法存在参数时需要：，如果该方法不需要参数就不需要加这个冒号。否则，编译不会报错，只是执行返回的值不对。当然如果方法有多个参数，需要多个冒号，参数有名称的需要带上参数名称。&lt;/p&gt; &lt;p&gt;如：有如下方法：&lt;/p&gt; &lt;p&gt;-(NSString*)toXmlString;&lt;/p&gt; &lt;p&gt;此时调用类似于：&lt;/p&gt; &lt;p&gt;[self respondsToSelector:@selector(toXmlString)]&lt;/p&gt; &lt;p&gt;如果toXmlString方法的定义为：&lt;/p&gt; &lt;p&gt;-(NSString*)toXmlString:(NSString*)prefix;&lt;/p&gt; &lt;p&gt;那么调用就必须加上冒号，如：[self respondsToSelector:@selector(toXmlString：)]&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;&lt;strong&gt;3 Soap时间表示，以及时间日期转换&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Soap在传输中的日期时间的格式一般是：yyyy—MM-dd&amp;#8217;T&amp;#8217;HH:mm:ss&amp;#8217;Z&amp;#8217;&lt;/p&gt; &lt;p&gt;(NSString*)dateToSoapString(NSDate*)date{&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;font color="#4b4b4b"&gt;NSDateFormatter* dateFormatter=[[NSDateFormatter alloc] init];&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#4b4b4b"&gt;[dateFormatter setDateFormat:@&amp;#8221;yyyy—MM-dd&amp;#8217;T&amp;#8217;HH:mm:ss&amp;#8217;Z&amp;#8217;&amp;#8221;];&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#4b4b4b"&gt;NSString* dateString=[dateFormatter stringFromDate:date];&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#4b4b4b"&gt;[dateFormatter release];&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#4b4b4b"&gt;return dateString;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;yyyy—MM-dd&amp;#8217;T&amp;#8217;HH:mm:ss.SSS&amp;#8217;Z&amp;#8217; 对应的数据为：2010-07-08T07:00:53.000Z&lt;/p&gt; &lt;p&gt;关于时间格式请参考：&lt;a title="http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns" href="http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns"&gt;http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;4 局部变量&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;局部变量一般是在方法中定义的用于保存临时数据的变量。方法的参数名也是局部变量。执行方法时，通过方法传递的任何参数都被复制到局部变量中。因为方法使用的是参数的副本，所以不能改变通过方法传递的原值，当然如果传递是类实例的话，类实例中的对象或属性是可以通过方法改变其值的。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;如果在变量前面加上一个static关键字的话，那么变量就变成了静态变量。&lt;strong&gt;静态变量只在程序开始执行时初始化一次，并且自始至终只保存一个值&lt;/strong&gt;：&lt;/p&gt; &lt;p&gt;如：&lt;/p&gt; &lt;p&gt;-(void) showPage{&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;static int pageCount=0;&lt;/p&gt; &lt;p&gt;&amp;#8230;&lt;/p&gt; &lt;p&gt;pageCount++;&lt;/p&gt; &lt;p&gt;&amp;#8230;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;该方法的pageCount可以记录showPage被调用的次数。&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1772626.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/07/07/1772626.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LazyBee/archive/2010/07/05/1771480.html</id><title type="text">使用GDataXML的设置</title><summary type="text">1 将GDataxMLNode.h和GDataXMLNode.m文件加入到项目中 2 进入Xcode,打开Project-&gt;Edit Project Settings 3 进入Build Tab 4 找到Linking段，在Other Linker Flags设置中填上：-lxml2 5 找到Search Paths段，在Header Search Paths设置值为：/usr/includ...</summary><published>2010-07-05T08:31:00Z</published><updated>2010-07-05T08:31:00Z</updated><author><name>懒蜜蜂</name><uri>http://www.cnblogs.com/LazyBee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LazyBee/archive/2010/07/05/1771480.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LazyBee/archive/2010/07/05/1771480.html"/><content type="html">&lt;p&gt;&lt;font color="#0000ff" size="3"&gt;1 将GDataxMLNode.h和GDataXMLNode.m文件加入到项目中&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;2 进入Xcode,打开Project-&amp;gt;Edit Project Settings&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;3 进入Build Tab&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;4 找到Linking段，在Other Linker Flags设置中填上：-lxml2&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;5 找到Search Paths段，在Header Search Paths设置值为：/usr/include/libxml2&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="3"&gt;6 然后就可以使用GDataXML来解析xml了。&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LazyBee/aggbug/1771480.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LazyBee/archive/2010/07/05/1771480.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
