<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/category/98.aspx</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/2009/01/12/10323.aspx</link><pubDate>Mon, 12 Jan 2009 17:16:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2009/01/12/10323.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10323.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2009/01/12/10323.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10323.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10323.aspx</trackback:ping><description>&lt;p&gt;有时候会碰到一些比较BT的需求，比如说想要实现avi的在线播放。有时候会发现一些工具能实现，但是发现总是不够稳定。原因在于协议，如果播放器写得好，可以一边下载，一边分析下载的流，来实现播放。但是想要实现快进，或是拖动这些的就不容易了。&lt;/p&gt; &lt;p&gt;要解决这些问题，只有一点，那就是自己来实现这套流协议，然后作播放器来播放。为了实现这些东西，偶作一下分析，可以简单地把技术点分为三个：&lt;/p&gt; &lt;p&gt;1.流服务器的实现&lt;/p&gt; &lt;p&gt;2.流播放器的实现&lt;/p&gt; &lt;p&gt;3.注册客户端，来实现播放器的关联（这样点击网页上的链接时，可以自动弹出我们的播放器来播放）&lt;/p&gt; &lt;p&gt;接下来让我们详细地看看具体的实现分析吧。&lt;/p&gt; &lt;h3&gt;一、流服务器的实现&lt;/h3&gt; &lt;p&gt;我们可以通过分析AVI的文件格格式，以及播放时的需要，可以弄出来一个很简单的流协议。并且为了方便使用，我还是基于标准的HTTP协议上来扩展实现。在这里，我把这个协议分成了两大块：媒体摘要和媒体块。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;媒体的摘要&lt;/strong&gt;：根据我们在播放AVI的时候的要求，我们的摘要里面要含有这些信息：宽，高，帧率，解码器类型，流的数量（音频和视频），推荐的缓冲大小，总帧数，如果有音频流，那还得指定音频的采样频率，位数等信息，以及每一帧的索引。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;媒体块&lt;/strong&gt;：在这里面，我们就是真正的下载数据了，每次请求的帧数，这个可以根据我们的应用环境综合考虑了，主要要考虑以下几点：下载尽量快，请求数尽量少。&lt;/p&gt; &lt;p&gt;有了服务器的这些支持，我们就可以实现我们的客户端了。&lt;/p&gt; &lt;h3&gt;二、流播放器的实现&lt;/h3&gt; &lt;p&gt;具体的播放实现我在这里就不多写了，对于媒体播放器来说，无非就是拿到一帧数据，然后调用对应的解码器解成位图数据，然后把它画在界面上。&lt;/p&gt; &lt;p&gt;在这里主要讲流播放器数据的请求和快进的实现：&lt;/p&gt; &lt;p&gt;我把程序划成两个线程：一个线程负责下载数据，另一个线程负责把内容绘在界面上。&lt;/p&gt; &lt;p&gt;第一步获得媒体的摘要。得到这个摘要后，我们就可以得到媒体的大概信息了。然后再顺序地把索引表发送到服务器上去请求数据。为了更好的播放性能，我们可以把下载下面的媒体块保存在临时文件里面，然后再加一个索引位置来标明每一帧的起始位，以及长度。当播放时，如果发现该帧还未下载。就给那个下载线程发个请求，让它下次下载的时候，就从这个位置开始。所以快进这些的实现就变得很简单了，如果没有下载，只要很短时间的buffer就可以继续播放了。&lt;/p&gt; &lt;h3&gt;三、注册客户端&lt;/h3&gt; &lt;p&gt;为了更好的体验，偶们可以注册新的协议，这样用户在点击浏览器上的链接的时候，就可以自动打开我们的播放器来播放，偶暂把这个协议定为：ivp(Ironsoft Video Protrol).注册协议很简单，只要把以下的注册导入就可以了，当然我们也可以编程实现生成这些注册表：&lt;/p&gt; &lt;p&gt;Windows Registry Editor Version 5.00  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP]&lt;br&gt;@="IVPProtocol"&lt;br&gt;"URL Protocol"="\"C:\\Program Files\\IronSoftPlayer\\player.exe\""  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\DefaultIcon]&lt;br&gt;@="\"C:\\Program Files\\IronSoftPlayer\\player.exe\",1"  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\shell]  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\shell\open]  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\shell\open\command]&lt;br&gt;@="\"C:\\Program Files\\IronSoftPlayer\\player.exe\" \"%1\""  &lt;p&gt;? &lt;p&gt;好了，avi的在线流播放就可以很轻松地实现了。嘿嘿，偶一共是用三个工作日左右就全部实现了。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10323.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>开发Office的一些应用部署后出现找不到程序集的解决方法</title><link>http://webuc.net/chinahuman/archive/2009/01/07/10317.aspx</link><pubDate>Wed, 07 Jan 2009 14:22:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2009/01/07/10317.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10317.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2009/01/07/10317.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10317.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10317.aspx</trackback:ping><description>&lt;p&gt;有时候开发一些应用，需要用到Office的一些组件，比如说在线生成Excel，或是Word文档。在自己的机器上跑得满好的，可是部署的时候，发现报错，如：“未能加载文件或程序集“Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。 ”。这个最常规的办法就是在服务器上安装一个Office。不过这太大了，而且有时候并不一定需要真的Office在上面运行。为了解决这个问题，微软发布了Office的一些更新包：Redistributable Primary Interop Assemblies.&lt;/p&gt; &lt;p&gt;下载地址是：&lt;/p&gt; &lt;p&gt;Office2003: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Office2007:http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;不过微软不建议我们这样来用Office。上面写了，如果把它放在asp.net或是windows服务中，Office会变得不稳定或是没有响应。这也就是为啥有时候服务器上会多很多Office相关的进程，因为没有办法正常地关闭它。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10317.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>获取其它进程的启动参数</title><link>http://webuc.net/chinahuman/archive/2008/12/22/10280.aspx</link><pubDate>Mon, 22 Dec 2008 05:50:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/12/22/10280.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10280.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/12/22/10280.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10280.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10280.aspx</trackback:ping><description>&lt;p&gt;当我们使用ProcessExplorer的时候，发现它可以得到各个进程的启动参数（也就是在查看一个进程的属性里，在commandline里面显示的内容）。但是翻遍了MSDN也没有对应的API可以去作这样的事情，最开始的时候很无奈，只好先用内存查看器，看一下commmandline在内存啥位置，然后再用ReadProcessMemory去读一个尽可能大的块出来，虽然简单，但是不可靠，而且有时候读出来的东西后面是一堆无用的数据，影响美观。&lt;/p&gt; &lt;p&gt;经常不断的搜索，终于找到了方法：&lt;/p&gt; &lt;p&gt;1.先用OpenProcess 打开目标进程的进程空间，得到句柄&lt;/p&gt; &lt;p&gt;2.使用NtQueryInformationProcess这个API去读取进程里面的PE块的基地址也就是：PebBaseAddress&lt;/p&gt; &lt;p&gt;3.继续使用ReadProcessMemory，从这个PebBaseAddress，开始读取PEB（PE Block），这时候可以得到ProcessParameters，进程的参数地址&lt;/p&gt; &lt;p&gt;4.继续使用ReadProcessMemory，从这个ProcessParameters，开始读取PROCESS_PARAMETERS，这时候可以得到CommandLine.Length和CommandLine.Buffer,也就是启动参数的长度和启动参数的地址。&lt;/p&gt; &lt;p&gt;5.最后再使用ReadProcessMemory，根据记动参数的地址和长度去读取启动参数。特别要注意的事情是，如果在unicode的系统中，这时候读到的启动参数也是unicode的，所以得定义对应的字串类型去读取，不然打印出来的字串只有第一个字母（比如说参数是：abc,如果用ansi的字串，结果就是：a\0b\0c\0,\0这个就表示字串的结束了）。&lt;/p&gt; &lt;p&gt;最后，如果发现在第2步的时候出现读取错误，这时候应该是程序没有debug的权限了，可以用以下方法来提升程序的权限：&lt;/p&gt; &lt;p&gt;1.先用LookupPrivilegeValue来查看能否拥有：SeDebugPrivilege这个权限&lt;/p&gt; &lt;p&gt;2.如果可以，就用以下代码来提升权限：&lt;/p&gt; &lt;p&gt;Privileges.Privileges[0].Luid:=DebugNameValue; &lt;br&gt;Privileges.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; &lt;br&gt;Result:=AdjustTokenPrivileges(TokenHandle,False,Privileges,SizeOf(Privileges),nil,RetLen); &lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10280.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>string.format()是否应该多用？</title><link>http://webuc.net/chinahuman/archive/2008/12/08/10259.aspx</link><pubDate>Mon, 08 Dec 2008 03:06:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/12/08/10259.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10259.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/12/08/10259.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10259.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10259.aspx</trackback:ping><description>&lt;p&gt;前一阵子，项目中的一个页面每秒只能处理300次，而这个页面的逻辑也不复杂，就是根据条件拼出一个字串然后输出。开始以为这里面逻辑太复杂，所以有问题。不过后面发现了vs里面带了性能分析工具，于是抱着试试看的想法，作了一下性能分析。最后的结果让人大吃一惊：string.format这个操作竟然用掉了一半的时间，为啥它会这么费时间呢?为了真相，我用.net reflector查看了string的实现：&lt;/p&gt; &lt;p&gt;public static string Format(IFormatProvider provider, string format, params object[] args)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((format == null) || (args == null))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException((format == null) ? "format" : "args");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; builder.AppendFormat(provider, format, args);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return builder.ToString();&lt;br&gt;}&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;很让人吃惊，string.format竟然是调用了StringBuilder的AppendFormat来实现的。再继续根下去（这个源码只是通过IL得来的，可能和原始的不太一样，但是差不多了），注意里面的红色的那句：&lt;/p&gt;
&lt;p&gt;public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num3;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((format == null) || (args == null))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException((format == null) ? "format" : "args");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char[] chArray = format.ToCharArray(0, format.Length);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int length = chArray.Length;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char ch = '\0';&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICustomFormatter formatter = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (provider != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formatter = (ICustomFormatter) provider.GetFormat(typeof(ICustomFormatter));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;Label_004E:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num3 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num4 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (index &amp;lt; length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == '}')&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '}'))&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; {&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; index++;&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; }&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; else&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; {&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; FormatError();&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; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; if (ch == '{')&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '{'))&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; {&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; index++;&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; }&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; else&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; {&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; index--;&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; break;&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; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; chArray[num4++] = ch;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num4 &amp;gt; num3)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(chArray, num3, num4 - num3);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((index == length) || ((ch = chArray[index]) &amp;lt; '0')) || (ch &amp;gt; '9'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num5 = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num5 = ((num5 * 10) + ch) - 0x30;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (((ch &amp;gt;= '0') &amp;amp;&amp;amp; (ch &amp;lt;= '9')) &amp;amp;&amp;amp; (num5 &amp;lt; 0xf4240));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num5 &amp;gt;= args.Length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new FormatException(Environment.GetResourceString("Format_IndexOutOfRange"));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((index &amp;lt; length) &amp;amp;&amp;amp; ((ch = chArray[index]) == ' '))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool flag = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num6 = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == ',')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == ' '))&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == '-')&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = true;&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; index++;&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; if (index == length)&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; {&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; FormatError();&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; }&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; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; if ((ch &amp;lt; '0') || (ch &amp;gt; '9'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; do&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num6 = ((num6 * 10) + ch) - 0x30;&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; index++;&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; if (index == length)&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; {&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; FormatError();&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; }&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; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; while (((ch &amp;gt;= '0') &amp;amp;&amp;amp; (ch &amp;lt;= '9')) &amp;amp;&amp;amp; (num6 &amp;lt; 0xf4240));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((index &amp;lt; length) &amp;amp;&amp;amp; ((ch = chArray[index]) == ' '))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; object arg = args[num5];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string str = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == ':')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num3 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num4 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (true)&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&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; {&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; FormatError();&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; }&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; ch = chArray[index];&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; index++;&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; switch (ch)&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; {&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; case '{':&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;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '{'))&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;&amp;nbsp; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&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;&amp;nbsp; }&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;&amp;nbsp; else&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;&amp;nbsp; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&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;&amp;nbsp; }&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;&amp;nbsp; break; 
&lt;p&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; case '}':&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;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '}'))&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;&amp;nbsp; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&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;&amp;nbsp; }&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;&amp;nbsp; else&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;&amp;nbsp; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index--;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num4 &amp;gt; num3)&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 color="#ff0000"&gt;str = new string(chArray, num3, num4 - num3);&lt;/font&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Label_0253;&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;&amp;nbsp; }&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;&amp;nbsp; break;&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; }&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; chArray[num4++] = ch;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;Label_0253:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch != '}')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string str2 = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (formatter != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = formatter.Format(str, arg, provider);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (str2 == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (arg is IFormattable)&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = ((IFormattable) arg).ToString(str, provider);&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; else if (arg != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = arg.ToString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&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; if (str2 == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int repeatCount = num6 - str2.Length;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!flag &amp;amp;&amp;amp; (repeatCount &amp;gt; 0))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(' ', repeatCount);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(str2);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag &amp;amp;&amp;amp; (repeatCount &amp;gt; 0))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(' ', repeatCount);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Label_004E;&lt;br&gt;} 
&lt;p&gt;发现里面会有new string，这时候会有新的内存分配出现，也就是说string.format会产生很多临时的string对象，这个会费时间，同时也会使GC的工作量增加.既然这里面调用了stringbuilder来实现的，那为啥不直接调用stringbuilder.append来实现。于是我就把原来的实现改成了stringbuilder的append，同时设置它初始容量为我们预期的大小，通过测试，这部分的性能提高了十倍。于是性能问题解决了。&lt;/p&gt;
&lt;p&gt;最后，我觉得如果程序的性能很重要，而在这里面又经常有string.format的时候，还是改用stringbuilder.append来实现，虽然麻烦一些，代码也不好看，但是效果还是会很明显的。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10259.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>编程实现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><item><dc:creator>铁匠</dc:creator><title>TFS下的一个问题解决（转）</title><link>http://webuc.net/chinahuman/archive/2008/07/03/10029.aspx</link><pubDate>Thu, 03 Jul 2008 13:36:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/07/03/10029.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10029.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/07/03/10029.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10029.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10029.aspx</trackback:ping><description>&lt;P&gt;最近碰到了一个机子上的项目死活不能和TFS绑定，困扰很久，终于找到解决方案，原因很简单，成因也很简单，但是就是没有看到。 
&lt;P&gt;废话少说看原文：原文地址：&lt;A href="http://teamfoundation.blogspot.com/2007/12/offline-and-back-again-in-vs2008.html"&gt;http://teamfoundation.blogspot.com/2007/12/offline-and-back-again-in-vs2008.html&lt;/A&gt; 
&lt;P&gt;One of the most painful issues in VS2005 was its quirky offline support.&lt;BR&gt;&lt;BR&gt;One of the first features I have checked in Visual Studio 2008 was working offline. And what can I say - it (mostly) rocks!&lt;BR&gt;&lt;BR&gt;Let's do it step-by-step.&lt;BR&gt;
&lt;UL&gt;&lt;BR&gt;
&lt;LI&gt;You open the solution under source control and there is no connection to the server. What you get is the dialog, indicating offline condition&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_dialog.gif" border=0&gt;&lt;BR&gt;In Output window pane appears the log message, indicating detailed reason for the offline&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_output1.gif" border=0&gt;&lt;BR&gt;&lt;B&gt;Important note:&lt;/B&gt; Once the solution is opened offline, next time you open it in Visual Studio the dialog won't appear (but the output pane will show same message every time)&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_output2.gif" border=0&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;If you choose to change files in your solution/project when is offline, you will have a message that file is read-only once you save the changes. There is no indication of "under source control" status for offline projects or solutions&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Important note:&lt;/B&gt; When working offline, you may edit or delete existing files or add new ones, and these types of changes will be supported when going "online" with TFS server. However, file renames are not supported&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;Now let's go online. You open solution in VS and you have connection - but tranistion to online will not happen automatically. To sync solution/project back online you should use "&lt;I&gt;Go Online&lt;/I&gt;" menu, that available on right-click in Solution Explorer or in "File"-&amp;gt;"Source Control" menu.&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_online_menu.gif" border=0&gt;&lt;BR&gt;Once you hit "Go Online" requested, the dialog with changes "Go Online" dialog will appear detailing the changes performed while online. The dialog shows files and&lt;BR&gt;changes (add/edit/delete) performed while offline. You may choose not to pend the changes for specific files (then the file will remain writable, but will not have pending changes).&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_online_dialog.gif" border=0&gt;&lt;BR&gt;&lt;B&gt;Important note:&lt;/B&gt; If you did not perform any changes while offline, the appropriate message will appear&lt;BR&gt;Once online, the pending changes indications will appear in Solution Explorer.&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;If you want to unbind your solution/project from source control, all you need to do is to go to "Source Control"-&amp;gt;"Change Source Control" menu. The message will appear asking you whether you want to go online or permanently unbind your solution.&lt;BR&gt;&lt;BR&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;BR&gt;&lt;BR&gt;But of course, there were several "&lt;I&gt;Things I did not like&lt;/I&gt;":&lt;BR&gt;
&lt;OL&gt;&lt;BR&gt;
&lt;LI&gt;No cancel on Offline dialog - either go offline or ...?&lt;BR&gt;
&lt;LI&gt;No indication for source controlled files in Solution Explorer in offline mode (similar to that of VSS) - only read-only flag on file serves as an indication&lt;BR&gt;
&lt;LI&gt;"Change Source Control" dialog does not allow one to "Disconnect", you can only "Unbind; so going offline happens only when server is not available&lt;BR&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;BR&gt;&lt;BR&gt;Overall, I should say I liked VS2008 experience very much (especially as compared with previous version). I can feel that feedback on TFS2005 offline experience was not wasted!&lt;img src ="http://webuc.net/chinahuman/aggbug/10029.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>在服务里面弹出一个窗口到用户的桌面上</title><link>http://webuc.net/chinahuman/archive/2008/05/04/9966.aspx</link><pubDate>Sun, 04 May 2008 07:17:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/05/04/9966.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9966.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/05/04/9966.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9966.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9966.aspx</trackback:ping><description>&lt;P&gt;曾几何时，服务里面弹出一个窗口到桌面上不再是那么地容易了：以前只要把服务设置为允许和桌面交互就可以直接在服务启动的时候，把一个窗口弹给用户。但是现在在vista(其它的OS 下没有测试，未知)下要弹出这样的窗体，首先会弹出一个提示框提示是否接否一个服务弹出来的消息，点接受后，才会在一个全灰的桌面里面弹出这个窗口。不用想，这样的用户体验，肯定是会被直接PASS。原因很简单，因为不同的用户间的桌面是不一样的，服务用的是System的权限，在vista里面是Session0，而用户的帐户不是这个（肯定大于0）。&lt;/P&gt;
&lt;P&gt;看来，想弹出一个窗体，需要另一个程序来作辅助了。解决方案有两种：&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;开发一个程序A在启动的时候，随系统启动，并监控指定文件M，服务S有消息的时候，放在文件M里，A 感受了文件变化了，就去读这个文件里的内容，根据规则来作对应的动作。坏处很明显，当用户为了让系统跑得快的时候，这种自启动文件很容易被砍掉，导致了有些功能莫名奇妙地不可用。 
&lt;LI&gt;同样地，也是开发一个程序A，用CreateProcessAsUser这个API来创建这个A ，并且发送到用户的桌面上去。好处是可以把这个A和服务S 放在同一个程序文件里面，根据不同的参数来启动不同的功能。这样用户除非是删除整个服务，否则不会有部分功能能用，又有部分功能不能用的问题。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;现在来看看第二种方案，要想用CreateProcessAsUser这个API ，有这样几个步骤：&lt;/P&gt;
&lt;P&gt;１.取得用户的令牌（Token）&lt;/P&gt;
&lt;P&gt;２.指定好虚拟桌面&lt;/P&gt;
&lt;P&gt;３.调用API创建这个用户进程。&lt;/P&gt;
&lt;P&gt;在取得用户令牌的时候，又有几个方法：&lt;/P&gt;
&lt;P&gt;１.从用户的进程上去剥&lt;/P&gt;
&lt;P&gt;２.先用WTSGetActiveConsoleSessionId得到用户会话ID，再用WTSQueryUserToken这个API去取。&lt;/P&gt;
&lt;P&gt;不过在vista下面,服务里面的WTSGetActiveConsoleSessionId这个API得到的总是0，也就是Session0,用这个创建出来的进程，还是属于一个服务进程。(而且这个API是XP以及以后的系统才会提供的，在早点的系统上就会调用失败)所以我们只好从用户的进程上去找，用户登录的时候，一定会有的进程就是：explorer.exe，这样可以遍历所有的进程去找到这个（如果是多人同时登录这个系统里，我也不知道该怎么办了，不知道有没有高人指点一下）。&lt;/P&gt;
&lt;P&gt;这样创建出来的用户进程，在进程列表里面可以看到是活动用户的。但是如果在这里面使用一下文件选择框，或是去取一些系统目录，比如说用户的桌面，用户的收藏夹等，都会得到空。这时候因为没有指定用户环境造成的。使用CreateEnvironmentBlock这个API就可以搞定了。&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9966.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>