<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>铁匠</title><link>http://webuc.net/chinahuman/</link><description>做人要低调</description><managingEditor>铁匠</managingEditor><dc:language>af</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>铁匠</dc:creator><title>离真相总是一步之遥------终于完成了AVI文件格式的解析</title><link>http://webuc.net/chinahuman/archive/2008/12/03/10254.aspx</link><pubDate>Wed, 03 Dec 2008 16:52:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/12/03/10254.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10254.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/12/03/10254.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10254.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10254.aspx</trackback:ping><description>&lt;P&gt;虽然AVI的文件格式很熟悉了，根据RIFF file refence里面的说明生成的AVI拿mpc一类的播放器可以正常播放，但是windows media player却死活也播放不了。用偶的程序生成的AVI文件在目录里面也没有预览，也读不出文件里面的信息，搞得偶好郁闷。有时候甚至想把自己写的这个上千行的avibuilder删了，换成系统自带的avi相关的API来实现，不过看着那么多的API自己感觉很复杂，也没有办法支持压缩的格式，所以只好放弃。&lt;/P&gt;
&lt;P&gt;今天无聊了，又拿起了visual dub来看avi的格式，突然我发现我生成的avi文件和正常的avi文件的文件头的差别了（左边是错误的，右边是正确的，黄颜色背景的那个）：&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_ED49_%E6%8D%95%E8%8E%B7.jpg"&gt;&lt;IMG title=捕获 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=561 alt=捕获 src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_ED49_%E6%8D%95%E8%8E%B7_thumb.jpg" width=1056 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;一个极小的失误，费了好长的工夫。只怪当时看文档的时候没有多想想，怎么可能会把header的标识放到了stream上面。&lt;/P&gt;
&lt;P&gt;修改完了后，偶的avibuidler生成的AVI终于和正常的一样了。&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10254.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>自己安装温控器</title><link>http://webuc.net/chinahuman/archive/2008/11/08/10207.aspx</link><pubDate>Sat, 08 Nov 2008 06:25:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/11/08/10207.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10207.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/11/08/10207.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10207.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10207.aspx</trackback:ping><description>&lt;p&gt;首先看一下所有的材料和工具&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324619.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125111836_000.jpg"&gt;&lt;/a&gt;&lt;br&gt;费了半天的劲,终于把接收器的线装好了&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324620.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125117837_000.jpg"&gt;&lt;/a&gt;&lt;br&gt;看个详细点的(里面的文字写错了,接收器应该是控制器--!!!)&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324621.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125123086_000.jpg"&gt;&lt;/a&gt;&lt;br&gt;看看壁挂炉原来的控制器&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324622.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125127711_000.jpg"&gt;&lt;/a&gt;&lt;br&gt;换上温控器后的效果图&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324623.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125132585_000.jpg"&gt;&lt;/a&gt;&lt;br&gt;测试可以使用后,再把它们固定到墙上&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324624.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125136107_000.jpg"&gt;&lt;/a&gt;&lt;br&gt;最后看看完成后的效果图&lt;br&gt;&lt;a href="http://www.soufun.com/Album/PictureDetail_7304382_200_25324625.htm"&gt;&lt;img border="0" alt="按此在新窗口浏览图片" src="http://img1n.soufun.com/bbs/2008_11/08/bj/1226125139354_000.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10207.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>性能调优实录</title><link>http://webuc.net/chinahuman/archive/2008/10/25/10190.aspx</link><pubDate>Sat, 25 Oct 2008 14:17:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/10/25/10190.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10190.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/10/25/10190.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10190.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10190.aspx</trackback:ping><description>&lt;p&gt;一个产品又开发完成了,按例又是一轮的测试:功能测试,性能测试,容量测试...眼看着一切顺利,可是在最后一环,发现有问题:系统的响应时间很长,有时候一个操作十几秒才完成。&lt;/p&gt; &lt;p&gt;按惯例，又得查一下资源的占用情况：应用服务器和数据库服务器的CPU并不高，内存占用也不高，磁盘的IO也不高。一切显得很恑异。通过几个回合的操作，终于解决了问题：&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第一回合&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;抓了DUMP后，用windbg分析，发现里面有近200个工作线程，而这些工作线程的堆栈上面显示，他们要么在等待SQL的连接，要么正在读数据，总之一句话，就是卡在数据库这里了。于是想通过sqlserver2005的性能报表来查看哪些SQL最费时间，结果发现竟然没有安装这个功能，所以只好用以下SQL来实现：&lt;/p&gt; &lt;table border="0" cellspacing="0" cellpadding="2" width="600"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td bgcolor="#eeeeee" valign="top" width="600"&gt; &lt;p&gt;SELECT TOP 10  &lt;p&gt;[Average CPU used] = total_worker_time / qs.execution_count  &lt;p&gt;,[Total CPU used] = total_worker_time  &lt;p&gt;,[Execution count] = qs.execution_count  &lt;p&gt;,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2,  &lt;p&gt;(CASE WHEN qs.statement_end_offset = -1  &lt;p&gt;THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2  &lt;p&gt;ELSE qs.statement_end_offset END -  &lt;p&gt;qs.statement_start_offset)/2)  &lt;p&gt;,[Parent Query] = qt.text  &lt;p&gt;,DatabaseName = DB_NAME(qt.dbid)  &lt;p&gt;FROM sys.dm_exec_query_stats qs  &lt;p&gt;CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt  &lt;p&gt;ORDER BY [Average CPU used] DESC&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;发现排名前十名的SQL里有6个是这个应用里的，仔细分析里面的查询和表结构，竟然发现原来设计的一些索引在这个环境里面被删了，所以现在这几个查询变成了Table scan,难怪SQL的CPU会这么高，查询时间会这么长。把这些表的索引重新建上，这下好了。数据库的性能，索引致关重要，对于sql server来说，我们可以用查询分析器里面的“显示估计的执行计划”功能（在查询区域里面，选中SQL，右键就可以看到）来看这个查询是Table Scan还是Index scan还是Index seek还是clusted Index Seek.性能上来说，按性从好到差的顺序就是：clusted Index Seek》Index seek》Index scan》Table Scan。&lt;/p&gt; &lt;p&gt;重新给系统加上压力，这下好了。可是好景不长，才又压了十几分钟，响应时间又变长了。于是又得进行优化。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第二回合&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;正当我不知道如何是好的时候，比较有经验的同事，就发现了在系统响应时间比较长的时候，在系统的日志里面竟然有对应的错误日志，原来系统里面有未捕获的异常，当出现异常的时候，应用程序池重启了，于是这时候所有的请求都被挂起，所以响应时间比较长。修改完BUG后，继续上压力。但是好景不长，响应时间又高上来了。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第三回合&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;再次抓DUMP，可是发现里面的线程的执行时间并不长，基本上都是几百毫秒就完成了。真是让人头痛呀。还是那个经验丰富的同事，发现了问题。通过性能监视器，发现SQL里面的等待时间很长，也就是说SQL里面出现了锁等待。于是用SQL性能监视器，结果发现好家伙，里面的一些查询竟然已经执行了几秒钟了。于是再次打开这些查询，通过显示执行计划，发现这里面最费时间的一个XML解析，而这个同样的XML解析竟然在这里面有2个，而且这个解析发生在delete的时候出现，大家都知道在Delete数据的时候，会把表锁了，要解决问题就得缩短这个锁表的时间，于是把XML解析到一个临时表里面，然后再用临时表和要删除数据的表进行关联。通过长时间的压力测试，发现响应时间长的问题终于好了。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10190.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>在线程中创建webbrowser的问题</title><link>http://webuc.net/chinahuman/archive/2008/10/20/10183.aspx</link><pubDate>Mon, 20 Oct 2008 17:52:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/10/20/10183.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10183.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/10/20/10183.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10183.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10183.aspx</trackback:ping><description>&lt;p&gt;今天碰到了一个怪问题,在主界面上有一个方法"CreateBrowser"来动态创建webbrowser控件,同时设置一个按钮来测试这个方法,结果一切OK.然后再写一个线程,在这个线程里,通过事件来调用这个CreateBrowser方法,结果这个Browser死活不出来.try一把竟然提示:尚未调用 CoInitialize.&lt;/p&gt; &lt;p&gt;于是想当然地在主界面加上CoInitialize,可是,没有效果,但是在那个线程初始化或是在这个CreateBrowser方法中加它,结果是把整个程序挂在那里了.看来这问题不好解决.&lt;/p&gt; &lt;p&gt;只好想个办法绕过去,我的解决办法是用自定义的系统消息来实现.&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10183.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>用命令来设置IP</title><link>http://webuc.net/chinahuman/archive/2008/10/20/10181.aspx</link><pubDate>Mon, 20 Oct 2008 12:52:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/10/20/10181.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10181.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/10/20/10181.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10181.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10181.aspx</trackback:ping><description>&lt;p&gt;网络和共享中心打不开了,没有办法设置IP了,找到了以下设置IP的命令:&lt;/p&gt; &lt;p&gt;　C:\&amp;gt;netsh (然后执行netsh这个命令) &lt;br&gt;　　netsh&amp;gt;interface (netsh命令的子命令) &lt;br&gt;　　interface&amp;gt;ip (interface命令的子命令) &lt;br&gt;　　interface ip&amp;gt;set (interface ip命令的子命令) &lt;p&gt;set address - 设置指定的接口的 IP 地址或默认网关。 &lt;br&gt;　　set dns - 设置 DNS 服务器模式和地址。 &lt;br&gt;　　set wins - 设置 WINS 服务器模式和地址。 &lt;p&gt;set address "本地连接" static 192.168.0.2 255.255.255.0 192.168.0.1&lt;img src ="http://webuc.net/chinahuman/aggbug/10181.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>IE8和Google Chrome的对比</title><link>http://webuc.net/chinahuman/archive/2008/09/16/10129.aspx</link><pubDate>Tue, 16 Sep 2008 21:49:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/09/16/10129.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10129.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/09/16/10129.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10129.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10129.aspx</trackback:ping><description>&lt;p&gt;上上周装了&lt;a href="http://webuc.net/chinahuman/archive/2008/09/03/10110.aspx"&gt;Google Chrome&lt;/a&gt;后，很快就删了，头脑一发热就又去把IE7给升级成IE8了。看了一下IE8好像除了界面的颜色更柔合了一点，没有啥大的变化。但是经过几个小时的试用后，我发现IE8很好很强大，偶还常向同事推荐它。&lt;/p&gt; &lt;p&gt;现在说说偶觉IE8的亮点吧：&lt;/p&gt; &lt;p&gt;1.有强大的开发者工具，第一次看到开发者工具是在FF上面看到的，不过这些工具和IE8带的比起来，简直就像是小孩的玩具了。&lt;/p&gt; &lt;p&gt;里面有颜色拾取器和标尺，想想以前作网页的时候，要抄别人的页面经常得抓下图来，在PS里面取颜色和取尺寸，现在这些内置工具解决了这个问题。&lt;/p&gt; &lt;p&gt;开发者工具里面还带了JS的调试器，而且启用简单，容易使用，而且功能强大，无论是单独的JS文件也好，还是内嵌在网页里的JS块也好，一切都可以调试。&lt;/p&gt; &lt;p&gt;DOM查看器也是我所希望的那样子，虽然FF里面也有DOM查看器，不过它的显示模式让人感觉使用不方便，特别是DOM很深的时候，FF里面简直就没有办法用了。它的CSS栏里面，可以轻松地看到哪些CSS 是有效的，哪些是无效的。&lt;/p&gt; &lt;p&gt;2.已经开始面向W3C的标准了。这个偶也说不上它是一个进步还是一个倒退。不过作为易用性来说，IE8作的还是很不错的，因为它提供了兼容模式，一步操作就可以实现IE7和IE8模式的切换。这个我相信会让用户很方便的。对于用户来说，网页的标准是次要的，最重要的是他手上的浏览器能无误地打开他所需要的网站，并进行他所需要的操作。&lt;/p&gt; &lt;p&gt;差点跑题了：）&lt;/p&gt; &lt;p&gt;现在比比这两个浏览器了：&lt;/p&gt; &lt;p&gt;1.易用性：我觉得IE8要得高分，因为它能很好地兼容不同的网站，而Chrome却只能无误地打开有限的网站，而且错了也不报，让用户无所适从。&lt;/p&gt; &lt;p&gt;2.性能：不用怀疑，IE8确实要吃更多的内存，速度上来说，我并没有觉得太大的差别。&lt;/p&gt; &lt;p&gt;3.稳定性：我觉得IE8要更胜一筹，用了一两个星期了，以前打开一些老容易把浏览器卡死的网站，现在不会出现这种性况了。&lt;/p&gt; &lt;p&gt;再说说Chrome所说的一些新特性，其实在IE8里面早就是这样去实现的了：比如说每个TAB页单独的进程，隐私模式等等。基本上Chrome所说的亮点，在IE8里面早就存在了。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10129.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>Google Chrome(谷歌浏览器)试用感受</title><link>http://webuc.net/chinahuman/archive/2008/09/03/10110.aspx</link><pubDate>Wed, 03 Sep 2008 10:22:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/09/03/10110.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10110.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/09/03/10110.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10110.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10110.aspx</trackback:ping><description>&lt;p&gt;打开下载链接，发现只有四百多K ，心中在想是不是又一个基于IE内核的浏览器，不过，很快推翻了我的想法，因为旁边有一个完整版的下载，那个400K只是一个浏览器的下载器，最讨厌这种发布方式，让人白开心了一把，如果上网不方便的，下载回去装，结果发现还得接着下，那叫一个郁闷。 &lt;p&gt;安装过程太傻瓜了，一点选择权都没有，不是很爽，偶的C盘没有空间了，这样装，只好玩完以后就删了。 &lt;p&gt;用的时候，发现速度还可以，不过有时候CPU的使用还是比IE高，多TAB页关掉的时候，没有释放内存，这个和IE是一样的。发现里面有一个任务管理器，可以看到每个页面占用的CPU,内存等。 &lt;p&gt;继续用下去，发现问题来了，兼容性是一个大问题，IE和FF都能正常跑的页面，它跑不下去了，而且没有错误控制台，也不知道是哪个JS 出的错，再试一下百度的地图，结果发现用不了。再用google的地图发现可以用，难道被屏蔽了？ &lt;p&gt;最终的结论是：我一会儿就会把它删掉，再没有更好的更新前，我不会使用它。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10110.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>编程实现SqlServer扩展存储过程并实现Image类型参数的输入和结果的返回</title><link>http://webuc.net/chinahuman/archive/2008/08/30/10105.aspx</link><pubDate>Sat, 30 Aug 2008 10:08:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/08/30/10105.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10105.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/08/30/10105.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10105.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10105.aspx</trackback:ping><description>&lt;p&gt;SQLServer有一项即将要过时的功能，那就是扩展存储过程（在MSDN上查询该方面的资料的时候，上面都有一个提示说是这个功能将会在以后的SQL版本中删除，建议使用CLR集成）。虽然要过时了，但是看着现在有不少的DB还在用SQL2000说明这个功能至少还有几年有效期。对了，忘了说了扩展存储过程是干啥用的，懒得查最官方的说法了，用我的语言来说，那就是使用自己的开发语言，来实现一些数据库没有实现的功能，比如说我想在数据库里面直接作MD5的加密和解密，这个功能SQL Server本来不具有的，但是可以自己写一个扩展存储过程来实现。&lt;/p&gt; &lt;p&gt;开发扩展存储过程的开发语言还是有些要求的，就是要能实现导出函数的，如C（VC,BCB,其它的C）,Delphi等，C#由于无法实现导出函数，所以就不能开发了，不过他可以开发CLR集成。由于我只会Delphi，所以我就用它来作例子。&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;扩展存储过程的hellowolrd&lt;font color="#ffffff"&gt;（铁匠出品）&lt;/font&gt;&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;如果仅仅写一个hello wolrd，Delphi是不需要任何东西就可以实现，那就是：新建一个DLL的工程，在里面写个如下函数：&lt;/p&gt; &lt;p&gt;function xp_helloWorld: Boolean; stdcall;&lt;br&gt;begin&lt;br&gt;//在这里面可以写一个文件好看到效果，具体的代码我就不写了&lt;br&gt;end;&lt;/p&gt; &lt;p&gt;然后把它放在导出函数里面：&lt;/p&gt; &lt;p&gt;exports&lt;br&gt;xp_helloWorld;&lt;/p&gt; &lt;p&gt;再在SQLSERVER里去注册，注意注册扩展存储过程只能在Master库里实现，还要求操作者有一定的权限,SQL如下：&lt;/p&gt; &lt;p&gt;if exists &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (select * from master.dbo.sysobjects where id = object_id('xp_helloWorld')) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; execute sp_dropextendedproc 'xp_helloWorld'&lt;br&gt;go&lt;br&gt;--我编写的dll在'D:\PersonWork\SQLExtProcedure\目录下面,修改成你的编写的目录&lt;br&gt;execute sp_addextendedproc 'xp_helloWorld', 'D:\PersonWork\SQLExtProcedure\sqlExtProcedure.dll'&lt;br&gt;go &lt;p&gt;然后在写SQL exec Master.dbo.xp_helloWorld就能看到效果了。 &lt;h4&gt;&lt;strong&gt;实用的扩展存储过程&lt;font color="#ffffff"&gt;（铁匠出品）&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;但是我们开发东西不是一个helloworld就能够用的，所以我们就得引入新的东西：MsOdsApi，这个是一个我们的代码去调用sql现有功能的入口，因为Sqlserver的SDK并没有给Delphi作个版本，所以我们只好自己辛苦一下来转换他们的头文件，不过还好网上的很多前辈们已经帮我们完成了这个工作，在本文的结束时会附上该文件。我觉得会最常用的几个函数如下（具体的参数可以看定义，上面应该写得比较清楚了）： &lt;p&gt;srv_rpcparams:获取参数的个数 &lt;p&gt;srv_paraminfo：获取指定参数的信息，数据的长度，类型，数据等 &lt;p&gt;srv_paramdata：获取image一类的值的指针 &lt;p&gt;srv_describe：创造返回值的描述 &lt;p&gt;srv_setcoldata：给返回的字段赋值 &lt;p&gt;srv_sendrow：返回一行数据 &lt;p&gt;srv_senddone：表示返回已经完成了。 &lt;p&gt;于是我们开始构建新的扩展存储过程： &lt;p&gt;function xp_Test(pSrvProc: SRV_PROC): Boolean; stdcall;//这个传时来的参数pSrvProc就是相当于是和sqlserver交互的上下文的指针了&lt;br&gt;var&lt;br&gt;&amp;nbsp; PType : Byte;&lt;br&gt;&amp;nbsp; cbMaxLen , ParaLen : DWORD;&lt;br&gt;&amp;nbsp; IsNULL : BOOL;  &lt;p&gt;&amp;nbsp; fs: TFileStream;&lt;br&gt;&amp;nbsp; p: Pointer;&lt;br&gt;&amp;nbsp; n: integer;&lt;br&gt;begin&lt;br&gt;&amp;nbsp; n := srv_rpcparams(pSrvProc);//先取一下有几个参数&lt;br&gt;&amp;nbsp; srv_paraminfo(pSrvProc, 1, @PType, @cbMaxLen, @ParaLen,&amp;nbsp; nil, @IsNULL);//取第一个参数的定义，注意参数的下标是从1开始的，而不是习惯上的0&lt;br&gt;&amp;nbsp; p := srv_paramdata(pSrvProc, 1);//由于我们要取image类型的，所以得用这个取数据的指针，否则就用下面这个，注意在这之前，p要先开好内存&lt;br&gt;&amp;nbsp; //srv_paraminfo(pSrvProc, 1, @PType, @cbMaxLen, @ParaLen,&amp;nbsp; @p, @IsNULL);&lt;br&gt;&amp;nbsp; fs := TFileStream.Create('d:\test.jpg', fmCreate);//由于无法debug只好能过文件把一些中间变量写到文件里，再用winhex来看了&lt;br&gt;&amp;nbsp; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs.Write(n, SizeOf(Integer));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs.Write(cbMaxLen, SizeOf(DWORD));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs.Write(ParaLen, SizeOf(DWORD));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs.Write(p^, ParaLen)&lt;br&gt;&amp;nbsp; finally&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FreeAndNil(fs);&lt;br&gt;&amp;nbsp; end;&lt;/p&gt; &lt;p&gt;//下面开始返回一行数据&lt;br&gt;&amp;nbsp; n := ParaLen;&lt;br&gt;&amp;nbsp; srv_describe(pSrvProc, 1 ,&amp;nbsp; 'Data', SRV_NULLTERM,&amp;nbsp; SRV_TDS_IMAGE,&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n, SRVBIGVARCHAR, n,&amp;nbsp; NIL);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_setcoldata(pSrvProc, 1 , p);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_sendrow(pSrvProc);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_senddone(pSrvProc, (SRV_DONE_COUNT or SRV_DONE_MORE), 0, 1);&lt;br&gt;end;&lt;/p&gt; &lt;p&gt;还是按hellowolrd的方法把它注册到SQLServer里面去。不过由于Image类型的字段不能在存储过程里设置临时变量，所以我们还有再麻烦一下：&lt;/p&gt; &lt;p&gt;Create PROCEDURE [dbo].[UXP_Test]&lt;br&gt;@in1 Image&lt;br&gt;AS&lt;br&gt;BEGIN&lt;br&gt; Insert into Test1(Data) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exec Master.dbo.xp_Test @in1&lt;br&gt;END&lt;br&gt;GO &lt;p&gt;这样来把我们处理过后的Image类型的字段插入到DB里面去。 &lt;p&gt;最后来看看那个Test.jpg的内容： &lt;p&gt;&lt;a href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_SqlServerImage_FEF7_image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="32" alt="image" src="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_SqlServerImage_FEF7_image_thumb.png" width="244" border="0"&gt;&lt;/a&gt;  &lt;p&gt;Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp; 1&amp;nbsp; 2&amp;nbsp; 3&amp;nbsp; 4&amp;nbsp; 5&amp;nbsp; 6&amp;nbsp; 7&amp;nbsp;&amp;nbsp; 8&amp;nbsp; 9&amp;nbsp; A&amp;nbsp; B&amp;nbsp; C&amp;nbsp; D&amp;nbsp; E&amp;nbsp; F  &lt;p&gt;00000000&amp;nbsp;&amp;nbsp; 01 00 00 00 10 00 00 00&amp;nbsp; 72 03 00 00 47 49 46 38&amp;nbsp;&amp;nbsp; ........r...GIF8&lt;br&gt;00000010&amp;nbsp;&amp;nbsp; 39 61 A0 00 58 00 A2 00&amp;nbsp; 00 63 9C 9C FF 63 00 00&amp;nbsp;&amp;nbsp; 9a?X.?.c湝c..&lt;br&gt;00000020&amp;nbsp;&amp;nbsp; 9C 00 00 63 FF CE 31 31&amp;nbsp; FE 01 02 00 00 00 00 00&amp;nbsp;&amp;nbsp; ?.c?1?......&lt;br&gt;00000030&amp;nbsp;&amp;nbsp; 00 21 FF 0B 4E 45 54 53&amp;nbsp; 43 41 50 45 32 2E 30 03&amp;nbsp;&amp;nbsp; .!.NETSCAPE2.0. &lt;p&gt;点它一下看大图，就可以看到前四位是1，也就是传入了1个参数，接下来4位值是16（从这里也可以看出来那些image类型 的定义果真是16位这么长），再接下来4位这才是数据的真正长度，我是插入了一个GIF动画，所以它的长度和文件的长度是一样的：882，再后面就是文件的开始了GIF89a一个标准的GIF文件头 &lt;p&gt;看看这些数据插入到DB里是不是正确的呢？来看下图： &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_SqlServerImage_FEF7_image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="43" alt="image" src="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_SqlServerImage_FEF7_image_thumb_1.png" width="244" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;0x开头，说明它是以16进制数显示的，看开头的几位：474946383961和上面的16进制数对比一下可以看到，这里面的数据是正确的，也就是说我们的Image传入处理后，再返回来这一切都是成功的。&lt;/p&gt; &lt;p&gt;最后贴一下：MsOdsApi.pas(从下一行开始复制)&lt;/p&gt; &lt;p&gt;unit MsOdsApi;  &lt;p&gt;//------------------------------------------------------------&lt;br&gt;// Open Data Services header file: srv.h&lt;br&gt;// Copyright (c) 1989, 1990, 1991, 1997 by Microsoft Corp.&lt;br&gt;//  &lt;p&gt;// Avoid double inclusion&lt;br&gt;//#ifndef _ODS_SRV_H_&lt;br&gt;//&amp;nbsp; _ODS_SRV_H_  &lt;p&gt;//#include "windows.h"  &lt;p&gt;// ODS uses pack(4) on all CPU types&lt;br&gt;//#pragma pack(4)  &lt;p&gt;//#ifdef __cplusplus&lt;br&gt;//extern "C" {&lt;br&gt;//#endif  &lt;p&gt;// define model&lt;br&gt;//#if !defined( FAR )&lt;br&gt;//&amp;nbsp; FAR far&lt;br&gt;//#endif  &lt;p&gt;//------------------------------------------------------------&lt;br&gt;// Formats of data types&lt;br&gt;//#if !defined(DBTYPEDEFS) // Do not conflict with DBLIB definitions&lt;br&gt;//#if !defined(MAXNUMERICLEN) // Do not conflict with ODBC definitions  &lt;p&gt;//&amp;nbsp; DBTYPEDEFS  &lt;p&gt;interface  &lt;p&gt;uses&lt;br&gt;&amp;nbsp; Windows;  &lt;p&gt;type&lt;br&gt;&amp;nbsp; DBBOOL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Byte;&lt;br&gt;&amp;nbsp; DBBYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Byte;&lt;br&gt;&amp;nbsp; DBTINYINT&amp;nbsp;&amp;nbsp; = Byte;&lt;br&gt;&amp;nbsp; DBSMALLINT&amp;nbsp; = Smallint;&lt;br&gt;&amp;nbsp; DBUSMALLINT = Word;&lt;br&gt;&amp;nbsp; DBINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Longint;&lt;br&gt;&amp;nbsp; DBCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Char;&lt;br&gt;&amp;nbsp; PDBCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ^DBCHAR;&lt;br&gt;&amp;nbsp; DBBINARY&amp;nbsp;&amp;nbsp;&amp;nbsp; = Byte;&lt;br&gt;&amp;nbsp; DBBIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Byte;&lt;br&gt;&amp;nbsp; DBFLT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = Double;  &lt;p&gt;&amp;nbsp; srv_datetime = record&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Format for SRVDATETIME&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dtdays: Longint;&amp;nbsp; // number of days since 1/1/1900&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dttime: Longword; // number 300th second since mid&lt;br&gt;&amp;nbsp; end;&lt;br&gt;&amp;nbsp; DBDATETIME = srv_datetime;  &lt;p&gt;&amp;nbsp; srv_dbdatetime4 = record&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Format for SRVDATETIM4&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; numdays: Word; // number of days since 1/1/1900&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nummins: Word; // number of minutes sicne midnight&lt;br&gt;&amp;nbsp; end;&lt;br&gt;&amp;nbsp; DBDATETIM4 = srv_dbdatetime4;  &lt;p&gt;&amp;nbsp; srv_money = record&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Format for SRVMONEY&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mnyhigh: Longint;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mnylow : Longword;&lt;br&gt;&amp;nbsp; end;&lt;br&gt;&amp;nbsp; DBMONEY = srv_money;  &lt;p&gt;&amp;nbsp; DBFLT4&amp;nbsp;&amp;nbsp; = Double;&lt;br&gt;&amp;nbsp; DBMONEY4 = Longint;  &lt;p&gt;const&lt;br&gt;&amp;nbsp; MAXNUMERICDIG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 38;&lt;br&gt;&amp;nbsp; DEFAULTPRECISION&amp;nbsp; = 19; // 18&lt;br&gt;&amp;nbsp; DEFAULTSCALE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&lt;br&gt;&amp;nbsp; MAXNUMERICLEN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 16;  &lt;p&gt;type&lt;br&gt;&amp;nbsp; srv_dbnumeric = packed record&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Format for SRVNUMERIC,SRVNUMERICN,SRVDECIMAL,SRVDECIMALN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; precision: Byte;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; scale&amp;nbsp;&amp;nbsp;&amp;nbsp; : Byte;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sign&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Byte;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1 = Positive, 0 = Negative&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; val&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : array [0..MAXNUMERICLEN-1] of Byte; // Padded little-endian value&lt;br&gt;&amp;nbsp; end;&lt;br&gt;&amp;nbsp; DBNUMERIC = srv_dbnumeric;&lt;br&gt;&amp;nbsp; DBDECIMAL = DBNUMERIC;  &lt;p&gt;//#endif&amp;nbsp; // #if !defined(MAXNUMERICLEN)&lt;br&gt;//#endif&amp;nbsp; // #if !defined( DBTYPEDEFS )  &lt;p&gt;//------------------------------------------------------------&lt;br&gt;// Constants used by APIs  &lt;p&gt;// Type Tokens&lt;br&gt;const&lt;br&gt;&amp;nbsp; SRV_TDS_NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $1f;&lt;br&gt;&amp;nbsp; SRV_TDS_TEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $23;&lt;br&gt;&amp;nbsp; SRV_TDS_GUID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $24;&lt;br&gt;&amp;nbsp; SRV_TDS_VARBINARY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $25;&lt;br&gt;&amp;nbsp; SRV_TDS_INTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $26;&lt;br&gt;&amp;nbsp; SRV_TDS_VARCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $27;&lt;br&gt;&amp;nbsp; SRV_TDS_BINARY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $2d;&lt;br&gt;&amp;nbsp; SRV_TDS_IMAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $22;&lt;br&gt;&amp;nbsp; SRV_TDS_CHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $2f;&lt;br&gt;&amp;nbsp; SRV_TDS_INT1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $30;&lt;br&gt;&amp;nbsp; SRV_TDS_BIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $32;&lt;br&gt;&amp;nbsp; SRV_TDS_INT2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $34;&lt;br&gt;&amp;nbsp; SRV_TDS_DECIMAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $37;&lt;br&gt;&amp;nbsp; SRV_TDS_INT4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $38;&lt;br&gt;&amp;nbsp; SRV_TDS_DATETIM4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $3a;&lt;br&gt;&amp;nbsp; SRV_TDS_FLT4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $3b;&lt;br&gt;&amp;nbsp; SRV_TDS_MONEY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $3c;&lt;br&gt;&amp;nbsp; SRV_TDS_DATETIME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $3d;&lt;br&gt;&amp;nbsp; SRV_TDS_FLT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $3e;&lt;br&gt;&amp;nbsp; SRV_TDS_NUMERIC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $3f;&lt;br&gt;&amp;nbsp; SRV_TDS_NTEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $63;&lt;br&gt;&amp;nbsp; SRV_TDS_BITN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $68;&lt;br&gt;&amp;nbsp; SRV_TDS_DECIMALN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $6a;&lt;br&gt;&amp;nbsp; SRV_TDS_NUMERICN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $6c;&lt;br&gt;&amp;nbsp; SRV_TDS_FLTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $6d;&lt;br&gt;&amp;nbsp; SRV_TDS_MONEYN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $6e;&lt;br&gt;&amp;nbsp; SRV_TDS_DATETIMN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $6f;&lt;br&gt;&amp;nbsp; SRV_TDS_MONEY4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $7a;&lt;br&gt;&amp;nbsp; SRV_TDS_INT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $7f;&amp;nbsp; // SQL 2000 and later&lt;br&gt;&amp;nbsp; SRV_TDS_BIGVARBINARY&amp;nbsp;&amp;nbsp; = $A5;&lt;br&gt;&amp;nbsp; SRV_TDS_BIGVARCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $A7;&lt;br&gt;&amp;nbsp; SRV_TDS_BIGBINARY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $AD;&lt;br&gt;&amp;nbsp; SRV_TDS_BIGCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $AF;&lt;br&gt;&amp;nbsp; SRV_TDS_NVARCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $e7;&lt;br&gt;&amp;nbsp; SRV_TDS_NCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $ef;  &lt;p&gt;// Datatypes&lt;br&gt;// Also: values of symbol parameter to srv_symbol when type = SRV_DATATYPE&lt;br&gt;&amp;nbsp; SRVNULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_NULL;&lt;br&gt;&amp;nbsp; SRVTEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_TEXT;&lt;br&gt;&amp;nbsp; SRVGUID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_GUID;&lt;br&gt;&amp;nbsp; SRVVARBINARY&amp;nbsp;&amp;nbsp; = SRV_TDS_VARBINARY;&lt;br&gt;&amp;nbsp; SRVINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_INTN;&lt;br&gt;&amp;nbsp; SRVVARCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_VARCHAR;&lt;br&gt;&amp;nbsp; SRVBINARY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_BINARY;&lt;br&gt;&amp;nbsp; SRVIMAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_IMAGE;&lt;br&gt;&amp;nbsp; SRVCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_CHAR;&lt;br&gt;&amp;nbsp; SRVINT1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_INT1;&lt;br&gt;&amp;nbsp; SRVBIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_BIT;&lt;br&gt;&amp;nbsp; SRVINT2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_INT2;&lt;br&gt;&amp;nbsp; SRVDECIMAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_DECIMAL;&lt;br&gt;&amp;nbsp; SRVINT4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_INT4;&lt;br&gt;&amp;nbsp; SRVDATETIM4&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_DATETIM4;&lt;br&gt;&amp;nbsp; SRVFLT4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_FLT4;&lt;br&gt;&amp;nbsp; SRVMONEY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_MONEY;&lt;br&gt;&amp;nbsp; SRVDATETIME&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_DATETIME;&lt;br&gt;&amp;nbsp; SRVFLT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_FLT8;&lt;br&gt;&amp;nbsp; SRVNUMERIC&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_NUMERIC;&lt;br&gt;&amp;nbsp; SRVNTEXT&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_NTEXT;&lt;br&gt;&amp;nbsp; SRVBITN&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_BITN;&lt;br&gt;&amp;nbsp; SRVDECIMALN&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_DECIMALN;&lt;br&gt;&amp;nbsp; SRVNUMERICN&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_NUMERICN;&lt;br&gt;&amp;nbsp; SRVFLTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_FLTN;&lt;br&gt;&amp;nbsp; SRVMONEYN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_MONEYN;&lt;br&gt;&amp;nbsp; SRVDATETIMN&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_DATETIMN;&lt;br&gt;&amp;nbsp; SRVMONEY4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_MONEY4;&lt;br&gt;&amp;nbsp; SRVINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_INT8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SQL 2000 and later&lt;br&gt;&amp;nbsp; SRVBIGVARBINARY = SRV_TDS_BIGVARBINARY;&lt;br&gt;&amp;nbsp; SRVBIGVARCHAR&amp;nbsp; = SRV_TDS_BIGVARCHAR;&lt;br&gt;&amp;nbsp; SRVBIGBINARY&amp;nbsp;&amp;nbsp; = SRV_TDS_BIGBINARY;&lt;br&gt;&amp;nbsp; SRVBIGCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_BIGCHAR;&lt;br&gt;&amp;nbsp; SRVNVARCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_NVARCHAR;&lt;br&gt;&amp;nbsp; SRVNCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp; = SRV_TDS_NCHAR;  &lt;p&gt;// values for srv_symbol type parameter&lt;br&gt; SRV_ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&lt;br&gt; SRV_DONE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 1;&lt;br&gt; SRV_DATATYPE&amp;nbsp; = 2;&lt;br&gt; SRV_EVENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4;  &lt;p&gt;// values for srv_symbol symbol parameter, when type = SRV_ERROR&lt;br&gt;&amp;nbsp; SRV_ENO_OS_ERR&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&lt;br&gt;&amp;nbsp; SRV_INFO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 1;&lt;br&gt;&amp;nbsp; SRV_FATAL_PROCESS = 10;&lt;br&gt;&amp;nbsp; SRV_FATAL_SERVER&amp;nbsp; = 19;  &lt;p&gt;// Types of server events&lt;br&gt;// Also: values for srv_symbol symbol parameter, when type = SRV_EVENT&lt;br&gt;&amp;nbsp; SRV_CONTINUE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&lt;br&gt;&amp;nbsp; SRV_LANGUAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 1;&lt;br&gt;&amp;nbsp; SRV_CONNECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2;&lt;br&gt;&amp;nbsp; SRV_RPC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 3;&lt;br&gt;&amp;nbsp; SRV_RESTART&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4;&lt;br&gt;&amp;nbsp; SRV_DISCONNECT&amp;nbsp;&amp;nbsp;&amp;nbsp; = 5;&lt;br&gt;&amp;nbsp; SRV_ATTENTION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 6;&lt;br&gt;&amp;nbsp; SRV_SLEEP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 7;&lt;br&gt;&amp;nbsp; SRV_START&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 8;&lt;br&gt;&amp;nbsp; SRV_STOP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 9;&lt;br&gt;&amp;nbsp; SRV_EXIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 10;&lt;br&gt;&amp;nbsp; SRV_CANCEL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 11;&lt;br&gt;&amp;nbsp; SRV_SETUP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 12;&lt;br&gt;&amp;nbsp; SRV_CLOSE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 13;&lt;br&gt;&amp;nbsp; SRV_PRACK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 14;&lt;br&gt;&amp;nbsp; SRV_PRERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 15;&lt;br&gt;&amp;nbsp; SRV_ATTENTION_ACK = 16;&lt;br&gt;&amp;nbsp; SRV_CONNECT_V7&amp;nbsp;&amp;nbsp;&amp;nbsp; = 16; // TDS type for TDS 7 clients.&amp;nbsp; Overloaded with SRV_ATTENTION_ACK&lt;br&gt;&amp;nbsp; SRV_SKIP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 17;&lt;br&gt;&amp;nbsp; SRV_TRANSMGR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 18;&lt;br&gt;&amp;nbsp; SRV_OLEDB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 20;&lt;br&gt;&amp;nbsp; SRV_INTERNAL_HANDLER&amp;nbsp;&amp;nbsp;&amp;nbsp; = 99;&lt;br&gt;&amp;nbsp; SRV_PROGRAMMER_DEFINED&amp;nbsp; = 100;  &lt;p&gt;// values for srv_config option parameter&lt;br&gt;&amp;nbsp; SRV_CONNECTIONS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 1;&lt;br&gt;&amp;nbsp; SRV_LOGFILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2;&lt;br&gt;&amp;nbsp; SRV_STACKSIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 3;&lt;br&gt;&amp;nbsp; SRV_REMOTE_ACCESS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 7;&lt;br&gt;&amp;nbsp; SRV_REMOTE_CONNECTIONS = 9;&lt;br&gt;&amp;nbsp; SRV_MAX_PACKETS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 10;&lt;br&gt;&amp;nbsp; SRV_MAXWORKINGTHREADS&amp;nbsp; = 11;&lt;br&gt;&amp;nbsp; SRV_MINWORKINGTHREADS&amp;nbsp; = 12;&lt;br&gt;&amp;nbsp; SRV_THREADTIMEOUT&amp;nbsp;&amp;nbsp;&amp;nbsp; = 13;&lt;br&gt;&amp;nbsp; SRV_MAX_PACKETSIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; = 17;&lt;br&gt;&amp;nbsp; SRV_THREADPRIORITY&amp;nbsp;&amp;nbsp;&amp;nbsp; = 18;&lt;br&gt;&amp;nbsp; SRV_ANSI_CODEPAGE&amp;nbsp;&amp;nbsp;&amp;nbsp; = 19;&lt;br&gt;&amp;nbsp; SRV_DEFAULT_PACKETSIZE = 26;&lt;br&gt;&amp;nbsp; SRV_PASSTHROUGH&amp;nbsp;&amp;nbsp;&amp;nbsp; = 27;  &lt;p&gt;// vlaues for srv_config value parameter when option = SRV_THREADPRIORITY&lt;br&gt;&amp;nbsp; SRV_PRIORITY_LOW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = THREAD_PRIORITY_LOWEST;&lt;br&gt;&amp;nbsp; SRV_PRIORITY_NORMAL&amp;nbsp;&amp;nbsp; = THREAD_PRIORITY_NORMAL;&lt;br&gt;&amp;nbsp; SRV_PRIORITY_HIGH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = THREAD_PRIORITY_HIGHEST;&lt;br&gt;&amp;nbsp; SRV_PRIORITY_CRITICAL = THREAD_PRIORITY_TIME_CRITICAL;  &lt;p&gt;// values for srv_sfield field parameter&lt;br&gt;&amp;nbsp; SRV_SERVERNAME = 0;&lt;br&gt;&amp;nbsp; SRV_VERSION&amp;nbsp;&amp;nbsp;&amp;nbsp; = 6;  &lt;p&gt;// Length to indicate string is null terminated&lt;br&gt;&amp;nbsp; SRV_NULLTERM&amp;nbsp;&amp;nbsp; = -1;  &lt;p&gt;// values of msgtype parameter to srv_sendmsg&lt;br&gt;&amp;nbsp; SRV_MSG_INFO&amp;nbsp;&amp;nbsp; = 1;&lt;br&gt;&amp;nbsp; SRV_MSG_ERROR&amp;nbsp; = 2;  &lt;p&gt;// values of status parameter to srv_senddone&lt;br&gt;// Also: values for symbol parameters to srv_symbol when type = SRV_DONE&lt;br&gt;&amp;nbsp; SRV_DONE_FINAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0000;&lt;br&gt;&amp;nbsp; SRV_DONE_MORE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0001;&lt;br&gt;&amp;nbsp; SRV_DONE_ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0002;&lt;br&gt;&amp;nbsp; SRV_DONE_COUNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0010;&lt;br&gt;&amp;nbsp; SRV_DONE_RPC_IN_BATCH&amp;nbsp;&amp;nbsp; = $0080;  &lt;p&gt;// return values of srv_paramstatus&lt;br&gt;&amp;nbsp; SRV_PARAMRETURN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0001;&lt;br&gt;&amp;nbsp; SRV_PARAMDEFAULT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0002;  &lt;p&gt;// return values of srv_rpcoptions&lt;br&gt;&amp;nbsp; SRV_RECOMPILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0001;&lt;br&gt;&amp;nbsp; SRV_NOMETADATA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $0002;  &lt;p&gt;// values of field parameter to srv_pfield&lt;br&gt;//&amp;nbsp; SRV_LANGUAGE 1&amp;nbsp;&amp;nbsp; already defined above&lt;br&gt;//&amp;nbsp; SRV_EVENT&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp; already defined above&lt;br&gt;&amp;nbsp; SRV_SPID&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; = 10;&lt;br&gt;&amp;nbsp; SRV_NETSPID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 11;&lt;br&gt;&amp;nbsp; SRV_TYPE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 12;&lt;br&gt;&amp;nbsp; SRV_STATUS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 13;&lt;br&gt;&amp;nbsp; SRV_RMTSERVER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 14;&lt;br&gt;&amp;nbsp; SRV_HOST&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 15;&lt;br&gt;&amp;nbsp; SRV_USER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 16;&lt;br&gt;&amp;nbsp; SRV_PWD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 17;&lt;br&gt;&amp;nbsp; SRV_CPID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 18;&lt;br&gt;&amp;nbsp; SRV_APPLNAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 19;&lt;br&gt;&amp;nbsp; SRV_TDS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 20;&lt;br&gt;&amp;nbsp; SRV_CLIB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 21;&lt;br&gt;&amp;nbsp; SRV_LIBVERS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 22;&lt;br&gt;&amp;nbsp; SRV_ROWSENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 23;&lt;br&gt;&amp;nbsp; SRV_BCPFLAG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 24;&lt;br&gt;&amp;nbsp; SRV_NATLANG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 25;&lt;br&gt;&amp;nbsp; SRV_PIPEHANDLE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 26;&lt;br&gt;&amp;nbsp; SRV_NETWORK_MODULE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 27;&lt;br&gt;&amp;nbsp; SRV_NETWORK_VERSION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 28;&lt;br&gt;&amp;nbsp; SRV_NETWORK_CONNECTION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 29;&lt;br&gt;&amp;nbsp; SRV_LSECURE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 30;&lt;br&gt;&amp;nbsp; SRV_SAXP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 31;&lt;br&gt;&amp;nbsp; SRV_UNICODE_USER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 33;&lt;br&gt;&amp;nbsp; SRV_UNICODE_PWD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 35;&lt;br&gt;&amp;nbsp; SRV_SPROC_CODEPAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 36;  &lt;p&gt;// return value of SRV_TDSVERSION macro&lt;br&gt;&amp;nbsp; SRV_TDS_NONE&amp;nbsp; = 0;&lt;br&gt;&amp;nbsp; SRV_TDS_2_0&amp;nbsp;&amp;nbsp; = 1;&lt;br&gt;&amp;nbsp; SRV_TDS_3_4&amp;nbsp;&amp;nbsp; = 2;&lt;br&gt;&amp;nbsp; SRV_TDS_4_2&amp;nbsp;&amp;nbsp; = 3;&lt;br&gt;&amp;nbsp; SRV_TDS_6_0&amp;nbsp;&amp;nbsp; = 4;&lt;br&gt;&amp;nbsp; SRV_TDS_7_0&amp;nbsp;&amp;nbsp; = 5;  &lt;p&gt;// Return values from APIs&lt;br&gt;type&lt;br&gt; SRVRETCODE = Integer;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SUCCEED or FAIL&lt;br&gt; RETCODE&amp;nbsp;&amp;nbsp;&amp;nbsp; = Integer;  &lt;p&gt;const&lt;br&gt;&amp;nbsp; SUCCEED = 1;&amp;nbsp;&amp;nbsp; // Successful return value&lt;br&gt;&amp;nbsp; FAIL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp; // Unsuccessful return value  &lt;p&gt;&amp;nbsp; SRV_DUPLICATE_HANDLER&amp;nbsp;&amp;nbsp; = 2;&amp;nbsp;&amp;nbsp; // additional return value for srv_pre/post_handle  &lt;p&gt;//------------------------------------------------&lt;br&gt;//PreDeclare structures&lt;br&gt;//&lt;br&gt;{struct srv_server;&lt;br&gt;typedef struct srv_server SRV_SERVER;  &lt;p&gt;struct srv_config;&lt;br&gt;typedef struct srv_config SRV_CONFIG;  &lt;p&gt;struct srv_proc;&lt;br&gt;typedef struct srv_proc SRV_PROC;}&lt;br&gt;type&lt;br&gt;&amp;nbsp; SRV_SERVER = Pointer;&lt;br&gt;&amp;nbsp; SRV_CONFIG = Pointer;&lt;br&gt;&amp;nbsp; SRV_PROC&amp;nbsp;&amp;nbsp; = Pointer;  &lt;p&gt;//------------------------------------------------&lt;br&gt;//------------------------------------------------&lt;br&gt;// ODS MACROs &amp;amp; APIs  &lt;p&gt;// Describing and sending a result set&lt;br&gt;function srv_describe(srvproc: SRV_PROC;&lt;br&gt;&amp;nbsp; colnumber: Integer; column_name: PCHAR; namelen: Integer;&lt;br&gt;&amp;nbsp; desttype, destlen, srctype, srclen: Integer; srcData: Pointer&lt;br&gt;): Integer; cdecl;  &lt;p&gt;function srv_setutype(srvproc: SRV_PROC; column: Integer; usertype: Longint): Integer; cdecl;&lt;br&gt;function srv_setcoldata(srvproc: SRV_PROC; column: Integer; data: Pointer): Integer; cdecl;&lt;br&gt;function srv_setcollen(srvproc: SRV_PROC; column, len: Integer): Integer; cdecl;&lt;br&gt;function srv_sendrow(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_senddone(srvproc: SRV_PROC; status, curcmd: Word; count: Longint): Integer; cdecl;  &lt;p&gt;// Dealing with Extended Procedure parameters&lt;br&gt;function srv_rpcparams(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_paraminfo(srvproc: SRV_PROC; n: Integer; pbType: PByte; &lt;br&gt;&amp;nbsp; pcbMaxLen, pcbActualLen: PULONG; pbData: PByte; pfNull: PBOOL): Integer; cdecl;&lt;br&gt;function srv_paramsetoutput(srvproc: SRV_PROC;&lt;br&gt;&amp;nbsp; n: Integer; pbData: PByte; cbLen: ULONG; fNull: BOOL): Integer; cdecl;  &lt;p&gt;function srv_paramdata(srvproc: SRV_PROC; n: Integer): Pointer; cdecl;&lt;br&gt;function srv_paramlen(srvproc: SRV_PROC; n: Integer): Integer; cdecl;&lt;br&gt;function srv_parammaxlen(srvproc: SRV_PROC; n: Integer): Integer; cdecl;&lt;br&gt;function srv_paramtype(srvproc: SRV_PROC; n: Integer): Integer; cdecl;&lt;br&gt;function srv_paramset(srvproc: SRV_PROC; n: Integer; data: Pointer; int: Integer): Integer; cdecl;  &lt;p&gt;function srv_paramname(srvproc: SRV_PROC; n: Integer; var len: Integer): PChar; cdecl;&lt;br&gt;function srv_paramnumber(srvproc: SRV_PROC; name: PChar; namelen: Integer): Integer; cdecl;  &lt;p&gt;//--------------------------------------------------------------&lt;br&gt;//--------------------------------------------------------------&lt;br&gt;// The rest of these APIs are still supported, in SQL Server 7.0,&lt;br&gt;// but may not be supported after SQL Server 7.0  &lt;p&gt;// MACROs&lt;br&gt;{&amp;nbsp; SRV_GETCONFIG(a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_getconfig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( a )&lt;br&gt;&amp;nbsp; SRV_GETSERVER(a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_getserver&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( a )&lt;br&gt;&amp;nbsp; SRV_GOT_ATTENTION(a)&amp;nbsp;&amp;nbsp; srv_got_attention ( a )&lt;br&gt;SRV_EVENTDATA(a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_eventdata&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( a )&lt;br&gt;SRV_IODEAD(a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_iodead&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( a )&lt;br&gt;SRV_TDSVERSION(a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srv_tdsversion&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( a )}  &lt;p&gt;function srv_getconfig(server: SRV_SERVER): SRV_CONFIG; cdecl;&lt;br&gt;function srv_getserver(srvproc: SRV_PROC): SRV_SERVER; cdecl;&lt;br&gt;function srv_got_attention(srvproc: SRV_PROC): Bool; cdecl;&lt;br&gt;function srv_eventdata(srvproc: SRV_PROC): Pointer; cdecl;  &lt;p&gt;// Memory&lt;br&gt;function srv_alloc(ulSize: Longint): Pointer; cdecl;&lt;br&gt;function srv_bmove(from: Pointer; pto: Pointer; count: Longint): Integer; cdecl;&lt;br&gt;function srv_bzero(location: Pointer; count: Longint): Integer; cdecl;&lt;br&gt;function srv_free(ptr: Pointer): Integer; cdecl;  &lt;p&gt;function srv_config_fn(config: SRV_CONFIG; option: Longint; value: PChar; valuelen: Integer): Integer; cdecl;&lt;br&gt;function srv_config_alloc: SRV_CONFIG; cdecl;&lt;br&gt;function srv_convert(srvproc: SRV_PROC; srctype: Integer; src: Pointer; srclen: DBINT;&lt;br&gt;&amp;nbsp; desttype: Integer; dest: Pointer; destlen: DBINT): Integer; cdecl;&lt;br&gt;{&lt;br&gt;int (*&amp;nbsp; srv_errhandle(int (* handler)(SRV_SERVER * server,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SRV_PROC&amp;nbsp;&amp;nbsp; * srvproc,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srverror,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; severity,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oserrnum,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * errtext,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errtextlen,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * oserrtext,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oserrtextlen)))&lt;br&gt;&amp;nbsp;&amp;nbsp; ( SRV_SERVER * server,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SRV_PROC&amp;nbsp;&amp;nbsp; * srvproc,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srverror,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; severity,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oserrnum,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * errtext,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errtextlen,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * oserrtext,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oserrtextlen );&lt;br&gt;}&lt;br&gt;function srv_event_fn(srvproc: SRV_PROC; event: Integer; data: PByte): Integer; cdecl;&lt;br&gt;function srv_getuserdata(srvproc: SRV_PROC): Pointer; cdecl;&lt;br&gt;function srv_getbindtoken(srvproc: SRV_PROC; token_buf: PChar): Integer; cdecl;&lt;br&gt;function srv_getdtcxact(srvproc: SRV_PROC; ppv: Pointer): Integer; cdecl;  &lt;p&gt;//typedef int (* EventHandler)(void*);&lt;br&gt;type&lt;br&gt;&amp;nbsp; EventHandler = Pointer;&lt;br&gt;function srv_handle(server: SRV_SERVER; int: Longint; handler: EventHandler): EventHandler; cdecl;  &lt;p&gt;function srv_impersonate_client(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_init(config: SRV_CONFIG; connectname: PChar; namelen: Integer): SRV_SERVER; cdecl;&lt;br&gt;function srv_iodead(srvproc: SRV_PROC): Bool; cdecl;  &lt;p&gt;function srv_langcpy(srvproc: SRV_PROC; start, nbytes: Longint; buffer: PChar): Longint; cdecl;&lt;br&gt;function srv_langlen(srvproc: SRV_PROC): Longint; cdecl;&lt;br&gt;function srv_langptr(srvproc: SRV_PROC): Pointer; cdecl;  &lt;p&gt;function srv_log(server: SRV_SERVER; datestamp: Bool; msg: PChar; msglen: Integer): Integer; cdecl;&lt;br&gt;function srv_paramstatus(srvproc: SRV_PROC; n: Integer): Integer; cdecl;&lt;br&gt;function srv_pfield(srvproc: SRV_PROC; field: Integer; len: PInteger): PChar; cdecl;  &lt;p&gt;function srv_returnval(srvproc: SRV_PROC; value_name: PDBCHAR; len: Integer; status: Byte;&lt;br&gt;&amp;nbsp; iType, maxlen, datalen: DBINT; value: PByte): Integer; cdecl;  &lt;p&gt;function srv_revert_to_self(srvproc: SRV_PROC): Integer; cdecl;  &lt;p&gt;function srv_rpcdb(srvproc: SRV_PROC; len: PInteger): PChar; cdecl;&lt;br&gt;function srv_rpcname(srvproc: SRV_PROC; len: PInteger): PChar; cdecl;&lt;br&gt;function srv_rpcnumber(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_rpcoptions(srvproc: SRV_PROC): Word; cdecl;&lt;br&gt;function srv_rpcowner(srvproc: SRV_PROC; len: PInteger): PChar; cdecl;  &lt;p&gt;function srv_run(server: SRV_SERVER): Integer; cdecl;  &lt;p&gt;function srv_sendmsg(srvproc: SRV_PROC;&lt;br&gt;&amp;nbsp; msgtype: Integer; msgnum: DBINT; msgClass, state: DBTINYINT;&lt;br&gt;&amp;nbsp; rpcname: PChar; rpcnamelen: Integer;&lt;br&gt;&amp;nbsp; linenum: Word; msg: PChar; msglen: Integer): Integer; cdecl;  &lt;p&gt;function srv_ansi_sendmsg(srvproc: SRV_PROC;&lt;br&gt;&amp;nbsp; msgtype: Integer; msgnum: DBINT; msgClass, state: DBTINYINT;&lt;br&gt;&amp;nbsp; rpcname: PChar; rpcnamelen: Integer;&lt;br&gt;&amp;nbsp; linenum: Word; msg: PChar; msglen: Integer): Integer; cdecl;  &lt;p&gt;function srv_sendstatus(srvproc: SRV_PROC; status: Longint): Integer; cdecl;&lt;br&gt;function srv_setuserdata(srvproc: SRV_PROC; ptr: Pointer): Integer; cdecl;&lt;br&gt;function srv_sfield(server: SRV_SERVER; field: Integer; len: PInteger): PChar; cdecl;&lt;br&gt;function srv_symbol(iType, symbol: Integer; len: PInteger): PChar; cdecl;&lt;br&gt;function srv_tdsversion(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_writebuf(srvproc: SRV_PROC; ptr: Pointer; count: Word): Integer; cdecl;&lt;br&gt;function srv_willconvert(srctype, desttype: Integer): Bool; cdecl;&lt;br&gt;procedure srv_ackattention(srvproc: SRV_PROC); cdecl;&lt;br&gt;function srv_terminatethread(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_sendstatistics(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_clearstatistics(srvproc: SRV_PROC): Integer; cdecl;&lt;br&gt;function srv_setevent(server: SRV_SERVER; event: Integer): Integer; cdecl;&lt;br&gt;function srv_message_handler(srvproc: SRV_PROC;&lt;br&gt;&amp;nbsp; errornum: Integer; severity, state: Byte; oserrnum: Integer; errtext: PChar;&lt;br&gt;&amp;nbsp; errtextlen: Integer; oserrtext: PChar; oserrtextlen: Integer): Integer; cdecl;  &lt;p&gt;function srv_pre_handle(server: SRV_SERVER; srvproc: SRV_PROC;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; event: Longint; handler: EventHandler;&amp;nbsp; remove: Bool): Integer; cdecl;&lt;br&gt;function srv_post_handle(server: SRV_SERVER; srvproc: SRV_PROC;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; event: Longint; handler: EventHandler;&amp;nbsp; remove: Bool): Integer; cdecl;  &lt;p&gt;function srv_post_completion_queue(srvproc: SRV_PROC; inbuf: PChar; inbuflen: PChar): Integer; cdecl;&lt;br&gt;function srv_IgnoreAnsiToOem(srvproc: SRV_PROC; bTF: BOOL): Integer; cdecl;  &lt;p&gt;//#ifdef __cplusplus&lt;br&gt;//}&lt;br&gt;//#endif  &lt;p&gt;//#pragma pack()  &lt;p&gt;const&lt;br&gt;&amp;nbsp; SS_MAJOR_VERSION&amp;nbsp;&amp;nbsp; = 7;&lt;br&gt;&amp;nbsp; SS_MINOR_VERSION&amp;nbsp;&amp;nbsp; = 00;&lt;br&gt;&amp;nbsp; SS_LEVEL_VERSION&amp;nbsp;&amp;nbsp; = 0000;&lt;br&gt;&amp;nbsp; SS_MINIMUM_VERSION = '7.00.00.0000';&lt;br&gt;&amp;nbsp; ODS_VERSION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ((SS_MAJOR_VERSION shl 24) or (SS_MINOR_VERSION shl 16));  &lt;p&gt;//#endif //_ODS_SRV_H_  &lt;p&gt;//////////////////////////////////////////////////////////////////&lt;br&gt;// Suggested implementation of __GetXpVersion&lt;br&gt;//&lt;br&gt;//__declspec(dllexport) ULONG __GetXpVersion()&lt;br&gt;//&amp;nbsp;&amp;nbsp; {&lt;br&gt;//&amp;nbsp;&amp;nbsp; return ODS_VERSION;&lt;br&gt;//&amp;nbsp;&amp;nbsp; }&lt;br&gt;//////////////////////////////////////////////////////////////////  &lt;p&gt;implementation  &lt;p&gt;const&lt;br&gt;&amp;nbsp; sLibName = 'Opends60.DLL';  &lt;p&gt;function srv_describe;&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; external sLibName name 'srv_describe';&lt;br&gt;function srv_setutype;&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; external sLibName name 'srv_setutype';&lt;br&gt;function srv_setcoldata;&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; external sLibName name 'srv_setcoldata';&lt;br&gt;function srv_setcollen;&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; external sLibName name 'srv_setcollen';&lt;br&gt;function srv_sendrow;&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; external sLibName name 'srv_sendrow';&lt;br&gt;function srv_senddone;&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; external sLibName name 'srv_senddone';  &lt;p&gt;// Dealing with Extended Procedure parameters&lt;br&gt;function srv_rpcparams;&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; external sLibName name 'srv_rpcparams';&lt;br&gt;function srv_paraminfo;&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; external sLibName name 'srv_paraminfo';&lt;br&gt;function srv_paramsetoutput;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_paramsetoutput';  &lt;p&gt;function srv_paramdata;&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; external sLibName name 'srv_paramdata';&lt;br&gt;function srv_paramlen;&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; external sLibName name 'srv_paramlen';&lt;br&gt;function srv_parammaxlen;&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; external sLibName name 'srv_parammaxlen';&lt;br&gt;function srv_paramtype;&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; external sLibName name 'srv_paramtype';&lt;br&gt;function srv_paramset;&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; external sLibName name 'srv_paramset';  &lt;p&gt;function srv_paramname;&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; external sLibName name 'srv_paramname';&lt;br&gt;function srv_paramnumber;&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; external sLibName name 'srv_paramnumber';  &lt;p&gt;//--------------------------------------------------------------&lt;br&gt;// The rest of these APIs are still supported, in SQL Server 7.0,&lt;br&gt;// but may not be supported after SQL Server 7.0  &lt;p&gt;function srv_getconfig;&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; external sLibName name 'srv_getconfig';&lt;br&gt;function srv_getserver;&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; external sLibName name 'srv_getserver';&lt;br&gt;function srv_got_attention;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_got_attention';&lt;br&gt;function srv_eventdata;&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; external sLibName name 'srv_eventdata';  &lt;p&gt;// Memory&lt;br&gt;function srv_alloc;&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;&amp;nbsp; external sLibName name 'srv_alloc';&lt;br&gt;function srv_bmove;&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;&amp;nbsp; external sLibName name 'srv_bmove';&lt;br&gt;function srv_bzero;&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;&amp;nbsp; external sLibName name 'srv_bzero';&lt;br&gt;function srv_free;&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;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_free';  &lt;p&gt;function srv_config_fn;&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; external sLibName name 'srv_config';&lt;br&gt;function srv_config_alloc;&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; external sLibName name 'srv_config_alloc';&lt;br&gt;function srv_convert;&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; external sLibName name 'srv_convert';&lt;br&gt;function srv_event_fn;&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; external sLibName name 'srv_event';&lt;br&gt;function srv_getuserdata;&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; external sLibName name 'srv_getuserdata';&lt;br&gt;function srv_getbindtoken;&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; external sLibName name 'srv_getbindtoken';&lt;br&gt;function srv_getdtcxact;&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; external sLibName name 'srv_getdtcxact';&lt;br&gt;function srv_handle;&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; external sLibName name 'srv_handle';&lt;br&gt;function srv_impersonate_client;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_impersonate_client';&lt;br&gt;function srv_init;&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;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_init';&lt;br&gt;function srv_iodead;&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; external sLibName name 'srv_iodead';&lt;br&gt;function srv_langcpy;&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; external sLibName name 'srv_langcpy';&lt;br&gt;function srv_langlen;&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; external sLibName name 'srv_langlen';&lt;br&gt;function srv_langptr;&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; external sLibName name 'srv_langptr';&lt;br&gt;function srv_log;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_log';&lt;br&gt;function srv_paramstatus;&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; external sLibName name 'srv_paramstatus';&lt;br&gt;function srv_pfield;&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; external sLibName name 'srv_pfield';&lt;br&gt;function srv_returnval;&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; external sLibName name 'srv_returnval';&lt;br&gt;function srv_revert_to_self;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_revert_to_self';  &lt;p&gt;function srv_rpcdb;&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;&amp;nbsp; external sLibName name 'srv_rpcdb';&lt;br&gt;function srv_rpcname;&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; external sLibName name 'srv_rpcname';&lt;br&gt;function srv_rpcnumber;&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; external sLibName name 'srv_rpcnumber';&lt;br&gt;function srv_rpcoptions;&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; external sLibName name 'srv_rpcoptions';&lt;br&gt;function srv_rpcowner;&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; external sLibName name 'srv_rpcowner';  &lt;p&gt;function srv_run;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_run';  &lt;p&gt;function srv_sendmsg;&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; external sLibName name 'srv_sendmsg';&lt;br&gt;function srv_ansi_sendmsg;&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; external sLibName name 'srv_ansi_sendmsg';  &lt;p&gt;function srv_sendstatus;&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; external sLibName name 'srv_sendstatus';&lt;br&gt;function srv_setuserdata;&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; external sLibName name 'srv_setuserdata';&lt;br&gt;function srv_sfield;&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; external sLibName name 'srv_sfield';&lt;br&gt;function srv_symbol;&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; external sLibName name 'srv_symbol';&lt;br&gt;function srv_tdsversion;&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; external sLibName name 'srv_tdsversion';&lt;br&gt;function srv_writebuf;&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; external sLibName name 'srv_writebuf';&lt;br&gt;function srv_willconvert;&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; external sLibName name 'srv_willconvert';&lt;br&gt;procedure srv_ackattention;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_ackattention';&lt;br&gt;function srv_terminatethread;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_terminatethread';&lt;br&gt;function srv_sendstatistics;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_sendstatistics';&lt;br&gt;function srv_clearstatistics;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_clearstatistics';&lt;br&gt;function srv_setevent;&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; external sLibName name 'srv_setevent';&lt;br&gt;function srv_message_handler;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_message_handler';  &lt;p&gt;function srv_pre_handle;&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; external sLibName name 'srv_pre_handle';&lt;br&gt;function srv_post_handle;&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; external sLibName name 'srv_post_handle';&lt;br&gt;function srv_post_completion_queue;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_post_completion_queue';&lt;br&gt;function srv_IgnoreAnsiToOem;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; external sLibName name 'srv_IgnoreAnsiToOem';  &lt;p&gt;end.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10105.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>AVI文件格式研究中碰到的一些问题的解决办法</title><link>http://webuc.net/chinahuman/archive/2008/08/25/10099.aspx</link><pubDate>Mon, 25 Aug 2008 14:54:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/08/25/10099.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10099.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/08/25/10099.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10099.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10099.aspx</trackback:ping><description>&lt;P&gt;最近在研究AVI文件格式的生成问题，碰到以下的问题，找到解决办法，共享如下：&lt;/P&gt;
&lt;P&gt;1.生成的文件格式的校验问题：&lt;/P&gt;
&lt;P&gt;因为是根据AVI RIFF File Refence这个文档来生成的，所以对错不知道。因此需要一个校验工具。偶觉得有两个工具不错：&lt;/P&gt;
&lt;P&gt;a. Gsport这个是暴风影音一类的工具会带的工具。如果格式有错误，它会提示出来。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_4.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=244 alt=image src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_thumb_1.png" width=243 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;b.VirtualDub 在这里面点工具菜单里面有十六进制编辑器，按Ctrl+R可以显示出RIFF的树，这样比较容易找出问题来。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_2.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=244 alt=image src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_thumb.png" width=229 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;2.一切都是按文档的说明来生成的，用播放器来播放是正常的，但是用如上的校验工具来看，里面有错位。在trunck列表里面，发现只有第一个是识别出来，后面的跳了一位无法识别。&lt;/P&gt;
&lt;P&gt;经研究发现是存在着奇偶对齐的问题，如果内容是奇数位，那么得在后面补上一位来对齐，但是这一位不能记在这个trunck的长度里面，否则解码器多读了一位可能会引起解码错误。&lt;/P&gt;
&lt;P&gt;计划把音频加入，以及功能完善化后，发布DLL供人调用。&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10099.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>在sql server里面插入，修改，删除数据时，同步把变动的数据取出来</title><link>http://webuc.net/chinahuman/archive/2008/08/08/10081.aspx</link><pubDate>Fri, 08 Aug 2008 04:37:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/08/08/10081.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10081.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/08/08/10081.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10081.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10081.aspx</trackback:ping><description>&lt;p&gt;别的不多说，直接上SQL：&lt;/p&gt; &lt;p&gt;修改时：&lt;/p&gt; &lt;p&gt;update [res].[dbo].[IP] set &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ip1 = ID+1 &lt;p&gt;output INSERTED.ID, &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERTED.ip1 &lt;p&gt;where Country = 'IANA' &lt;p&gt;&amp;nbsp; &lt;p&gt;插入时： &lt;p&gt;insert into [res].[dbo].[IP](ID, startip, endip) &lt;p&gt;output INSERTED.ID,INSERTED.startip,INSERTED.endip &lt;p&gt;values(234666,'12334', '34445') &lt;p&gt;&amp;nbsp; &lt;p&gt;删除时： &lt;p&gt;delete from [res].[dbo].[IP] &lt;p&gt;output deleted.ID, deleted.startip, deleted.endip &lt;p&gt;where ID = 234666&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10081.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>