<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>12.学技术</title><link>http://notemper2x.cndev.org/category/402.aspx</link><description>12.学技术</description><managingEditor>没脾气2x</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.95.2004.101</generator><item><dc:creator>没脾气2x</dc:creator><title>vim查找替换</title><link>http://notemper2x.cndev.org/archive/2009/11/03/60354.aspx</link><pubDate>2009-11-03 10:29:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2009/11/03/60354.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/60354.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2009/11/03/60354.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/60354.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/60354.aspx</trackback:ping><description>&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;行内搜索。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;f命令可以进行行内搜索。输入fx可以找到下一个x字符。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;F命令可以在反方向进行行内搜索，输入Fx可以找到上一个x字符。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;t命令同样是进行行内搜索，但是光标停留在符合条件的字符的前面。输入tx使光标停留在下一个x字符的前面。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;T命令可以在反方向进行行内搜索，但是光标停留在符合条件的字符的下一个字符上。输入tx使光标停留在上一个x的后面的字符上。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;%可以搜索与之匹配的对应的()[]{}。这个功能对于书写程序特别有用。&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;全文的搜索。键入/后，光标进入VIM底部的命令行，这时就可以输入以/为开始的/搜索命令了。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;最简单的查找。输入/string就可以查找string字符串。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;继续查找。在第一次搜索后输入n将会继续进行上一次搜索，如果输入3n那么会找到后面第三个符合的字符串。大写的N会在反方向，也就是向上进行搜索。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;向上搜索。输入?可以向上搜索。随后的n命令将会继续向上搜索，N向下搜索，其他和/一样。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;对大小写的匹配。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;在命令行输入:set ignorecase可以设置搜索以忽略大小写的方式进行。输入:set noignorecase可以设置搜索以匹配大小写的方式进行。默认的，将匹配大小写。这个默认设置可以在.vimrc中修改。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;大小写智能匹配模式。输入命令:set ignorecase smartcase可以设置为智能大小写匹配模式。在这种模式下，如果你输入的字符串中至少包含一个大写字母，那么就会以大小写敏感模式进行搜索，否则以忽略大小写模式进行搜索。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;在搜索命令中指定大小写。在几种大小写搜索模式中进行转换总要输入长长的一串指令，如果需要不断地转换模式，确实有些麻烦。所以你可以直接在搜索命令中指定大小写匹配模式。\c表示忽略大小写，而\C表示对大小写敏感。&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;查找当前词。一个简单的方法可以让你查找下一个和当前词一样的词，你不比输入/currentword，你可以直接按下*就可以查找下一个currentword。#可以让你向上查找同一个单词。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;调整查找后的光标位置。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;使用/string/3会使在光标转到找到string字符串的行下面的第3行。第1行从包含string的行算起。同样可以使用/string/-2来使光标停留在包含string的行的前面2行。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;使用/string/e可以使光标停留在string字符串的末尾而不是默认的第一个字符位置。/string/b则表示停留在string第一个字符的位置，不过默认就是如此，我们不比多此一举。但是/string/b+2却可以使光标停留在string字符串的第二个字符的位置，这里是r。在e或者b的后面+或者-数字，可以进一步调整光标的位置。&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;特殊字符。在搜索命令中，&amp;nbsp; .*[]^%/?~$这10个字符有着特殊意义，所以在使用这些字符的时候要在前面加上一个反斜杠/。而\e表示&amp;lt;esc&amp;gt;；\t表示&amp;lt;tab&amp;gt;；\r表示&amp;lt;cr&amp;gt;；\b表示&amp;lt;bs&amp;gt;。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;匹配换行或空格。使用\n可以表示一个换行；而\s表示匹配空白，注意是空白不是空格。\_s表示匹配换行或者空格；\_a表示匹配换行或者一个字母。比如：/the\nword查找以the结束并且下一行以word开始的行的位置。/the\_sword查找the和word之间以空白或者换行分割的位置。/the\_s\+word表示the和word之间可以有多个空白。\+的含义可以在后面找到。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;限定词首或者词尾。\&amp;lt;可以限定找到是以指定字符串开始的单词。比如/\&amp;lt;the可以找到以the开始在字符串，但是会忽略在单词中间包含the的字符串。而\&amp;gt;则是限定必须是以指定字符串结尾的单词。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;行首和行尾。输入/^string查找以string开始的行，并且光标停留在这个string的第一个字符。输入/string$则查找以string结束的行，并将光标停留在这个string的第一个字符。这个模式不会忽略前导或者后置的空格。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;匹配任何一个字符。句号.可以匹配任何一个字符。例如/t.e可以找到the或者tae或者tue。&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;更加复杂的匹配模式。实际上，/搜索可以使用非常复杂的匹配模式。下面列出了其中一些复杂的匹配模式。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;可重复的字符。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;使用*表示它前面的字符可以重复多次或者0次。比如/be*可以匹配b,be,bee,beee等等。但是这也会包含b，因为e重复0后是空。如果要匹配诸如be,bebe,bebebe的字符串可以使用\(和\)把他们包括起来，形如：/\(be\)*。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;使用\+来限定为重复至少一次到无数次。如：/be\+可以匹配be,bee,bee等等。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;重复0次或者一次。\=可以指定重复0次或者一次。/strings\=表示匹配string或者strings。这在查找单词的复数形式特别有用.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;指定重复的次数。\{n,m}可以指定重复n到m次。比如：/be\{2,4}将会匹配bee,beee,beeee。同样可以使用\{,4}表示匹配0到4次；\{4,}表示4次到无数次；\{4}表示重复4次。&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;匹配列表中的一个。使用一个以\|分割的列表，可以表示匹配列表中任何一项。比如/one\|two表示查找one或者two；/one\|two\|three表示查找one或者two或者three。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;一个复杂的实例：/end\(if\|while\|for\)将会查找endif，endwhile以及endfor。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;字符列表。使用[0-9]可以表示一个0到9范围的字符。比如/string[1-5]表示查找string1,string2,string3,string4,string5。当然也可以使用[a-z]表示字符a到z中间的一个。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;特殊的字符集合。使用\d也可以表示0到9的数字，这个选项可以代替[0-9]。\D表示非数字代替[^0-9]；\x表示十六进制数代替[0-9a-fA-F]；\X表示非十六进制数代替[^0-9a-fA-F]；\s表示空白字符代替[ ] (&amp;lt;Tab&amp;gt; 和&amp;lt;Space&amp;gt;)；\S表示非空白字符代替[^ ] (除&amp;lt;Tab&amp;gt; 和&amp;lt;Space&amp;gt;之外)；\l表示小写字母代替[a-z]；\L表示非小写字母代替[^a-z]；\u表示大写字母代替[A-Z]；\U表示非大写字母代替[^A-Z]&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;搜索并替换。输入:[range]s/from/to/[flags]命令可以搜索匹配的字符串并且替换为指定的字符串。这是一个稍微复杂的命令。其中[range]是一个可选项，用来指定搜索替换的范围。[flags]也是一个可选项，用来指定搜索替换的处理方式。所以这个命令的简单形式是:s/from/to/。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;搜索替换的范围。如果没有指定范围，则只在当前行进行搜索替换。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;在所有行进行搜索替换。范围符号%表示在所有行进行搜索替换。:%s/from/to/就是在全文查找from并替换为to。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;在指定的行上进行搜索替换。:1,50s/from/to/表示在第1行和第50行之间（包括1和50行）进行搜索和替换。:45s/from/to/表示仅仅在第45行进行搜索和替换。而"1,$"行号范围和&amp;#8220;%&amp;#8220;是等价的。&lt;/FONT&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;处理方式。我现在使用的VIM默认的方式是无须确认。不过好像不同版本的默认的处理方式是不同的。&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT size=3&gt;无须确认。方式符号g表示直接替换无须进行确认。:%s/from/to/g表示在全文中查找from并且直接全部替换为to。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;列印。处理方式符号p表示在替换时列出每个被改变的行。手册中这么说，但是实际效果却让我很迷惑。&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT size=3&gt;确认后处理。处理方式符号c表示在进行替换前需要用户进行确认。这时你可以选择(y/n/a/q/1/^E/^Y）:y表示同意当前替换；n表示不同意当前替换；a表示替换当前和后面的并且不再确认；q表示立即结束替换操作；1表示把当前的替换后结束替换操作；^E向上滚屏^Y向下滚屏，用来帮助查看前后内容以决定进行操作。&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/OL&gt;

