??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产色蜜蜜麻豆,亚洲&http://www.shnenglu.com/shongbee2/category/10154.html杂七杂八zh-cnWed, 29 Apr 2009 05:52:26 GMTWed, 29 Apr 2009 05:52:26 GMT60WCHAR我不再惧怕了http://www.shnenglu.com/shongbee2/archive/2009/04/28/81349.htmlshongbee2shongbee2Tue, 28 Apr 2009 12:09:00 GMThttp://www.shnenglu.com/shongbee2/archive/2009/04/28/81349.htmlhttp://www.shnenglu.com/shongbee2/comments/81349.htmlhttp://www.shnenglu.com/shongbee2/archive/2009/04/28/81349.html#Feedback11http://www.shnenglu.com/shongbee2/comments/commentRss/81349.htmlhttp://www.shnenglu.com/shongbee2/services/trackbacks/81349.html我找到的资料Q?br>http://hi.baidu.com/shongbee2/blog/item/207925546b6cdd5fd10906e0.html
http://hi.baidu.com/shongbee2/blog/item/d4a057511e9539878c5430cb.html
看了之后我才发现原来有wcsXXX的函C门处理宽字节的,是strXXX一样好ѝ呵呵,我不再惧怕了Q就试着自己写了一下,q是学了蛮多东西的:
1.有wcsXXX的函数和strXXX的函数对应处理宽字节Qwcslen是求长度的Qwcscmp是比较两个字符串的?br>2.输出也有相关的操作,wprintf(L”%s%s”);q样的操作,Ҏ件也可以用fwprintf函数来输出。不q我发现貌似cout << wcharQ不成功。也发现了一个问题,是我输?#8221;相等”q样一个字W串的时候,发现居然输出不正,无论是控制台和文仉有错误。可见,q个q是有点问题的。输出其他的例如”12345”{都是正常的。哎Q这个函数ƈ不可靠啊?br>3.宽字节和普通串的{换问题,学了两个函数Q一个是Q?br>wcstombs(char* strDes, const wchar*, size_t nMax);q个函数的作用是把wchar转换为char?br>char* strDes Z存{换后的普通字W串Qwchar* 要被转换的宽字符丌Ӏ{换的最大长度。这里的长度是{换的个数Q而不是字节长度?br>mbstowcs() 是一个相反的q程了,参数׃说了?br>
另一套{换的函数是:
int WideCharToMultiByte(
  UINT CodePage,
  DWORD dwFlags,
  LPCWSTR lpWideCharStr,
  int cchWideChar,
  LPSTR lpMultiByteStr,
  int cbMultiByte,
  LPCSTR lpDefaultChar,    
  LPBOOL lpUsedDefaultChar
);
他的参数很多Q上面的q接有介l,q里׃怎么l说了?br>W一个是~码的方式,我一般用CP_ACP。第二个是{换标志,MSDN上说什么都不设|更快,然后我就什么都不管了就用NULL了。具体作用不知道Q等遇到了再学。第三个参数是被{换的字符ԌW四个参数是该字W串的长度,-1表示自动长度,如果是手动给出,一定要把最后的l结W长度也上。我觉得q是-1来的实际。第五个参数是保存转换串的指针Q第六个参数是保存串的长度Q这里是单位字符的个数。如果{换的时候没有终l符Q那么结果也没有l结W,要注意下。最后两个参数就是默认的填充字符和是否用了默认填充字符Q我一般就用NULL代替?br>
普通串转宽字节也是cM?br>q里有几个注意的Q一定要保证I间_。还有就是那个长度是单位字符个数Q而不是字节数Q在转换Ӟ推荐被{换的字符串长度设|ؓ-1,因ؓq样他会自动出l结W结束。返回g是{换的单位字符个数。例?#8221;相等”有普通串转换为宽字节Ԍq回l果?Q(有终l符Q,而反q来是5。如果返回时0 说明转换p|?br>
心得Q虽然WideCharToMultiByte的参数要多,感觉用的没有wcstombs爽,可是他的准确好高一些,要{换的话,q用用WideCharToMultiByte比较合适,q有是虽然有一套wcsXXX的库函数Q可惜输是出现问题的。如果全都用宽字节,那没有关pwcsxxx的函数还是蛮好用的。还有一个疑惑我明明查字典multi是多的意思也是说multibyte是多字节Q我的中文版VS2005配置里面也是说的多字节。搞不懂Z么要用宽字节呢?可能是多字节~码不好用吧。呵c?废话也说完了Q奉上源代码Q?br>
#include <iostream>
#include 
<fstream>
#include 
<windows.h>
using namespace std;

int main()
{
    FILE
* fp ;
    WCHAR wchar[
5= L"相等相等";        //定义一个宽字节的变量,初始?相等"
    fp = fopen("1.txt""w+");        //打开文gU奥?/span>
    fwprintf(fp, L"%s\n", wchar);    //输出到文?/span>
    fclose(fp);                        //关闭文g
    WCHAR wc2[5];                    //定义W二个宽字节变量
    
    
//wc开始的有很多宽字节的操作。都和str相对应?/span>
    wcscpy(wc2, wchar);                //复制?/span>
    int n = wcscmp(wc2, wchar);        //比较
    if (n == 0)
    {
        wprintf(L
"相等\n");            //q里是否注意到没有wprintf有问题的?/span>
    }

    
char str[10];                    //定义char字符?/span>
    n = wcstombs(str, wc2, 9);        //宽字节{换ؓmuiltychar
    printf("%s\n", str);            //输出l果

    
for (int i = 0; i < 5++i)
    {
        wc2[i] 
= L'1' + i;
    }
    wc2[
4= 0;

    n 
= wcstombs(str, wc2, 9);        //宽字节{换ؓmuiltychar
    printf("%s\n", str);            //输出l果
    
//另外的方式{?/span>
    n = WideCharToMultiByte(CP_ACP, NULL, wchar, wcslen(wchar) + 1, str, 1000);
    printf(
"%s\n", str);
    
char str2[10= "加一";
    WCHAR wc3[
10];
    n 
= MultiByteToWideChar(CP_ACP, NULL, str2, strlen(str2) + 1, wc3, 10);    //char到宽字节?/span>

    system(
"pause");
    
return 0;
}
不要脸的再次攑օ_֍区,因ؓ我觉得他困扰我太久了。呵?br>

shongbee2 2009-04-28 20:09 发表评论
]]>
d注册表信?/title><link>http://www.shnenglu.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.shnenglu.com/shongbee2/archive/2009/04/09/79338.html</guid><wfw:comment>http://www.shnenglu.com/shongbee2/comments/79338.html</wfw:comment><comments>http://www.shnenglu.com/shongbee2/archive/2009/04/09/79338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shongbee2/comments/commentRss/79338.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shongbee2/services/trackbacks/79338.html</trackback:ping><description><![CDATA[今天学了怎么插入注册表键和删除注册表键。也没有什么特别的思\Q主要是调用windows自带的函数来完成操作。感惛_是看MSND一定要仔细。看书也要仔l。哈哈?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 </span><span style="color: #000000;"><</span><span style="color: #000000;">iostream</span><span style="color: #000000;">></span><span style="color: #000000;"><br>#include </span><span style="color: #000000;"><</span><span style="color: #000000;">Windows.h</span><span style="color: #000000;">></span><span style="color: #000000;"><br>#include </span><span style="color: #000000;"><</span><span style="color: #000000;">assert.h</span><span style="color: #000000;">></span><span style="color: #000000;"><br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">创徏一个注册表的键倹{chKeyZ键, chValue为键的\?值插入的默认的名?/span><span style="color: #008000;"><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> SetRegKey( </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> HKEY</span><span style="color: #000000;">&</span><span style="color: #000000;"> hKeyRoot, </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;"> chKey, </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;"> chValue)<br>{<br>    assert(chKey);<br><br>    HKEY hKey;                                </span><span style="color: #008000;">//</span><span style="color: #008000;">要插入的hkey<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">创徏或打开一个要插入的hkey</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> lRes</span><span style="color: #000000;">=</span><span style="color: #000000;"> ::RegCreateKeyExA(hKeyRoot,    </span><span style="color: #008000;">//</span><span style="color: #008000;">插入的主?/span><span style="color: #008000;"><br></span><span style="color: #000000;">        chKey,                                </span><span style="color: #008000;">//</span><span style="color: #008000;">要创建的键名</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #000000;">0</span><span style="color: #000000;">,                                    </span><span style="color: #008000;">//</span><span style="color: #008000;">保留?/span><span style="color: #008000;"><br></span><span style="color: #000000;">        NULL,                        </span><span style="color: #008000;">//</span><span style="color: #008000;">lpClass貌似很强大,但是我知道有什么用</span><span style="color: #008000;"><br></span><span style="color: #000000;">        REG_OPTION_NON_VOLATILE,    </span><span style="color: #008000;">//</span><span style="color: #008000;">操作属性设|ؓ不常改变</span><span style="color: #008000;"><br></span><span style="color: #000000;">        KEY_ALL_ACCESS,                </span><span style="color: #008000;">//</span><span style="color: #008000;">权限讄为都可以?/span><span style="color: #008000;"><br></span><span style="color: #000000;">        NULL,                        </span><span style="color: #008000;">//</span><span style="color: #008000;">安全属性ؓ默认</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #000000;">&</span><span style="color: #000000;">hKey,                        </span><span style="color: #008000;">//</span><span style="color: #008000;">保存创徏好的key</span><span style="color: #008000;"><br></span><span style="color: #000000;">        NULL                        </span><span style="color: #008000;">//</span><span style="color: #008000;">得到q回cd是打开q是创徏</span><span style="color: #008000;"><br></span><span style="color: #000000;">        );<br><br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (lRes </span><span style="color: #000000;">!=</span><span style="color: #000000;"> ERROR_SUCCESS)        </span><span style="color: #008000;">//</span><span style="color: #008000;">如果不成功返回false;</span><span style="color: #008000;"><br></span><span style="color: #000000;">    {<br>        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>    }<br><br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (chValue </span><span style="color: #000000;">!=</span><span style="color: #000000;"> NULL)    </span><span style="color: #008000;">//</span><span style="color: #008000;">如果要插入默认键?/span><span style="color: #008000;"><br></span><span style="color: #000000;">    {<br>        ::RegSetValueExA(hKey, NULL, </span><span style="color: #000000;">0</span><span style="color: #000000;">, REG_SZ,(</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">*</span><span style="color: #000000;">)chValue, strlen(chValue)</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>    }<br><br>    RegCloseKey(hKey);     </span><span style="color: #008000;">//</span><span style="color: #008000;">关闭key</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </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为父节点的键| chKey为键?/span><span style="color: #008000;"><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> DeleteKey(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> HKEY</span><span style="color: #000000;">&</span><span style="color: #000000;"> hKeyPar, </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;"> chKey)<br>{<br>    HKEY hKeySub;        </span><span style="color: #008000;">//</span><span style="color: #008000;">要清除的hkey<br>    <br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">打开清除的hkey</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> lRes </span><span style="color: #000000;">=</span><span style="color: #000000;"> ::RegOpenKeyExA(hKeyPar, chKey, </span><span style="color: #000000;">0</span><span style="color: #000000;">, KEY_ALL_ACCESS, </span><span style="color: #000000;">&</span><span style="color: #000000;">hKeySub);    <br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (lRes </span><span style="color: #000000;">!=</span><span style="color: #000000;"> ERROR_SUCCESS)    </span><span style="color: #008000;">//</span><span style="color: #008000;">如果没有Q返回false</span><span style="color: #008000;"><br></span><span style="color: #000000;">    {<br>        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>    }<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">遍历key的所有子节点Qƈ一q清?/span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> chBuffer[MAX_PATH];<br>    unsigned </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> nSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> MAX_PATH;<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">遍历子节点,清除Q这里注意nIndex一直ؓ0Q因为每ơ有删除W?个子键,所以用0的烦引就<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">能遍历删除所有的子键。如果是查询的话Q就必须要改变nIndex来遍历。还有就是注意nSize<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">他是一个_in_out的参敎ͼ内部会改变他Q所以每ơ都要把他设|ؓ原来MAX_PATH</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (::RegEnumKeyExA(hKeySub, </span><span style="color: #000000;">0</span><span style="color: #000000;">, chBuffer, </span><span style="color: #000000;">&</span><span style="color: #000000;">nSize, </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;">) </span><span style="color: #000000;">==</span><span style="color: #000000;"> ERROR_SUCCESS)<br>    {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">如果扑ֈ子键Q就删除子键</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">DeleteKey(hKeySub, chBuffer))<br>        {<br>            ::RegCloseKey(hKeySub);<br>            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>        }<br><br>        nSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> MAX_PATH;<br>    }<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">需要先关闭该徏Q才能删除它?/span><span style="color: #008000;"><br></span><span style="color: #000000;">    RegCloseKey(hKeySub);<br>    <br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">调用pȝ函数删除该键</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (::RegDeleteKeyA(hKeyPar, chKey) </span><span style="color: #000000;">!=</span><span style="color: #000000;"> ERROR_SUCCESS)<br>    {<br>        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>    }<br><br>    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </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;"> main()<br>{<br>    SetRegKey(HKEY_CLASSES_ROOT, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    SetRegKey(HKEY_CLASSES_ROOT, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey\\cV1\\CC2</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    SetRegKey(HKEY_CLASSES_ROOT, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey\\cV1\\CC3</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    DeleteKey(HKEY_CLASSES_ROOT, </span><span style="color: #000000;">"</span><span style="color: #000000;">MyTestRegInserKey</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    system(</span><span style="color: #000000;">"</span><span style="color: #000000;">pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div> <br><br><img src ="http://www.shnenglu.com/shongbee2/aggbug/79338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-09 13:15 <a href="http://www.shnenglu.com/shongbee2/archive/2009/04/09/79338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】库文g静态连接时所需的def文g格式解析http://www.shnenglu.com/shongbee2/archive/2009/04/09/79314.htmlshongbee2shongbee2Thu, 09 Apr 2009 01:17:00 GMThttp://www.shnenglu.com/shongbee2/archive/2009/04/09/79314.htmlhttp://www.shnenglu.com/shongbee2/comments/79314.htmlhttp://www.shnenglu.com/shongbee2/archive/2009/04/09/79314.html#Feedback0http://www.shnenglu.com/shongbee2/comments/commentRss/79314.htmlhttp://www.shnenglu.com/shongbee2/services/trackbacks/79314.html
模块定义   (.def)   文g  
   
  模块定义   (.def)   文g为链接器提供有关被链接程序的导出、属性及其他斚w?

信息。生?  DLL   Ӟ.def   文g最有用。由于存在可代替模块定义语句使用的链接器选项Q通常不需?  .def   文g。也可以__declspec(dllexport)   用作指定导出函数的手Dc? 
   
  在链接器阶段可以使用   /DEFQ指定模块定义文Ӟ链接器选项调用   .def   文g? 
   
  如果生成?  .exe   文g没有导出Q?  .def   文g输出文g较大q低加载速度? 
   
  模块定义语句的规? 
   
  下列语法规则适用?  .def   文g中的所有语句。其他适用于特定语句的规则与各语句一起加以说明?   
   
  语句、属性关键字和用h定的标识W区分大写?   
  包含I格或分?  (;)   的长文g名必ȝ引号   (")   引v?   
  使用一个或多个I格、制表符或换行符Q将语句关键字同其参数分开和将各语句分开。指定参数的冒号   (:)   或等?  (=)   两旁有零个或多个I格、制表符或换行符?   
  如果使用   NAME   ?  LIBRARY   语句Q则q些语句必须位于所有其他语句之前?   
  ?  .def   文g中,SECTIONS   ?  EXPORTS   语句可以出现多次。每个语句都可以采用多个规范Q各规范间必ȝ一个或多个I格、制表符或换行符分开。语句关键字必须在第一个规范的前面出现一ơ,q且? 以在每个附加规范的前面重复?   
  许多语句都具有等效的   LINK   命o行选项。有兛_他详l信息,请参阅相应的   LINK   选项说明?   
  .def   文g中的注释由每个注释行开?/nobr>处的分号   (;)   指定。注释不能与语句׃n一行,但可以在多行语句的规范间出现。(SECTIONS   ?  EXPORTS   为多行语句。)    
  以十q制或十六进制ؓ基础指定数值参数?   
  如果字符串参C保留字匹配,则必ȝ双引?  (")   字W串参数引v? 
   
  DESCRIPTION   "text"  
   
  该语句将字符串写?  .rdata   节。将指定?  text   用单引号或双引号Q?   ?  "Q引赗若要在字符串中使用引号Q单引号或双引号Q,L其他cd的标记括住字W串? 
   
  在模块定义文件中QDESCRIPTION   仅在生成虚拟讑֤驱动E序   (VxD)   时有效? 
   
  EXETYPE:dynamic   |   dev386  
   
  在模块定义文件中QEXETYPE   仅在生成虚拟讑֤驱动E序   (VxD)   时有效。如果生成虚拟设备驱动程序时在模块定义文件中没有指定   EXETYPEQƈ且如果没有指?  /EXETYPE   链接器选项Q则静态加?  (dev386)   生效? 
   
  EXPORTS  
  definitions  
   
  EXPORTS   语句引入了一个由一个或多个   definitionsQ导出的函数?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">数据
Q组成的节。每个定义必d单独一行上。EXPORTS   关键字可以在W一个定义所在的同一行上或在前一行上?def   文g可以包含一个或多个   EXPORTS   语句? 
   
  导出   definitions   的语法ؓQ? 
   
  entryname[=internalname]   [@ordinal   [NONAME]]   [PRIVATE]   [DATA]  
  entryname   是要导出的函数名或变量名。这是必选项。如果导出的名称?  DLL   中的名称不同Q则通过   internalname   指定   DLL   中导出的名称。例如,如果   DLL   导出函数   func1()Q要它用作   func2()Q则应指定:  
   
  EXPORTS  
  func2=func1  
  @ordinal   允许指定是序可不是函数名进?  DLL   的导。这有助于最化   DLL   的大?LIB   文g包含序号与函数之间的映,q您得以像通常在?  DLL   ?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">目中那样用函数名? 
   
  可选的   NONAME   关键字允许只按序号导出,q减结?  DLL   中导的大。但是,如果要在   DLL   上?  GetProcAddressQ则必须知道序号Q因为名U将无效? 
   
  可选的   PRIVATE   关键字禁止将   entryname   攑ֈ?  LINK   生成的导入库中。它对同h?  LINK   生成的图像中的导出无效? 
   
  可选的   DATA   关键字指定导出的是数据,而不是代码。例如,可以导出数据变量Q如下所C:  
   
  EXPORTS  
  i   DATA  
  当对同一导出使用   PRIVATE   ?  DATA   ӞPRIVATE   必须位于   DATA   的前面? 
   
  有三U导出定义的ҎQ按照徏议的使用序依次为:    
   
  源代码中?  __declspec(dllexport)   关键?   
  .def   文g中的   EXPORTS   语句    
  LINK   命o中的   /EXPORT   规范    
  所有这三种Ҏ可以用在同一个程序中。LINK   在生成包含导出的E序时还创徏导入库,除非生成中用了   .exp   文g? 
   
  以下?  EXPORTS   节的CZQ? 
   
  EXPORTS  
        DllCanUnloadNow             @1           PRIVATE       DATA  
        DllWindowName   =   Name                 DATA  
        DllGetClassObject         @4   NONAME       PRIVATE  
        DllRegisterServer         @7  
        DllUnregisterServer  
  注意Q?  .def   文g?  DLL   中导出变量时Q不需要在变量上指?  __declspec(dllexport)。但是,在Q何?  DLL   的文件中Q仍必须在数据声明上使用   __declspec(dllimport)? 
   
  LIBRARY   [library][BASE=address]  
   
  该语句通知   LINK   创徏   DLL。LINK   同时q创建导入库Q除非生成中使用?  .exp   文g? 
   
  library   参数指定   DLL   的名U。也可以使用   /out   链接器选项指定   DLL   输出名? 
   
  BASE=address   参数讄操作pȝ用来加蝲   DLL   的基址。该参数重写   0x10000000   的默?  DLL   位置。有兛_址的详l信息,请参?  /BASE   选项说明?   
   
  误住,在生?  DLL   时?  /DLL   链接器选项? 
   
  /HEAP:reserve[,commit]  
   
  HEAPSIZE   所展示的功能与   /HEAP   链接器选项相同? 
   
  NAME   [application][BASE=address]  
   
  该语句指定主输出文g的名U。另一U指定输出文件名的方法是使用   /out   链接器选项Q而另一U设|基址的方法是使用   /BASE   链接器选项。如果两U方法都指定了,?  /OUT   重写   NAME?   
   
  如果生成   DLLQNAME   只影响   DLL   名? 
   
  SECTIONS  
  definitions  
   
  SECTIONS   语句引入了一个由一个或多个   definitionsQ关于项目输出文件各节的讉K说明W)l成的节。每个定义必d单独一行上。SECTIONS   关键字可以在W一个定义所在的同一行或前一行上?def   文g可以包含一个或多个   SECTIONS   语句? 
   
  ?  SECTIONS   语句为图像文件中的一节或多节讄属性,q可用于重写每种节类型的默认属性? 
   
  definitions   的格式ؓQ? 
   
  .section_name   specifier  
   
  此处Q?section_name   为程序图像中的节名,specifier   Z列一个或多个讉K修饰W:    
   
  EXECUTE    
  READ    
  SHARED    
  WRITE    
  用空格分开修饰W名。例如:  
   
  SECTIONS  
  .rdata   READ   WRITE  
  SECTIONS   标记   definitions   节列表的开始位|。每个定义必d单独一行上。SECTIONS   关键字可以在W一个定义所在的同一行或前一行上?def   文g可以包含一个或多个   SECTIONS   语句。支?  SEGMENTS   关键字作?  SECTIONS   的同义词? 
   
  Visual   C++   的早期版本支持:  
   
  section   [CLASS   'classname']   specifier  
  Z兼容性考虑Q支?  CLASS   关键字,但忽略了它? 
   
  另一U指定节属性的Ҏ是?  /SECTION   选项? 
   
  STACKSIZE   reserve[,commit]  
   
  该语句设|堆栈的大小Q以字节为单位)。另一U设|堆栈的Ҏ是用堆栈分?  (/STACK)   选项。有?  reserve   ?  commit   参数的详l信息,请参阅关于该选项的文?   
   
  该选项?  DLL   无效? 
   
  STUB:filename  
   
  当用于生成虚拟设备驱动程?  (VxD)   的模块定义文件时QSTUB   允许指定包含在   VxD   中用的   IMAGE_DOS_HEADER   l构Q在   WINNT.H   中定义)而不是默认头的文件名? 
   
  另一U指?  filename   的方法是使用   /STUB   链接器选项? 
   
  在模块定义文件中QSTUB   仅在生成虚拟讑֤驱动E序   (VxD)   时有效? 
   
  VERSION   major[.minor]  
   
  该语句通知   LINK   一个数字放?  .exe   文g?  DLL   的头中。major   ?  minor   参数是从   0   ?  65,535   的范围内的十q制数。默认gؓ   0.0   版? 
   
  另一U指定版本号的方法是使用版本信息   (/VERSION)   选项?   
   
  VXD   filename  
   
  允许指定虚拟讑֤驱动E序   (VxD)   的名U。默认情况下QVxD   获取与第一个对象文件相同的名称? 
   
  另一U指定虚拟设备驱动程序版本的Ҏ是?  /VXD   链接器选项Q另一U命名输出文件的Ҏ是?  /out   选项? 
   
  在模块定义文件中QVXD   仅在生成虚拟讑֤驱动E序   (VxD)   时有效?/p>

?MSDN中的名词解释
模块定义 (.def) 文g为链接器提供有关被链接程序的导出、属性及其他斚w的信息。生?DLL Ӟ.def 文g最有用。由于存在可代替模块定义语句使用?a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl02',this);" >链接器选项Q通常不需?.def 文g。也可以?__declspec(dllexport) 用作指定导出函数的手Dc在链接器阶D可以?/DEFQ指定模块定义文Ӟ链接器选项调用 .def 文g?br>如果生成?.exe 文g没有导出Q?.def 文g输出文g较大q低加载速度?br>通俗解释:
在VC ++中,生成DLL可以不?def文g。只需要在VC++的函数定义前要加__declspec(dllexport)修饰可以了。但是? __declspec(dllexport)和?def文g是有区别的。如果DLL是提供给VC++用户使用的,你只需要把~译DLL时生的. lib提供l用P它可以很L地调用你的DLL。但是如果你的DLL是供其他E序如VB、delphi,以及.NET
用户使用的,那么会生一个小ȝ。因为VC++对于__declspec(dllexport)声明的函Cq行名称转换Q如下面的函敎ͼ
    __declspec(dllexport) int __stdcall IsWinNT()
    会{换ؓIsWinNT@0Q这样你在VB中必这样声明:
    Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
    @的后面的数由于参数类型不同而可能不同。这昄不太方便。所以如果要想避免这U{换,p使用.def文g方式?
    EXPORTS后面的数可以不给Q系l会自动分配一个数。对于VB、PB、Delphi用户Q通常使用按名U进行调用的方式Q这个数关系不大Q但是对于?lib链接的VCE序来说Q不是按名称q行调用Q而是按照q个数进行调用的Q所以最好给出?br>例子Q我们用VC6.0制作一个dll,不?def文gQ在头文件中q样?br>
#ifndef LIB_H
#define LIB_H
extern "C" int _declspec(dllexport)add(int x,int y);

#endif
如果?def文g,可以q样
LIBRARY      "xxx_dll"

EXPORTS
add  PRIVAT

 原文地址 http://wanderwarriorhsiao.blog.hexun.com/13081159_d.html


shongbee2 2009-04-09 09:17 发表评论
]]>
þùƵ| ݺݺɫۺϾþð| ҹƷþþþþžŵӰ| þþþùƷ| þþù99þùһ| 99þ뾫Ʒϵ | ھƷþ޻| 97þþƷһ| һۺϾþ| þ99ù龫Ʒ66| ɫݺȷӰþ| þݺҹҹavapp | þùƷһ| ƷþþþþþþӰԺ| ˾þü91| 2021ھþþƷ| Ʒ99þþþþö| ˾þô߽avӰԺ| Ʒŷһþþ | þþƷ2020| ҹƷþþþþž| þֻоƷ18| ҹAVëƬþ| ۺϾþþþۺ| þþоƷĻ| www.þ.com| avԾþþþa| þ°Ҳȥ| þòӰ| þùƷһ| Avþ| þҹҹݺ| ƷþþþþþþþӰԺ| þþþ99ƷƬ | 㽶þ99| 㽶99þùۺϾƷլ| Ʒ99þþþ | þ޹ӰԺվ| ŷ㽶þۺվ| www.þ| þۺɫ99žak|