﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><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>C++博客-随感而发-随笔分类-COM相关</title><link>http://www.cppblog.com/shongbee2/category/10154.html</link><description>杂七杂八</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2009 05:52:26 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2009 05:52:26 GMT</pubDate><ttl>60</ttl><item><title>WCHAR我不再惧怕了</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/28/81349.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Tue, 28 Apr 2009 12:09:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/28/81349.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/81349.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/28/81349.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/81349.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/81349.html</trackback:ping><description><![CDATA[宽字符已经困扰我很久了，以前我都是设置项目的属性把它改为多字节，不用UNICODE。不过现在又遇到宽字节的问题，没有办法，只有硬着头皮学学：<br>我找到的资料：<br><a href="http://hi.baidu.com/shongbee2/blog/item/207925546b6cdd5fd10906e0.html">http://hi.baidu.com/shongbee2/blog/item/207925546b6cdd5fd10906e0.html</a><br><a href="http://hi.baidu.com/shongbee2/blog/item/d4a057511e9539878c5430cb.html">http://hi.baidu.com/shongbee2/blog/item/d4a057511e9539878c5430cb.html</a><br>看了之后我才发现原来有wcsXXX的函数专门处理宽字节的，就是strXXX一样好使。呵呵，我不再惧怕了，就试着自己写了一下，还是学了蛮多东西的：<br>1.有wcsXXX的函数和strXXX的函数对应处理宽字节，wcslen就是求长度的，wcscmp就是比较两个字符串的。<br>2.输出也有相关的操作，wprintf(L&#8221;%s%s&#8221;);这样的操作，对文件也可以用fwprintf函数来输出。不过我发现貌似cout &lt;&lt; wchar；不成功。也发现了一个问题，就是我输出&#8221;相等&#8221;这样一个字符串的时候，发现居然输出不正确，无论是控制台和文件都有错误。可见，这个还是有点小问题的。输出其他的例如&#8221;12345&#8221;等都是正常的。哎，这个函数并不可靠啊。<br>3.宽字节和普通串的转换问题，学了两个函数，一个是：<br>wcstombs(char* strDes, const wchar*, size_t nMax);这个函数的作用是把wchar转换为char。<br>char* strDes 为保存转换后的普通字符串，wchar* 要被转换的宽字符串。转换的最大长度。这里的长度是转换的个数，而不是字节长度。<br>mbstowcs() 就是一个相反的过程了，参数就不说了。<br><br>另一套转换的函数是：<br>int WideCharToMultiByte(<br>&nbsp; UINT CodePage, <br>&nbsp; DWORD dwFlags, <br>&nbsp; LPCWSTR lpWideCharStr,<br>&nbsp; int cchWideChar, <br>&nbsp; LPSTR lpMultiByteStr, <br>&nbsp; int cbMultiByte,<br>&nbsp; LPCSTR lpDefaultChar,&nbsp;&nbsp; &nbsp;<br>&nbsp; LPBOOL lpUsedDefaultChar<br>);<br>他的参数很多，上面的连接有介绍，这里就不怎么细说了。<br>第一个是编码的方式，我一般用CP_ACP。第二个是转换标志，MSDN上说什么都不设置更快，然后我就什么都不管了就用NULL了。具体作用不知道，等遇到了再学。第三个参数就是被转换的字符串，第四个参数是该字符串的长度，-1表示自动算长度，如果是手动给出，一定要把最后的终结符长度也算上。我觉得还是-1来的实际。第五个参数就是保存转换串的指针，第六个参数就是保存串的长度，这里是单位字符的个数。如果转换的时候没有终结符，那么结果也没有终结符，要注意下。最后两个参数就是默认的填充字符和是否使用了默认填充字符，我一般就用NULL代替。<br><br>普通串转宽字节也是类似。<br>这里有几个注意的，一定要保证空间足够。还有就是那个长度是单位字符个数，而不是字节数，在转换时，推荐被转换的字符串长度设置为-1,因为这样他会自动算出终结符结束。返回值也是转换的单位字符个数。例如&#8221;相等&#8221;有普通串转换为宽字节串，返回结果是3，（有终结符），而反过来就是5。如果返回时0 说明转换失败。<br><br>心得：虽然WideCharToMultiByte的参数要多，感觉用的没有wcstombs爽，可是他的准确好高一些，要转换的话，还用用WideCharToMultiByte比较合适，还有就是虽然有一套wcsXXX的库函数，可惜输出还是出现问题的。如果全都用宽字节，那没有关系wcsxxx的函数还是蛮好用的。还有一个疑惑我明明查字典multi是多的意思也就是说multibyte是多字节，我的中文版VS2005配置里面也是说的多字节。搞不懂为什么要用宽字节呢？可能是多字节编码不好用吧。呵呵。 废话也说完了，奉上源代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">fstream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;fp&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;WCHAR&nbsp;wchar[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">相等相等</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义一个宽字节的变量，初始为"相等"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;fp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fopen(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">w+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">打开文件称奥做</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;fwprintf(fp,&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;wchar);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出到文件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">关闭文件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WCHAR&nbsp;wc2[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义第二个宽字节变量<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">wc开始的有很多宽字节的操作。都和str相对应。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wcscpy(wc2,&nbsp;wchar);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">复制。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wcscmp(wc2,&nbsp;wchar);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(n&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wprintf(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">相等\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里是否注意到没有wprintf有问题的。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;str[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义char字符。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wcstombs(str,&nbsp;wc2,&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">宽字节转换为muiltychar</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;str);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出结果</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wc2[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;wc2[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wcstombs(str,&nbsp;wc2,&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">宽字节转换为muiltychar</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;str);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出结果<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">另外的方式转换</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WideCharToMultiByte(CP_ACP,&nbsp;NULL,&nbsp;wchar,&nbsp;wcslen(wchar)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;str,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;str);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;str2[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">加一</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;WCHAR&nbsp;wc3[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MultiByteToWideChar(CP_ACP,&nbsp;NULL,&nbsp;str2,&nbsp;strlen(str2)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;wc3,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">char到宽字节。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
不要脸的再次放入精华区，因为我觉得他困扰我太久了。呵呵<br>
<img src ="http://www.cppblog.com/shongbee2/aggbug/81349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-28 20:09 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/28/81349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>添加注册表信息</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/09/79338.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Thu, 09 Apr 2009 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/09/79338.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/79338.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/09/79338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/79338.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/79338.html</trackback:ping><description><![CDATA[今天学了怎么插入注册表键和删除注册表键。也没有什么特别的思路，主要是调用windows自带的函数来完成操作。感想就是看MSND一定要仔细。看书也要仔细。哈哈。<br>奉上源代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">assert.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">创建一个注册表的键值。chKey为主键，&nbsp;chValue为键的路径,值插入的默认的名中</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;SetRegKey(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;HKEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;hKeyRoot,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;chKey,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;chValue)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;assert(chKey);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKey;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">要插入的hkey<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建或打开一个要插入的hkey</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;lRes</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::RegCreateKeyExA(hKeyRoot,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">插入的主键</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">要创建的键名</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保留字</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">lpClass貌似很强大，但是我知道有什么用</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_OPTION_NON_VOLATILE,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">操作属性设置为不常改变</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KEY_ALL_ACCESS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">权限设置为都可以用</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">安全属性为默认</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存创建好的key</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">得到返回类型是打开还是创建</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(lRes&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;ERROR_SUCCESS)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果不成功返回false;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(chValue&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果要插入默认键值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegSetValueExA(hKey,&nbsp;NULL,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;REG_SZ,(</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">*</span><span style="color: #000000;">)chValue,&nbsp;strlen(chValue)</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;RegCloseKey(hKey);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">关闭key</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">清除注册表值，hKeyPar为父节点的键值，&nbsp;chKey为键的</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;DeleteKey(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;HKEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;hKeyPar,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;chKey)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKeySub;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">要清除的hkey<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">打开清除的hkey</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;lRes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::RegOpenKeyExA(hKeyPar,&nbsp;chKey,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;KEY_ALL_ACCESS,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">hKeySub);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(lRes&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;ERROR_SUCCESS)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果没有，返回false</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">遍历key的所有子节点，并一并清除</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;chBuffer[MAX_PATH];<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;nSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MAX_PATH;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">遍历子节点，清除，这里注意nIndex一直为0，因为每次有删除第0个子键，所以用0的索引就<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">能遍历删除所有的子键。如果是查询的话，就必须要改变nIndex来遍历。还有就是注意nSize<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">他是一个_in_out的参数，内部会改变他，所以每次都要把他设置为原来MAX_PATH</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(::RegEnumKeyExA(hKeySub,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;chBuffer,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">nSize,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;ERROR_SUCCESS)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果找到子键，就删除子键</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">DeleteKey(hKeySub,&nbsp;chBuffer))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegCloseKey(hKeySub);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MAX_PATH;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">需要先关闭该建，才能删除它。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;RegCloseKey(hKeySub);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">调用系统函数删除该键</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(::RegDeleteKeyA(hKeyPar,&nbsp;chKey)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;ERROR_SUCCESS)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;SetRegKey(HKEY_CLASSES_ROOT,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetRegKey(HKEY_CLASSES_ROOT,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey\\cV1\\CC2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetRegKey(HKEY_CLASSES_ROOT,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey\\cV1\\CC3</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteKey(HKEY_CLASSES_ROOT,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br><br><img src ="http://www.cppblog.com/shongbee2/aggbug/79338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-09 13:15 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/09/79338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】库文件静态连接时所需的def文件格式解析</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/09/79314.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Thu, 09 Apr 2009 01:17:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/09/79314.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/79314.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/09/79314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/79314.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/79314.html</trackback:ping><description><![CDATA[ 转自：http://blog.chinaunix.net/u1/51538/showart_573215.html<br><br>模块定义 &nbsp; (.def) &nbsp; 文件 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 模块定义 &nbsp; (.def) &nbsp; 文件为链接器提供有关被链接程序的导出、属性及其他方面的
<p><nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">信息</nobr>。生成 &nbsp; DLL &nbsp; 时，.def &nbsp; 文件最有用。由于存在可代替模块定义语句使用的链接器选项，通常不需要 &nbsp; .def &nbsp; 文件。也可以将__declspec(dllexport) &nbsp; 用作指定导出函数的手段。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 在链接器阶段可以使用 &nbsp; /DEF（指定模块定义文件）链接器选项调用 &nbsp; .def &nbsp; 文件。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 如果生成的 &nbsp; .exe &nbsp; 文件没有导出，使用 &nbsp; .def &nbsp; 文件将使输出文件较大并降低加载速度。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 模块定义语句的规则 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 下列<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1" onmouseover="kwE(event,1, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">语法</nobr>规则适用于 &nbsp; .def &nbsp; 文件中的所有语句。其他适用于特定语句的规则与各语句一起加以说明。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 语句、属性关键字和用户指定的标识符区分大小写。 &nbsp; &nbsp; <br>&nbsp; 包含空格或分号 &nbsp; (;) &nbsp; 的长文件名必须用引号 &nbsp; (") &nbsp; 引起。 &nbsp; &nbsp; <br>&nbsp; 使用一个或多个空格、制表符或换行符，将语句关键字同其参数分开和将各语句分开。指定参数的冒号 &nbsp; (:) &nbsp; 或等号 &nbsp; (=) &nbsp; 两旁有零个或多个空格、制表符或换行符。 &nbsp; &nbsp; <br>&nbsp; 如果使用 &nbsp; NAME &nbsp; 或 &nbsp; LIBRARY &nbsp; 语句，则这些语句必须位于所有其他语句之前。 &nbsp; &nbsp; <br>&nbsp;
在 &nbsp; .def &nbsp; 文件中，SECTIONS &nbsp; 和 &nbsp; EXPORTS &nbsp;
语句可以出现多次。每个语句都可以采用多个规范，各规范间必须用一个或多个空格、制表符或换行符分开。语句关键字必须在第一个规范的前面出现一次，并且可
以在每个附加规范的前面重复。 &nbsp; &nbsp; <br>&nbsp; 许多语句都具有等效的 &nbsp; LINK &nbsp; 命令行选项。有关其他详细信息，请参阅相应的 &nbsp; LINK &nbsp; 选项说明。 &nbsp; &nbsp; <br>&nbsp; .def &nbsp; 文件中的注释由每个注释行<nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0" onmouseover="kwE(event,0, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">开始</nobr>处的分号 &nbsp; (;) &nbsp; 指定。注释不能与语句共享一行，但可以在多行语句的规范间出现。（SECTIONS &nbsp; 和 &nbsp; EXPORTS &nbsp; 为多行语句。） &nbsp; &nbsp; <br>&nbsp; 以十进制或十六进制为基础指定数值参数。 &nbsp; &nbsp; <br>&nbsp; 如果字符串参数与保留字匹配，则必须用双引号 &nbsp; (") &nbsp; 将字符串参数引起。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; DESCRIPTION &nbsp; "text" &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该语句将字符串写入 &nbsp; .rdata &nbsp; 节。将指定的 &nbsp; text &nbsp; 用单引号或双引号（' &nbsp; 或 &nbsp; "）引起。若要在字符串中使用引号（单引号或双引号），请用其他类型的标记括住字符串。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 在模块定义文件中，DESCRIPTION &nbsp; 仅在生成虚拟设备驱动程序 &nbsp; (VxD) &nbsp; 时有效。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXETYPE:dynamic &nbsp; | &nbsp; dev386 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp;
在模块定义文件中，EXETYPE &nbsp; 仅在生成虚拟设备驱动程序 &nbsp; (VxD) &nbsp; 时有效。如果生成虚拟设备驱动程序时在模块定义文件中没有指定
&nbsp; EXETYPE，并且如果没有指定 &nbsp; /EXETYPE &nbsp; 链接器选项，则静态加载 &nbsp; (dev386) &nbsp; 生效。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXPORTS &nbsp; <br>&nbsp; definitions &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXPORTS &nbsp; 语句引入了一个由一个或多个 &nbsp; definitions（导出的函数或<nobr oncontextmenu="return false;" onmousemove="kwM(5);" id="key5" onmouseover="kwE(event,5, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">数据</nobr>）组成的节。每个定义必须在单独一行上。EXPORTS &nbsp; 关键字可以在第一个定义所在的同一行上或在前一行上。.def &nbsp; 文件可以包含一个或多个 &nbsp; EXPORTS &nbsp; 语句。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 导出 &nbsp; definitions &nbsp; 的语法为： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; entryname[=internalname] &nbsp; [@ordinal &nbsp; [NONAME]] &nbsp; [PRIVATE] &nbsp; [DATA] &nbsp; <br>&nbsp;
entryname &nbsp; 是要导出的函数名或变量名。这是必选项。如果导出的名称与 &nbsp; DLL &nbsp; 中的名称不同，则通过 &nbsp;
internalname &nbsp; 指定 &nbsp; DLL &nbsp; 中导出的名称。例如，如果 &nbsp; DLL &nbsp; 导出函数 &nbsp; func1()，要将它用作 &nbsp;
func2()，则应指定： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXPORTS &nbsp; <br>&nbsp; func2=func1 &nbsp; <br>&nbsp; @ordinal &nbsp; 允许指定是序号而不是函数名将进入 &nbsp; DLL &nbsp; 的导出表。这有助于最小化 &nbsp; DLL &nbsp; 的大小。.LIB &nbsp; 文件将包含序号与函数之间的映射，这使您得以像通常在使用 &nbsp; DLL &nbsp; 的<nobr oncontextmenu="return false;" onmousemove="kwM(6);" id="key6" onmouseover="kwE(event,6, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">项目</nobr>中那样使用函数名。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 可选的 &nbsp; NONAME &nbsp; 关键字允许只按序号导出，并减小结果 &nbsp; DLL &nbsp; 中导出表的大小。但是，如果要在 &nbsp; DLL &nbsp; 上使用 &nbsp; GetProcAddress，则必须知道序号，因为名称将无效。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 可选的 &nbsp; PRIVATE &nbsp; 关键字禁止将 &nbsp; entryname &nbsp; 放到由 &nbsp; LINK &nbsp; 生成的导入库中。它对同样是由 &nbsp; LINK &nbsp; 生成的图像中的导出无效。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 可选的 &nbsp; DATA &nbsp; 关键字指定导出的是数据，而不是代码。例如，可以导出数据变量，如下所示： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXPORTS &nbsp; <br>&nbsp; i &nbsp; DATA &nbsp; <br>&nbsp; 当对同一导出使用 &nbsp; PRIVATE &nbsp; 和 &nbsp; DATA &nbsp; 时，PRIVATE &nbsp; 必须位于 &nbsp; DATA &nbsp; 的前面。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 有三种导出定义的方法，按照建议的使用顺序依次为： &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 源代码中的 &nbsp; __declspec(dllexport) &nbsp; 关键字 &nbsp; &nbsp; <br>&nbsp; .def &nbsp; 文件中的 &nbsp; EXPORTS &nbsp; 语句 &nbsp; &nbsp; <br>&nbsp; LINK &nbsp; 命令中的 &nbsp; /EXPORT &nbsp; 规范 &nbsp; &nbsp; <br>&nbsp; 所有这三种方法可以用在同一个程序中。LINK &nbsp; 在生成包含导出的程序时还创建导入库，除非生成中使用了 &nbsp; .exp &nbsp; 文件。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 以下是 &nbsp; EXPORTS &nbsp; 节的示例： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXPORTS &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; DllCanUnloadNow &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PRIVATE &nbsp; &nbsp; &nbsp; DATA &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; DllWindowName &nbsp; = &nbsp; Name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DATA &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; DllGetClassObject &nbsp; &nbsp; &nbsp; &nbsp; @4 &nbsp; NONAME &nbsp; &nbsp; &nbsp; PRIVATE &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; DllRegisterServer &nbsp; &nbsp; &nbsp; &nbsp; @7 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; DllUnregisterServer &nbsp; <br>&nbsp;
注意，使用 &nbsp; .def &nbsp; 文件从 &nbsp; DLL &nbsp; 中导出变量时，不需要在变量上指定 &nbsp;
__declspec(dllexport)。但是，在任何使用 &nbsp; DLL &nbsp; 的文件中，仍必须在数据声明上使用 &nbsp;
__declspec(dllimport)。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; LIBRARY &nbsp; [library][BASE=address] &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该语句通知 &nbsp; LINK &nbsp; 创建 &nbsp; DLL。LINK &nbsp; 同时还创建导入库，除非生成中使用了 &nbsp; .exp &nbsp; 文件。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; library &nbsp; 参数指定 &nbsp; DLL &nbsp; 的名称。也可以使用 &nbsp; /out &nbsp; 链接器选项指定 &nbsp; DLL &nbsp; 输出名。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; BASE=address &nbsp; 参数设置操作系统用来加载 &nbsp; DLL &nbsp; 的基址。该参数重写 &nbsp; 0x10000000 &nbsp; 的默认 &nbsp; DLL &nbsp; 位置。有关基址的详细信息，请参阅 &nbsp; /BASE &nbsp; 选项说明。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 请记住，在生成 &nbsp; DLL &nbsp; 时使用 &nbsp; /DLL &nbsp; 链接器选项。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; /HEAP:reserve[,commit] &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; HEAPSIZE &nbsp; 所展示的功能与 &nbsp; /HEAP &nbsp; 链接器选项相同。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; NAME &nbsp; [application][BASE=address] &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该语句指定主输出文件的名称。另一种指定输出文件名的方法是使用 &nbsp; /out &nbsp; 链接器选项，而另一种设置基址的方法是使用 &nbsp; /BASE &nbsp; 链接器选项。如果两种方法都指定了，则 &nbsp; /OUT &nbsp; 重写 &nbsp; NAME。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 如果生成 &nbsp; DLL，NAME &nbsp; 将只影响 &nbsp; DLL &nbsp; 名。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; SECTIONS &nbsp; <br>&nbsp; definitions &nbsp; <br>&nbsp; &nbsp; <br>&nbsp;
SECTIONS &nbsp; 语句引入了一个由一个或多个 &nbsp;
definitions（关于项目输出文件各节的访问说明符）组成的节。每个定义必须在单独一行上。SECTIONS &nbsp;
关键字可以在第一个定义所在的同一行或前一行上。.def &nbsp; 文件可以包含一个或多个 &nbsp; SECTIONS &nbsp; 语句。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该 &nbsp; SECTIONS &nbsp; 语句为图像文件中的一节或多节设置属性，并可用于重写每种节类型的默认属性。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; definitions &nbsp; 的格式为： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; .section_name &nbsp; specifier &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 此处，.section_name &nbsp; 为程序图像中的节名，specifier &nbsp; 为下列一个或多个访问修饰符： &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; EXECUTE &nbsp; &nbsp; <br>&nbsp; READ &nbsp; &nbsp; <br>&nbsp; SHARED &nbsp; &nbsp; <br>&nbsp; WRITE &nbsp; &nbsp; <br>&nbsp; 用空格分开修饰符名。例如： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; SECTIONS &nbsp; <br>&nbsp; .rdata &nbsp; READ &nbsp; WRITE &nbsp; <br>&nbsp;
SECTIONS &nbsp; 标记 &nbsp; definitions &nbsp; 节列表的开始位置。每个定义必须在单独一行上。SECTIONS &nbsp;
关键字可以在第一个定义所在的同一行或前一行上。.def &nbsp; 文件可以包含一个或多个 &nbsp; SECTIONS &nbsp; 语句。支持 &nbsp; SEGMENTS
&nbsp; 关键字作为 &nbsp; SECTIONS &nbsp; 的同义词。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; Visual &nbsp; C++ &nbsp; 的早期版本支持： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; section &nbsp; [CLASS &nbsp; 'classname'] &nbsp; specifier &nbsp; <br>&nbsp; 出于兼容性考虑，支持 &nbsp; CLASS &nbsp; 关键字，但忽略了它。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 另一种指定节属性的方法是使用 &nbsp; /SECTION &nbsp; 选项。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; STACKSIZE &nbsp; reserve[,commit] &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该语句设置堆栈的大小（以字节为单位）。另一种设置堆栈的方法是使用堆栈分配 &nbsp; (/STACK) &nbsp; 选项。有关 &nbsp; reserve &nbsp; 和 &nbsp; commit &nbsp; 参数的详细信息，请参阅关于该选项的文档。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该选项对 &nbsp; DLL &nbsp; 无效。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; STUB:filename &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 当用于生成虚拟设备驱动程序 &nbsp; (VxD) &nbsp; 的模块定义文件时，STUB &nbsp; 允许指定包含将在 &nbsp; VxD &nbsp; 中使用的 &nbsp; IMAGE_DOS_HEADER &nbsp; <nobr oncontextmenu="return false;" onmousemove="kwM(4);" id="key4" onmouseover="kwE(event,4, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">结构</nobr>（在 &nbsp; WINNT.H &nbsp; 中定义）而不是默认头的文件名。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 另一种指定 &nbsp; filename &nbsp; 的方法是使用 &nbsp; /STUB &nbsp; 链接器选项。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 在模块定义文件中，STUB &nbsp; 仅在生成虚拟设备驱动程序 &nbsp; (VxD) &nbsp; 时有效。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; VERSION &nbsp; major[.minor] &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 该语句通知 &nbsp; LINK &nbsp; 将一个数字放到 &nbsp; .exe &nbsp; 文件或 &nbsp; DLL &nbsp; 的头中。major &nbsp; 和 &nbsp; minor &nbsp; 参数是从 &nbsp; 0 &nbsp; 到 &nbsp; 65,535 &nbsp; 的范围内的十进制数。默认值为 &nbsp; 0.0 &nbsp; 版。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 另一种指定版本号的方法是使用版本信息 &nbsp; (/VERSION) &nbsp; 选项。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; VXD &nbsp; filename &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 允许指定虚拟设备驱动程序 &nbsp; (VxD) &nbsp; 的名称。默认情况下，VxD &nbsp; 获取与第一个对象文件相同的名称。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 另一种指定虚拟设备驱动程序版本的方法是使用 &nbsp; /VXD &nbsp; 链接器选项，另一种命名输出文件的方法是使用 &nbsp; /out &nbsp; 选项。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 在模块定义文件中，VXD &nbsp; 仅在生成虚拟设备驱动程序 &nbsp; (VxD) &nbsp; 时有效。</p>
<p>二.MSDN中的名词解释<br>模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时，.def 文件最有用。由于存在可代替模块定义语句使用的<a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl02',this);" href="http://msdn2.microsoft.com/zh-cn/library/y0zzbyt4%28VS.80%29.aspx"><u><font color="#0000ff">链接器选项</font></u></a>，通常不需要 .def 文件。也可以将 <a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl03',this);" href="http://msdn2.microsoft.com/zh-cn/library/a90k134d%28VS.80%29.aspx"><u><font color="#0000ff">__declspec(dllexport)</font></u></a> 用作指定导出函数的手段。在链接器阶段可以使用 <a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl04',this);" href="http://msdn2.microsoft.com/zh-cn/library/34c30xs1%28VS.80%29.aspx"><u><font color="#0000ff">/DEF（指定模块定义文件）</font></u></a>链接器选项调用 .def 文件。<br>如果生成的 .exe 文件没有导出，使用 .def 文件将使输出文件较大并降低加载速度。<br>通俗解释:<br>在VC
++中，生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用
__declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的，你只需要把编译DLL时产生的.
lib提供给用户，它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如VB、delphi,以及.NET<br>用户使用的，那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换，如下面的函数： <br>&nbsp;&nbsp;&nbsp;&nbsp;__declspec(dllexport) int __stdcall IsWinNT() <br>&nbsp;&nbsp;&nbsp;&nbsp;会转换为IsWinNT@0，这样你在VB中必须这样声明： <br>&nbsp;&nbsp;&nbsp;&nbsp;Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long <br>&nbsp;&nbsp;&nbsp;&nbsp;@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换，就要使用.def文件方式。 <br>&nbsp;&nbsp;&nbsp;&nbsp;EXPORTS后面的数可以不给，系统会自动分配一个数。对于VB、PB、Delphi用户，通常使用按名称进行调用的方式，这个数关系不大，但是对于使用.lib链接的VC程序来说，不是按名称进行调用，而是按照这个数进行调用的，所以最好给出。<br>例子：我们用VC6.0制作一个dll,不使用.def文件，在头文件中这样写<br><br>#ifndef LIB_H<br>#define LIB_H<br>extern "C" int _declspec(dllexport)add(int x,int y);</p>
<p>#endif <br>如果是.def文件,可以这样<br>LIBRARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "xxx_dll"</p>
<p>EXPORTS<br>add&nbsp;&nbsp;PRIVAT</p>
<p style="margin: 5px; line-height: 150%;">
</p>
&nbsp;<font color="#000099"><strong>原文地址</strong></font>
<a href="http://wanderwarriorhsiao.blog.hexun.com/13081159_d.html" target="_blank">http://wanderwarriorhsiao.blog.hexun.com/13081159_d.html</a>
<br> <img src ="http://www.cppblog.com/shongbee2/aggbug/79314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-09 09:17 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/09/79314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>