摘自：http://jnote.cn/blog/read/vim-search.html&lt;img src ="http://notemper2x.cndev.org/aggbug/60354.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>自动通过代理服务器访问某些网站</title><link>http://notemper2x.cndev.org/archive/2009/01/05/59737.aspx</link><pubDate>2009-01-05 10:35:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2009/01/05/59737.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/59737.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2009/01/05/59737.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/59737.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/59737.aspx</trackback:ping><description>&lt;P&gt;Auto Proxy Config 自动通过代理服务器访问某些网站：&lt;/P&gt;
&lt;P&gt;在C盘根目录下新建文件proxy.pac，用写字板写入如下内容：&lt;BR&gt;function FindProxyForURL(url, host)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;if (dnsDomainIs(host, ".acs.org"))&lt;BR&gt;return "PROXY 10.1.1.20:8080; DIRECT";&lt;BR&gt;else if (dnsDomainIs(host, ".nature.com"))&lt;BR&gt;return "PROXY 10.1.1.2:80; DIRECT";&lt;BR&gt;else&lt;BR&gt;return "DIRECT";&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;在浏览器中，菜单"工具"-"Internet选项"-"连接"-"局域网设置"，不勾"自动检测设置"和"为LAN使用代理服务器。。"，勾上"使用自动配置脚本"，在地址后面填上&lt;A href="file:///c:/proxy.pac"&gt;file://c:\proxy.pac&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.pac称为自动代理配置文件，是用Javascript写的脚本。上面的例子有如下功能：当访问任何网址中含有acs.org的网站时，浏览器将自动通过代理10.1.1.20:8080访问；当访问任何网址中含有nature.com的网站时，浏览器将自动通过代理10.1.1.2:80访问。如果这两个代理链接不上，访问以上两种网站将不通过代理服务器（直接连接），如果是访问其他的网站，直接连接。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;关于自动代理配置文件的其他写法，可以参考下面的内容：&lt;BR&gt;&lt;SPAN&gt;Proxy Auto Config檔的語法 II (來自微軟的說明文件)&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT style="FONT-FAMILY: courier new,courier,monospace" size=3&gt;前陣子整理了一篇PAC語法的文章(&lt;A title=http://blog.xuite.net/efchang/network/4419196 href="http://blog.xuite.net/efchang/network/4419196" target=_blank&gt;這裡&lt;/A&gt;)&lt;BR&gt;今天在找另一個課題的解決之道時&lt;BR&gt;無意中看到微軟"Internet Explorer維護"的說明文件也有介紹&lt;BR&gt;&lt;BR&gt;功能強大卻又簡單清楚&lt;BR&gt;特別是洋洋灑灑10個範例&lt;BR&gt;相當具有參考價值&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;HR style="WIDTH: 100%; HEIGHT: 2px"&gt;

&lt;P&gt;&lt;/P&gt;
&lt;DIV&gt;
&lt;H1&gt;JavaScript 或 JScript 自動 Proxy 範例檔&lt;/H1&gt;
&lt;P&gt;下面的指令檔提供如何使用 .pac 檔指定自動 Proxy URL 的範例。若要使用這些函數，您必須變更 Proxy 伺服器的名稱、連接埠號碼和 IP 位址。&lt;/P&gt;
&lt;P&gt;注意事項&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;isInNet()、isResolvable() 及 dnsResolve() 函數可查詢 DNS 伺服器。 
&lt;LI&gt;對「物件模型」物件、內容或方法的參照會導致 Proxy 伺服器自動設定檔無法執行。例如，window.open(...)、alert(...) 和 password(...) 的參照會導致 Proxy 自動設定檔無法在 Internet Explorer 上執行。 &lt;/LI&gt;&lt;/UL&gt;
&lt;H2&gt;範例一：近端主機直接連線，其他所有電腦則透過 Proxy 伺服器連線&lt;/H2&gt;
&lt;P&gt;下列函數會檢查主電腦名稱是否為本端主機，如果是，則會檢查是否為直接連線。如果主機名稱不是本端主機，則連線是透過 Proxy (&lt;I&gt;proxy&lt;/I&gt;)。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;if (isPlainHostName(host))&lt;BR&gt;return "DIRECT";&lt;BR&gt;else&lt;BR&gt;return "PROXY proxy:80";&lt;BR&gt;  }&lt;/PRE&gt;
&lt;P&gt;isPlainHostName() 函數會檢查主機名稱中是否有句點。如果有，則傳回 false。否則傳回 true。&lt;/P&gt;
&lt;H2&gt;範例二：防火牆內的主機直接連線，近端伺服器外的主機透過 Proxy 伺服器連線&lt;/H2&gt;
&lt;P&gt;下面的函數將檢查主機名稱中是否為「簡單」主機名稱 (即不包含網域名稱)，還是非 www 或 home 主機名稱的特定網域 (.company.com) 一部分。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;if ((isPlainHostName(host) ||&lt;BR&gt;dnsDomainIs(host, ".company.com")) &amp;amp;&amp;amp;&lt;BR&gt;!localHostOrDomainIs(host, "www.company.com") &amp;amp;&amp;amp;&lt;BR&gt;!localHostOrDoaminIs(host, "home.company.com"))&lt;BR&gt;&lt;BR&gt;return "DIRECT";&lt;BR&gt;else&lt;BR&gt;return "PROXY proxy:80";&lt;BR&gt;  }&lt;/PRE&gt;
&lt;P&gt;注意事項&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;localHostOrDomainIs() 函數的執行只限於區域網域中的 URL。 
&lt;LI&gt;如果主機名稱中的網域名稱與所給的網域名稱相符，則 dnsDomainIs 函數傳回 True。 &lt;/LI&gt;&lt;/UL&gt;
&lt;H2&gt;範例三：如果主機是可解析的，則為直接連線。否則為透過 Proxy 連線&lt;/H2&gt;
&lt;P&gt;下面的函數會要求 DNS 伺服器解析所傳遞的主機名稱。如果可以，則建立直接連線。如果不可以，則透過 Proxy 伺服器建立連線。若要使用內部 DNS 伺服器辨識所有的內部主機名稱，可使用本函數。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;if (isResolvable(host))&lt;BR&gt;return "DIRECT";&lt;BR&gt;else&lt;BR&gt;return "PROXY proxy:80";&lt;BR&gt;  }&lt;/PRE&gt;
&lt;P&gt;有關 isResolvable() 函數的注意事項，請參閱本頁開始部分。&lt;/P&gt;
&lt;H2&gt;範例四：如果主機是在指定的子網路中，則為直接連線。否則為透過 Proxy 連線&lt;/H2&gt;
&lt;P&gt;下面的函數會將所給的 IP 位址模式和遮罩與主機名稱相比較。若要讓子網路中的某些主機直接連線，而其他主機則透過 Proxy 伺服器連線，可使用本函數。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;if (isInNet(host, "999.99.9.9", "255.0.255.0"))&lt;BR&gt;return "DIRECT";&lt;BR&gt;else&lt;BR&gt;return "PROXY proxy:80";&lt;BR&gt;  }&lt;/PRE&gt;
&lt;P&gt;有關 isInNet() 函數的注意事項，請參閱本頁開始部分。&lt;/P&gt;
&lt;P&gt;如果主機的 IP 位址與指定的模式相符，函數 isInNet(host, pattern, mask) 傳回 True。遮罩會標示 IP 位址相符的部分 (255=相符，0=略過)。&lt;/P&gt;
&lt;H2&gt;範例五：根據主機網域決定連線類型&lt;/H2&gt;
&lt;P&gt;如果主機位於近端，下面的函數將指定建立直接連線。如果主機不位於近端，該函數將依據主機所在的網域，決定使用哪個 Proxy 伺服器。如果主機的網域名稱是選擇 Proxy 伺服器的標準之一，可使用本函數。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;if (isPlainHostName(host))&lt;BR&gt;return "DIRECT";&lt;BR&gt;else if (shExpMatch(host, "*.com"))&lt;BR&gt;return "PROXY comproxy:80";&lt;BR&gt;else if (shExpMatch(host, "*.edu"))&lt;BR&gt;return "PROXY eduproxy:80";&lt;BR&gt;else&lt;BR&gt;return "PROXY proxy";&lt;BR&gt;  }&lt;/PRE&gt;
&lt;P&gt;如果使用 Shell 表示式模式時，str 與 shexp 相符，則 shExpMatch(str、shexp) 函數會傳回 True。&lt;/P&gt;
&lt;H2&gt;範例六：根據將使用的通訊協定決定連線類型&lt;/H2&gt;
&lt;P&gt;下面的函數會擷取所使用的通訊協定，並依據它選擇 Proxy 伺服器。如果無法搭配通訊協定，則直接連線。如果將使用的通訊協定是選擇 Proxy 伺服器的標準之一，可使用本函數。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;	  if (url.substring(0, 5) == "http:") {&lt;BR&gt;		return "PROXY proxy:80";&lt;BR&gt;	  }&lt;BR&gt;	  else if (url.substring(0, 4) == "ftp:") {&lt;BR&gt;		return "PROXY fproxy:80";&lt;BR&gt;	  }&lt;BR&gt;	  else if (url.substring(0, 7) == "gopher:") {&lt;BR&gt;		return "PROXY gproxy";&lt;BR&gt;	  }&lt;BR&gt;	  else if (url.substring(0, 6) == "https:") {&lt;BR&gt;		return "PROXY secproxy:8080";&lt;BR&gt;	  }&lt;BR&gt;	  else {&lt;BR&gt;		return "DIRECT";&lt;BR&gt;	  }&lt;BR&gt;  }&lt;BR&gt;&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;substring 函數從字串中提取指定數目的字元。&lt;/P&gt;
&lt;H2&gt;範例七：檢查主機名稱是否符合 IP 位址來決定 Proxy 設定&lt;/H2&gt;
&lt;P&gt;下面的函數將主機名稱轉換為 IP 位址，並將它與指定的字串相比較，以選擇 Proxy 伺服器。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;	  if (dnsResolve(host) == "999.99.99.999") { // = http://secproxy&lt;BR&gt;		return "PROXY secproxy:8080";&lt;BR&gt;	  }&lt;BR&gt;	  else {&lt;BR&gt;		return "PROXY proxy:80";&lt;BR&gt;	  }&lt;BR&gt;  }&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;有關 dnsResolve() 函數的注意事項，請參閱本頁開始部分。&lt;/P&gt;
&lt;H2&gt;範例八：如果主機的 IP 位址與指定的 IP 位址相符合，則透過 Proxy 連線。否則直接連線&lt;/H2&gt;
&lt;P&gt;下面的函數是透過指定 IP 位址選擇 Proxy 伺服器的另一種方式。與範例七不同的是，它採用函數呼叫的方式，明確取得數位表示的 IP 位址 (範例七用 dnsResolve() 函數將主機名稱轉化為數字表示的 IP 位址)。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;	  if (myIpAddress() == "999.99.999.99") { &lt;BR&gt;		return "PROXY proxy:80";&lt;BR&gt;	  }&lt;BR&gt;	  else {&lt;BR&gt;		return "DIRECT";&lt;BR&gt;	  }&lt;BR&gt;  }&lt;/PRE&gt;
&lt;P&gt;myIpAddress() 函數會傳回正在執行瀏覽器的主機 IP 位址 (以整數加句點的格式)。&lt;/P&gt;
&lt;H2&gt;範例九：如果主機名稱中有任何句點，則透過 Proxy 連線。否則為直接連線&lt;/H2&gt;
&lt;P&gt;下面的函數用於查看主機名稱中有多少英文句號。如果主機名稱中有句點，則透過 Proxy 伺服器建立連線。如果主機名稱中沒有句點，則直接建立連線。這是依據主機名稱的型式確定連線類型的另一種方式。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;	  if (dnsDomainLevels(host) &amp;gt; 0) { // if the number of dots in host &amp;gt; 0&lt;BR&gt;		return "PROXY proxy:80";&lt;BR&gt;	  }&lt;BR&gt;		return "DIRECT";&lt;BR&gt;  }&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;dnsDomainLevels() 函數會傳回一個代表主機名稱句點個數的整數。&lt;/P&gt;
&lt;H2&gt;範例十：指定每週哪幾天透過 Proxy 伺服器建立連線，其餘直接建立連線&lt;/H2&gt;
&lt;P&gt;下面的函數透過指定每週有哪些天使用 Proxy 伺服器連線來決定連線類型。不在這些參數之間的那幾天將直接進行連線。若要在網路資料流量過大時使用 Proxy 伺服器，而在網路資料流量減少時進行直接連線，則可使用本函數。&lt;/P&gt;&lt;PRE&gt;function FindProxyForURL(url, host)&lt;BR&gt;  {&lt;BR&gt;	if(weekdayRange("WED", "SAT", "GMT")) &lt;BR&gt;	 return "PROXY proxy:80";&lt;BR&gt;	else &lt;BR&gt;	 return "DIRECT";&lt;BR&gt;  }&lt;/PRE&gt;&lt;/DIV&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/59737.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>UltraEdit 正则表达式</title><link>http://notemper2x.cndev.org/archive/2007/07/17/53023.aspx</link><pubDate>2007-07-17 14:37:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2007/07/17/53023.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/53023.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2007/07/17/53023.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/53023.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/53023.aspx</trackback:ping><description>&lt;DIV class=content_div id=text3594&gt;UltraEdit 允许在搜索菜单下面列出了的许多搜索和替换功能中使用正则表达式。正则表达式能让更多的复杂的搜索和替换功能变成简单的操作。（中文版界面上显示为&amp;#8220;正规表达式&amp;#8221;）&lt;BR&gt;有两个可使用的语法集合。下面的第一表显示出在 UltraEdit 的更早的版本被使用的原来的 UltraEdit 句法。第二表给出了可选的"Unix"类型的正则表达式。这可以从配置单元启用。&lt;BR&gt;&lt;BR&gt;符号 &amp;nbsp;功能&lt;BR&gt;% &amp;nbsp; &amp;nbsp; 匹配行的开始 - 显示搜索字符串必须在行的开始，但是在所选择的结果字符串中不包括任何行终止字符。&lt;BR&gt;$ &amp;nbsp; &amp;nbsp; 匹配行尾 - 显示搜索字符串必须在行尾，但是在所选择的结果字符串中不包括任何行终止字符。&lt;BR&gt;? &amp;nbsp; &amp;nbsp; 除了换行符以外匹配任何单个的字符&lt;BR&gt;* &amp;nbsp; &amp;nbsp; 除了换行符匹配任何数量的字符和数字&lt;BR&gt;+ &amp;nbsp; &amp;nbsp; 前一字符匹配一个或多个，但至少要出现一个&lt;BR&gt;++ &amp;nbsp; &amp;nbsp;前一字符匹配零个或多个，但至少要出现一个&lt;BR&gt;^b &amp;nbsp; &amp;nbsp;匹配一个分页&lt;BR&gt;^p &amp;nbsp; &amp;nbsp;匹配一个换行符(CR/LF)(段)(DOS文件)&lt;BR&gt;^r &amp;nbsp; &amp;nbsp;匹配一个换行符(CR 仅仅)(段)(MAC 文件)&lt;BR&gt;^n &amp;nbsp; &amp;nbsp;匹配一个换行符 ( LF 仅仅 )( 段 )( UNIX 文件 )&lt;BR&gt;^t &amp;nbsp; &amp;nbsp;匹配一个标签字符TAB &lt;BR&gt;[] &amp;nbsp; &amp;nbsp;匹配任何单个的字符，或在方括号中的范围&lt;BR&gt;^{A^}^{ B^} 匹配表达式A或 B &lt;BR&gt;^ &amp;nbsp; &amp;nbsp; 重载其后的正规表达式字符 &lt;BR&gt;^(^) &amp;nbsp;括或标注为用于替换命令的表达式。&lt;BR&gt;&lt;BR&gt;一个正则表达式最多可以有9个标注表达式, 按正规表达式的需要而定。 &lt;BR&gt;相应的替换表达式是 ^x , 替换范围x是1-9。例如：&lt;BR&gt;If ^(h*o^) ^(f*s^) matches "hello folks", &lt;BR&gt;^2 ^1 would replace it with "folks hello".&lt;BR&gt;&lt;BR&gt;（hello folks 将被替换成 folks hello。）&lt;BR&gt;&lt;BR&gt;注： ^ 是实际字符 ^不是Ctl + 键值。&lt;BR&gt;&lt;BR&gt;例如：&lt;BR&gt;m?n 匹配 "man","men","min" 但不匹配 "moon".&lt;BR&gt;t*t 匹配 "test","tonight" 和 "tea time" (the "tea t" portion) 但不匹配 "tea &lt;BR&gt;time" (newline between "tea " and "time").&lt;BR&gt;Te+st 匹配 "test","teest"," teeeest "等等。但是不匹配 "tst"。&lt;BR&gt;[aeiou] &amp;nbsp;匹配每个小写元音。&lt;BR&gt;[,.?] &amp;nbsp;匹配一文字的 ","，"."或 "?"。&lt;BR&gt;[0-9, a-z] 匹配任何数位，或小写字母。&lt;BR&gt;[~0-9] 除了数字以外匹配任何字符 (~ 意味着"不")&lt;BR&gt;&lt;BR&gt;你按如下方式可以查找一个表达式A或 B ：&lt;BR&gt;&lt;BR&gt;"^{John^}^{Tom^}"&lt;BR&gt;&lt;BR&gt;这将在找John或Tom的出现。应该在 2 个表达式之间没有任何东西。&lt;BR&gt;&lt;BR&gt;你可以在同一搜索中按如下方式组合A or B and C or D：&lt;BR&gt;&lt;BR&gt;"^{John^}^{Tom^}^{Smith^}^{Jones^}"&lt;BR&gt;&lt;BR&gt;这将在John or Tom 后面找 Smith or Jones。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;下表为"Unix"句法类型的正则表达式。&lt;BR&gt;&lt;BR&gt;正则表达式 (Unix句法)：&lt;BR&gt;&lt;BR&gt;符号 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;功能&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 标记下一个字符作为一个特殊的字符。&lt;BR&gt;"n" &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配字符"n"。"n" 一个换行符或换行符字符。&lt;BR&gt;^ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配/定位行的开始。&lt;BR&gt;$ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配/定位行的尾。&lt;BR&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配前面的字符零次或多次。例&lt;BR&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配前面的字符一次或多次。例&lt;BR&gt;. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配除了一个换行符字符匹配任何单个的字符。&lt;BR&gt;(expression)标注用于替换命令的表达式。一个正则表达式根据需要，最多可以有9个标注表达式。相应的代替表达式是 x , x的范围是 1-9 。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;例如：&lt;BR&gt;&lt;BR&gt;If (h.*o) (f.*s) matches "hello folks", &lt;BR&gt;2 1 would replace it with "folks hello".&lt;BR&gt;（hello folks 将被替换成 folks hello。）&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;[xyz] &amp;nbsp; &amp;nbsp; &amp;nbsp; 一个字符集。匹配在方括号之间的任何字符。&lt;BR&gt;[^xyz] &amp;nbsp; &amp;nbsp; &amp;nbsp;一个否定的字符集。不匹配在方括号之间的任何字符。&lt;BR&gt;d &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个数字字符。等价于[0-9]。&lt;BR&gt;D &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个非数字字符。等价于[^0-9]。&lt;BR&gt;f &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个换页字符。&lt;BR&gt;n &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个换行字符。&lt;BR&gt;r &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个回车符字符。&lt;BR&gt;s &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配任何空白的空格, 标签, 换页, 包括空格等等，但不匹配换行符。&lt;BR&gt;S &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配任何非空白的字符，但不匹配换行符。&lt;BR&gt;t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个标签TAB字符。&lt;BR&gt;v &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个垂直的标签字符。&lt;BR&gt;w &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配任何词语字符包括下划线。&lt;BR&gt;W &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配任何非词语字符字符。&lt;BR&gt;&lt;BR&gt;注： ^ 是实际字符 ^不是Ctl + 键值。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;例如：&lt;BR&gt;m.n &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配 "man","men","min" 但不匹配 "moon".&lt;BR&gt;t+t &amp;nbsp; &amp;nbsp; &amp;nbsp; 匹配 "test","tonight" 和 "tea time" (the "tea t" portion) 但不匹配 "tea &lt;BR&gt;time" (newline between "tea " and "time").&lt;BR&gt;Te*st &amp;nbsp; &amp;nbsp; 匹配 "test","teest"," teeeest "等等。但是不匹配 "tst"。&lt;BR&gt;[aeiou] &amp;nbsp; 匹配每个小写元音。&lt;BR&gt;[,.?] &amp;nbsp; &amp;nbsp; 匹配一文字的 ","，"."或 "?"。&lt;BR&gt;[0-9,a-z] 匹配任何数位，或小写字母。&lt;BR&gt;[^0-9] &amp;nbsp; &amp;nbsp;除了数字以外匹配任何字符 (~ 意味着"不")&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;你按如下方式可以查找一个表达式A或 B ：&lt;BR&gt;&lt;BR&gt;"(John)|(Tom)"&lt;BR&gt;&lt;BR&gt;这将在找John或Tom的出现。应该在 2 个表达式之间没有任何东西。&lt;BR&gt;&lt;BR&gt;你可以在同一搜索中按如下方式组合A or B and C or D：&lt;BR&gt;&lt;BR&gt;"(John|Tom) (Smith|Jones)"&lt;BR&gt;&lt;BR&gt;这将在John or Tom 后面找 Smith or Jones。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;另外：&lt;BR&gt;&lt;BR&gt;p &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配 CR/LF ( 作为 rn 的一样 ) 作为DOS行结束符匹配&lt;BR&gt;&lt;BR&gt;如果查找/替换功能中正则表达式没有选用，则替换字段中下列字符也是有效的：&lt;BR&gt;&lt;BR&gt;符号 &amp;nbsp; 功能&lt;BR&gt;&lt;BR&gt;^^ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个 "^" 字符&lt;BR&gt;^s &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;替换为被选择 ( 加亮 ) 活跃的文件窗口的文章。&lt;BR&gt;^c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;替换为剪贴板的内容&lt;BR&gt;^b &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个页裂缝&lt;BR&gt;^p &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个换行符 ( CR/LF )( 段 )( DOS 文件)&lt;BR&gt;^r &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个换行符 ( CR 仅仅 )( 段 )( MAC 文件)&lt;BR&gt;^n &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个换行符 ( LF 仅仅 )( 段 )( UNIX 文件)&lt;BR&gt;^t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;匹配一个标签TAB字符&lt;/DIV&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/53023.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"</title><link>http://notemper2x.cndev.org/archive/2007/02/14/50728.aspx</link><pubDate>2007-02-14 22:40:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2007/02/14/50728.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/50728.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2007/02/14/50728.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/50728.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/50728.aspx</trackback:ping><description>&lt;P&gt;有DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"和无指定时的css差异。&lt;/P&gt;
&lt;P&gt;一、width=100%&lt;/P&gt;
&lt;P&gt;未指定DOCTYPE时：&lt;/P&gt;
&lt;P&gt;块的总宽度是上级块的内容宽度，&lt;BR&gt;块的内容宽度在指定 margin-left 与 margin-right&amp;nbsp;的中间。&lt;/P&gt;
&lt;P&gt;指定了DOCTYPE时：&lt;/P&gt;
&lt;P&gt;块的总宽度是 margin-left + margin-right + width（width指定的是 margin-left 与 margin-right 中间的内容区；&lt;BR&gt;如果想实现未指定DOCTYPE时的width=100%的效果需要 left=0; right=0。&lt;/P&gt;
&lt;P&gt;二、SCOROLLBAR&lt;/P&gt;
&lt;P&gt;未指定DOCTYPE时，关于 SCROLLBAR 的相关 CSS 可以写在 body 或 html 里。&lt;/P&gt;
&lt;P&gt;指定了DOCTYPE时，必须要写在 html 里：&lt;/P&gt;
&lt;P&gt;&amp;nbsp;SCROLLBAR-FACE-COLOR: #F0F0F0;&lt;BR&gt;&amp;nbsp;SCROLLBAR-HIGHLIGHT-COLOR: #FFFFFF;&lt;BR&gt;&amp;nbsp;SCROLLBAR-SHADOW-COLOR: #E0E0E0;&lt;BR&gt;&amp;nbsp;SCROLLBAR-3DLIGHT-COLOR: #000000;&lt;BR&gt;&amp;nbsp;SCROLLBAR-ARROW-COLOR: #000000;&lt;BR&gt;&amp;nbsp;SCROLLBAR-TRACK-COLOR: #cccccc;&lt;BR&gt;（只对IE有效）&lt;/P&gt;
&lt;P&gt;三、display:inline-block 和 display:block 是有区别的&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/50728.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>【技术】C++Builder, Use dynamic RTL</title><link>http://notemper2x.cndev.org/archive/2006/05/26/46160.aspx</link><pubDate>2006-05-26 03:57:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2006/05/26/46160.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/46160.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2006/05/26/46160.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/46160.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/46160.aspx</trackback:ping><description>&lt;P&gt;这几天在弄一个调用了WMSDK和引用了Windows&amp;nbsp;Media Player 9/10 组件的ActiveX组件。生成了一个&amp;nbsp;.ocx，将要发布时在一台 Windows 2000 with SP4 + WMP9&amp;nbsp;的&amp;#8220;干净&amp;#8221;机器上测试时，发现这个 ocx 文件不能通过 regsvr32 注册（缺少dll那种错误）。&lt;/P&gt;
&lt;P&gt;找了好久的原因&amp;#8230;&amp;#8230;，主要呐闷的是：同样条件编译的.exe应用程序在同样的环境中运行没有问题，但这个ocx就是不能注册。&lt;/P&gt;
&lt;P&gt;通过 UltraEdit 查看 .ocx 的16进制内容，及用 tdump -em. 发现在这个 .ocx 中有两个不常见的 dll：wmvcore.dll、vcltest3.dll 和 stlpmt45.dll。&lt;/P&gt;
&lt;P&gt;其中，wmvcore.dll 在安装 WMP9 后就出现的 dll，应该没有问题。后两个文件缺是 C++Builder 自己的 bin 目录中的。为了测试，将这两个文件复制到 ocx 的目录中、system32 目录中，ocx还是不能注册（ocx换方案编译也不行）。&lt;/P&gt;
&lt;P&gt;一气之下，将 C++Builder bin&amp;nbsp;下的所有内容都复制到 ocx 目录中&amp;#8230;&amp;#8230;，竟然注册成功了&amp;#8212;&amp;#8212;确定了问题就在这些库中，一点一点的查，最终发现 ocx 的注册需要 cc3260mt.dll、stlpmt45.dll，那个 vcltest3.dll 却不是必须。&lt;/P&gt;
&lt;P&gt;在网上查资料：cc3260mt 似乎是关于 Use dynamic RTL 选择打开后，使用 MultiThread 编译的程序所需的，stlpmt45.dll 到是没有查到什么结果（我一直以为它是 STL 的什么库，后来确认程序通过他来调用 cc3260mt.dll）。&lt;/P&gt;
&lt;P&gt;关于 Use dynamic RTL：&lt;/P&gt;
&lt;P&gt;默认情况下使用 C++Builder 开发编译的应用程序，是需要一些 Borland 的运行时库来支持的。像我这样从Delphi&amp;#8220;转型&amp;#8221;过来的人应该知道：将 Project-&amp;gt;Options-&amp;gt;Packages 里的 Build with runtime packages 取消选中，可以脱离 Borland Package Library 运行时库。&lt;/P&gt;
&lt;P&gt;但在 C++Builder 里光去掉上面这项还不能完全解脱。Project-&amp;gt;Options-&amp;gt;Linker-&amp;gt;Use dynamic RTL 选项也去掉（印象中如果不去掉它会需要 BorlandMM.dll）。&lt;/P&gt;
&lt;P&gt;看到网上的资料说 cc3260mt 也是用于对 dynamic RTL 支持的，便在 DLL项目中左看右看，也没看到那个 Use dynamic RTL 打着勾。&lt;/P&gt;
&lt;P&gt;这个 DLL 项目使用了两个自己开发的&amp;nbsp;.lib，这两个 .lib 也用于 EXE 项目的开发，所以一直没有想问题会不会出在 .lib 上（尽管也更改过一些选项重新编译过这两个 .lib）。&lt;/P&gt;
&lt;P&gt;翻来覆去的看，突然发现：原来 LIB 项目的 Project-&amp;gt;Options-&amp;gt;TLib 页里，也有一个 Use dynamic RTL 项，把这两个 LIB 项目的这个选项去掉，再编译生成 .ocx &amp;#8212;&amp;#8212;一切正常啦&amp;#8230;&amp;#8230;&lt;/P&gt;
&lt;P&gt;还是奇怪为什么 .exe 的应用就不受 .lib 中的这个选项的影响。是已经影响了我没发现？或是 .exe 或&amp;nbsp;.ocx 编译时哪个编译器有 BUG？呵呵，又是说人家的错，还是别没事就把错归结到人家头上。有错先找自己原因，反正现在的问题解决了，先睡觉再说。&lt;/P&gt;
&lt;P&gt;写这篇文章地目的是：&lt;/P&gt;
&lt;P&gt;多写一篇凑数（好长时间没写了），希望提交时别报错。&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/46160.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>【技术】Indy 10 的问题</title><link>http://notemper2x.cndev.org/archive/2006/01/30/45075.aspx</link><pubDate>2006-01-30 00:21:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2006/01/30/45075.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/45075.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2006/01/30/45075.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/45075.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/45075.aspx</trackback:ping><description>&lt;P&gt;用 Indy10.0.52 写 FTP Server&lt;/P&gt;
&lt;P&gt;错误发现：&lt;/P&gt;
&lt;P&gt;在 OnChangeDirectory 事件中，raise 自定义异常，在客户端看到错误消息，但命令反馈代码为 200，相当时客户端认为此命令正常执行。&lt;/P&gt;
&lt;P&gt;错误研究：&lt;/P&gt;
&lt;P&gt;原有程序 IdCommandHandlers.pas 第441行：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ExceptionReply.Code = '' then begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reply.Assign(Self.ExceptionReply);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If still no go, from server&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Can be nil though. Typically only servers pass it in&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ExceptionReply.Code = '') and (TIdCommandHandlers(Collection).FExceptionReply &amp;lt;&amp;gt; nil)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExceptionReply.Assign(TIdCommandHandlers(Collection).FExceptionReply);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ExceptionReply.Code &amp;lt;&amp;gt; '' then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reply.Text.Add(E.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SendReply;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end else begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;
&lt;P&gt;当异常抛出后，ExceptionReply.Code 常为 550，而在此部分的运行中，SendReply必将一个没有定义过反馈代码的 Reply 发向客户端。&lt;/P&gt;
&lt;P&gt;经分析，当 ExceptionReply.Code 为空字符串时，向 Reply 赋予 ExceptionReply 的值，显然是不何理的。而且异常发生时 ExceptionReply.Code 的值又常是 '550'。&lt;/P&gt;
&lt;P&gt;怀疑是 Indy 的错误，所以将441行：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ExceptionReply.Code&amp;nbsp;= '' then begin&lt;BR&gt;改为：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ExceptionReply.Code &amp;lt;&amp;gt; '' then begin&lt;/P&gt;
&lt;P&gt;可以解决发现的问题。（注释代码：{F34C2328-8505-4FFE-9A94-9D7F8E67E46D}）&lt;/P&gt;
&lt;P&gt;问题延伸：&lt;/P&gt;
&lt;P&gt;这似乎是 Indy10.0.52 IdFTPServer 的一个bug（也不排除我对它的功能理解错误的情况），IdFTPServer.ExceptionReply&amp;nbsp;属性似乎在使用中没有用处。&lt;/P&gt;
&lt;P&gt;先记录如上，暂时解决问题，以后有时间再深入研究。&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/45075.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>【学技术】看 SQL Server 2005 新功能是看到有关树结构处理的东东</title><link>http://notemper2x.cndev.org/archive/2005/11/10/44269.aspx</link><pubDate>2005-11-10 17:03:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2005/11/10/44269.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/44269.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2005/11/10/44269.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/44269.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/44269.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face="Courier New"&gt;WITH EmpCTE(empid, empname, mgrid, lvl, sortcol)&lt;BR&gt;AS&lt;BR&gt;( &lt;BR&gt;&amp;nbsp; SELECT empid, empname, mgrid, 0,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST(empid AS VARBINARY(900))&lt;BR&gt;&amp;nbsp; FROM Employees&lt;BR&gt;&amp;nbsp; WHERE empid = 1&lt;BR&gt;&amp;nbsp; UNION ALL&lt;BR&gt;&amp;nbsp; SELECT E.empid, E.empname, E.mgrid, M.lvl+1,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST(sortcol + CAST(E.empid AS BINARY(4)) AS VARBINARY(900))&lt;BR&gt;&amp;nbsp; FROM Employees AS E&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JOIN EmpCTE AS M&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON E.mgrid = M.empid&lt;BR&gt;)&lt;BR&gt;SELECT&lt;BR&gt;&amp;nbsp; REPLICATE(' | ', lvl)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + '(' + (CAST(empid AS VARCHAR(10))) + ') '&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + empname AS empname&lt;BR&gt;FROM EmpCTE&lt;BR&gt;ORDER BY sortcol&lt;BR&gt;(1) Nancy&lt;BR&gt;&amp;nbsp;| (2) Andrew&lt;BR&gt;&amp;nbsp;|&amp;nbsp; | (5) Steven&lt;BR&gt;&amp;nbsp;|&amp;nbsp; | (6) Michael&lt;BR&gt;&amp;nbsp;| (3) Janet&lt;BR&gt;&amp;nbsp;|&amp;nbsp; | (7) Robert&lt;BR&gt;&amp;nbsp;|&amp;nbsp; |&amp;nbsp; | (11) David&lt;BR&gt;&amp;nbsp;|&amp;nbsp; |&amp;nbsp; |&amp;nbsp; | (14) James&lt;BR&gt;&amp;nbsp;|&amp;nbsp; |&amp;nbsp; | (12) Ron&lt;BR&gt;&amp;nbsp;|&amp;nbsp; |&amp;nbsp; | (13) Dan&lt;BR&gt;&amp;nbsp;|&amp;nbsp; | (8) Laura&lt;BR&gt;&amp;nbsp;|&amp;nbsp; | (9) Ann&lt;BR&gt;&amp;nbsp;| (4) Margaret&lt;BR&gt;&amp;nbsp;|&amp;nbsp; | (10) Ina&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;吓了一跳，呵呵，不知真正用起来效率如何。反正试了一起想用的 通过 ROW_NUMBER&amp;nbsp;来分页，效率太低，挺失望的，带没找到提高效率的办法。&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/44269.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>【技术】.NET 2.0 在 IHttpHandlerFactory 中得到的</title><link>http://notemper2x.cndev.org/archive/2005/08/25/43309.aspx</link><pubDate>2005-08-25 02:19:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2005/08/25/43309.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/43309.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2005/08/25/43309.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/43309.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/43309.aspx</trackback:ping><description>&lt;P&gt;IHttpHandler GetHandler( HttpContext context, string requestType, string url, string path )&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;下面是在实现 IHttpHandlerFactory 的类中 GetHandler 函数中得到的值（Web.Config 中已经在 HttpHandlers 设置中，将 path=* 映射到了这个HttpHandlerFactory 上：&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/&lt;BR&gt;path: d:\vhosts\myweb\&lt;BR&gt;url: /myweb/&lt;BR&gt;context.Request.Path: /myweb/&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a&lt;BR&gt;path: d:\vhosts\myweb\a&lt;BR&gt;url: /myweb/a&lt;BR&gt;context.Request.Path: /myweb/a&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a/&lt;BR&gt;path: d:\vhosts\myweb\a&lt;BR&gt;url: /myweb/a/&lt;BR&gt;context.Request.Path: /myweb/a/&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a/&lt;BR&gt;path: d:\vhosts\myweb\a\&lt;BR&gt;url: /myweb/a/&lt;BR&gt;context.Request.Path: /myweb/a/&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a.aspx&lt;BR&gt;path: d:\vhosts\myweb\a.aspx&lt;BR&gt;url: /myweb/a.aspx&lt;BR&gt;context.Request.Path: /myweb/a.aspx&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a.aspx?b=c&lt;BR&gt;path: d:\vhosts\myweb\a.aspx&lt;BR&gt;url: /myweb/a.aspx&lt;BR&gt;context.Request.Path: /myweb/a.aspx&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a.aspx/b&lt;BR&gt;path: d:\vhosts\myweb\a.aspx&lt;BR&gt;url: /myweb/a.aspx&lt;BR&gt;context.Request.Path: /myweb/a.aspx/b&lt;/P&gt;
&lt;P&gt;访问地址：http://localhost/myweb/a.aspx/b.aspx/c.aspx&lt;BR&gt;path: d:\vhosts\myweb\a.aspx&lt;BR&gt;url: /myweb/a.aspx&lt;BR&gt;context.Request.Path: /myweb/a.aspx/b.aspx/c.aspx&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/43309.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>【技术】.NET C# 动态调用动态链接库中的函数。</title><link>http://notemper2x.cndev.org/archive/2005/08/12/43096.aspx</link><pubDate>2005-08-12 13:39:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2005/08/12/43096.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/43096.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2005/08/12/43096.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/43096.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/43096.aspx</trackback:ping><description>&lt;P&gt;C# 调用传统的&amp;nbsp;API&amp;nbsp;动态链接库，是.NET开发经常被讨论的问题。&lt;/P&gt;
&lt;P&gt;比如有这么一个动态链接库（delphi 语言）：&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;library&lt;/STRONG&gt; DelphiDLL;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;uses&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; SysUtils,&lt;BR&gt;&amp;nbsp; Classes,&lt;BR&gt;&amp;nbsp; Windows;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;{$R *.res}&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;function&lt;/STRONG&gt; TestMyFunction( a: Integer ): Integer; &lt;STRONG&gt;stdcall&lt;/STRONG&gt;;&lt;BR&gt;&lt;STRONG&gt;begin&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; Result := a * a;&lt;BR&gt;&lt;STRONG&gt;end&lt;/STRONG&gt;;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;exports&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; TestMyFunction;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;begin&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;end&lt;/STRONG&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;在C#中调用这个动态链接库的一般方法是：&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;DllStatic&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;[&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;DllImport&lt;/FONT&gt;&lt;/STRONG&gt;( &lt;FONT color=#a52a2a&gt;"DelphiDLL.dll"&lt;/FONT&gt; )]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;public static extern int &lt;/FONT&gt;TestMyFunction( &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; a );&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;但这种方法类似传统语言对动态链接库的&amp;#8220;静态调用&amp;#8221;（如 delphi 中的 external ）。这种静态调用，有的时候并不是我们想要的。&lt;/P&gt;
&lt;P&gt;在传统语言中，我们可以用 LoadLibrary、GetProcAddress 来替代上面的方法。经过思考的试验，在C#中，也可以使用这种方法来实现。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;DllDynamic&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; [&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;DllImport&lt;/STRONG&gt;&lt;/FONT&gt;( &lt;FONT color=#a52a2a&gt;"Kernel32.dll"&lt;/FONT&gt; )]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;public static extern int&lt;/FONT&gt; LoadLibrary( &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt; lpFileName );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;[&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;DllImport&lt;/STRONG&gt;&lt;/FONT&gt;( &lt;FONT color=#a52a2a&gt;"Kernel32.dll"&lt;/FONT&gt; )]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;public static extern bool&lt;/FONT&gt; FreeLibrary( &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; hModule );&lt;BR&gt;&lt;BR&gt;&amp;nbsp; [&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;DllImport&lt;/FONT&gt;&lt;/STRONG&gt;( &lt;FONT color=#a52a2a&gt;"Kernel32.dll"&lt;/FONT&gt; )]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;public static extern &lt;STRONG&gt;IntPtr&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt; &lt;/STRONG&gt;GetProcAddress( &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; hModule, &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt; lpProcName );&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;Program&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;public delegate int&lt;/FONT&gt; TestMyFunction( int a );&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;static void&lt;/FONT&gt; Main( &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;[] args )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; hLib = &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;DllDynamic&lt;/STRONG&gt;&lt;/FONT&gt;.LoadLibrary( &lt;FONT color=#a52a2a&gt;"DelphiDLL.dll"&lt;/FONT&gt; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;try&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;IntPtr&lt;/FONT&gt;&amp;nbsp;ptr = &lt;STRONG&gt;&lt;FONT color=#0000ff&gt;DllDynamic&lt;/FONT&gt;&lt;/STRONG&gt;.GetProcAddress( hLib, &lt;FONT color=#a52a2a&gt;"TestMyFunction"&lt;/FONT&gt; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;TestMyFunction&lt;/FONT&gt;&lt;/STRONG&gt; myfunc = (&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;TestMyFunction&lt;/STRONG&gt;&lt;/FONT&gt;) &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;Marshal&lt;/STRONG&gt;&lt;/FONT&gt;.GetDelegateForFunctionPointer( ptr, &lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;( &lt;STRONG&gt;&lt;FONT color=#0000ff&gt;TestMyFunction&lt;/FONT&gt;&lt;/STRONG&gt; ) );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;for&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; i = 0; i &amp;lt; 10; i++ )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;Console&lt;/STRONG&gt;&lt;/FONT&gt;.WriteLine( myfunc( i ) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;finally&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;DllDynamic&lt;/STRONG&gt;&lt;/FONT&gt;.FreeLibrary( hLib );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;其中，对 GetProcAddress 的结果做何处理，是尝试多次的焦点问题。查找若干资料，终于发现 Marshal 类中的静态方法可以进行内存地址到函数托管的封存转换。&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/43096.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>没脾气2x</dc:creator><title>.Net 2.0 Beta 2 今天发现的怪问题</title><link>http://notemper2x.cndev.org/archive/2005/08/03/42964.aspx</link><pubDate>2005-08-03 02:02:00Z</pubDate><guid>http://notemper2x.cndev.org/archive/2005/08/03/42964.aspx</guid><wfw:comment>http://notemper2x.cndev.org/comments/42964.aspx</wfw:comment><comments>http://notemper2x.cndev.org/archive/2005/08/03/42964.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://notemper2x.cndev.org/comments/commentRss/42964.aspx</wfw:commentRss><trackback:ping>http://notemper2x.cndev.org/services/trackbacks/42964.aspx</trackback:ping><description>&lt;P&gt;在 web.config&amp;nbsp;中如下设定的 HttpModule 在 Web 应用启动时，偶尔会出现多个实例。在这些实例中，其中一个会保持下来，其它几个将在 n 分钟后自动 Dispose 掉。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;httpModules&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="MyHttpModule" type= "My.Framework.MyHttpModule, My.Framework" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/httpModules&amp;gt;&lt;/P&gt;
&lt;P&gt;这个问题影响到在 HttpModule 中，不能无顾忌的使用静态变量。&lt;/P&gt;
&lt;P&gt;比如，在 Dottext 0.96&amp;nbsp;中的 EventHttpModule 下面这样的写法是有问题的：&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;namespace &lt;/FONT&gt;Dottext.Framework.ScheduledEvents&lt;BR&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080&gt;///&lt;/FONT&gt; &lt;FONT color=#008000&gt;Summary description for EventModule.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080&gt;/// &amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public class&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;EventHttpModule&lt;/STRONG&gt;&lt;/FONT&gt;: System.Web.IHttpModule&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;Timer&lt;/STRONG&gt;&lt;/FONT&gt; eventTimer;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; EventHttpModule()&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;}&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; IHttpModule Members&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;public void&lt;/FONT&gt; Init( System.Web.&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;HttpApplication&lt;/STRONG&gt;&lt;/FONT&gt; application )&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; (eventTimer == &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;)&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;eventTimer = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;Timer&lt;/STRONG&gt;&lt;/FONT&gt;( &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;TimerCallback&lt;/STRONG&gt;&lt;/FONT&gt;( ScheduledEventWorkCallback ),&amp;nbsp;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;application.Context, 60000, EventManager.TimerMinutesInterval * 60000 );&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;}&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;private void&lt;/FONT&gt; ScheduledEventWorkCallback( &lt;FONT color=#0000ff&gt;object&lt;/FONT&gt; sender )&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;try&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;EventManager&lt;/STRONG&gt;&lt;/FONT&gt;.Execute();&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;catch&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;Exception&lt;/STRONG&gt;&lt;/FONT&gt; ex)&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;LogManager&lt;/FONT&gt;&lt;/STRONG&gt;.CreateExceptionLog( ex, "Failed ScheduledEventCallBack" );&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;public void&lt;/FONT&gt; Dispose()&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;eventTimer = &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;看到这个代码，首先的问题是 eventTimer 没有被显性的 Dispose，查阅MSDN及试验证明，Timer 类型（无论是 System.Threading.Timer 还是 System.Timers.Timer）不做显性的 Dispose，其计时器事件还是会被响应的。&lt;/P&gt;
&lt;P&gt;于是，在 &lt;FONT face="Courier New" size=2&gt;eventTimer = null;&lt;/FONT&gt; 前面加上了 &lt;FONT face="Courier New" size=2&gt;eventTimer.Dispose();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;然后经过一些方法测试，就发现了本篇开头发现的问题。&lt;FONT face="Courier New" size=2&gt;EventHttpModule &lt;/FONT&gt;出现了两个实例，其中一个实例创建了一个 eventTimer 实例，另外一个实例中，eventTimer 没有再次创建。过了一段时间，其中一个 &lt;FONT face="Courier New" size=2&gt;EventHttpModule &lt;/FONT&gt;实例（应该是没有被正式引用的 &lt;FONT face="Courier New" size=2&gt;EventHttpModule &lt;/FONT&gt;实例）被 Dispose，eventTimer 被终止，另一个 &lt;FONT face="Courier New" size=2&gt;EventHttpModule &lt;/FONT&gt;中，eventTimer 当然也就失去了计时器作用。&lt;/P&gt;&lt;img src ="http://notemper2x.cndev.org/aggbug/42964.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>