一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

函數(shù)調(diào)用規(guī)范__cdecl和__stdcall的區(qū)別

 fandy 2008-12-30

原創(chuàng) 函數(shù)調(diào)用規(guī)范__cdecl和__stdcall的區(qū)別收藏

新一篇: C調(diào)用匯編函數(shù) | 舊一篇: vc中的release和debug版本的區(qū)別

 

__cdecl

 

 

__stdcall

 

C  C++ 程序的缺省調(diào)用規(guī)范

 

為了使用這種調(diào)用規(guī)范,需要你明確的加上 __stdcall (或 WINAPI )文字。即 return-type __stdcall function-name[(argument-list)]

 

 

調(diào)用函數(shù) (Callee) 返回,由調(diào)用方 (Caller) 調(diào)整堆棧。

 

1. 調(diào)用方的函數(shù)調(diào)用

                                         

2. 被調(diào)用函數(shù)的執(zhí)行

 

3. 被調(diào)用函數(shù)的結(jié)果返回

 

4. 調(diào)用方清除調(diào)整堆棧

                                                                

 

調(diào)用函數(shù) (Callee) 返回,由調(diào)用函數(shù) (Callee) 調(diào)整堆棧。圖示:

 

1. 調(diào)用方的函數(shù)調(diào)用

 

2. 被調(diào)用函數(shù)的執(zhí)行

 

3. 被調(diào)用函數(shù)清除調(diào)整堆棧

 

4. 被調(diào)用函數(shù)的結(jié)果返回                                                          

 

因?yàn)槊總€調(diào)用的地方都需要生成一段調(diào)整堆棧的代碼,所以最后生成的文件較大。

 

 

因?yàn)檎{(diào)整堆棧的代碼只存在在一個地方(被調(diào)用函數(shù)的代碼內(nèi)),所以最后生成的文件較小。

 

函數(shù)的參數(shù)個數(shù)可變(就像 printf 函數(shù)一樣),因?yàn)橹挥姓{(diào)用者才知道它傳給被調(diào)用函數(shù)幾個參數(shù),才能在調(diào)用結(jié)束時適當(dāng)?shù)卣{(diào)整堆棧。

 

 

函數(shù)的參數(shù)個數(shù)不能是可變的。

 

對于定義在 C 程序文件中的輸出函數(shù),函數(shù)名會保持原樣,不會被修飾。

對于定義在 C++ 程序文件中的輸出函數(shù),函數(shù)名會被修飾, MSDN  Underscore character (_) is prefixed to names 我實(shí)際測試( VC4  VC6 )下來發(fā)現(xiàn)好像不是那么簡單。

可通過在前面加上 extern C 以去除函數(shù)名修飾。也可通過 .def 文件去除函數(shù)名修飾。

 

不論是 C 程序文件中的輸出函數(shù)還是 C++ 程序文件中的輸出函數(shù),函數(shù)名都會被修飾。

對于定義在 C 程序文件中的輸出函數(shù), An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list.

對于定義在 C++ 程序文件中的輸出函數(shù),好像更復(fù)雜,和 __cdecl 的情況類似。

好像只能通過 .def 文件去除函數(shù)名修飾。

 

 

_beginthread 需要 __cdecl 的線程函數(shù)地址

 

 

_beginthreadex  CreateThread 需要 __stdcall 的線程函數(shù)地址

 

 

兩者的參數(shù)傳遞順序都是從右向左。

為了讓 VB 可以調(diào)用,需要用 __stdcall 調(diào)用規(guī)范來定義 C/C++ 函數(shù)。請參看Microsoft KB153586 文章:How To Call C Functions That Use the _cdecl Calling Convention。

當(dāng)你 LoadLibrary 一個 DLL 文件后, 把 GetProcAddress 取得的函數(shù)地址傳給上面三個線程生成函數(shù)時,請務(wù)必確認(rèn)實(shí)際定義在 DLL 文件的輸出函數(shù)符合調(diào)用規(guī)范要求。否則,編譯成 Release 版后運(yùn)行,可能會破壞堆棧,程序行為不可預(yù)測。

VC 中的相關(guān)編譯開關(guān):/Gd /Gr /Gz。另外,VC6中新增加的 /GZ 編譯開關(guān)可以幫你檢查堆棧問題。  

發(fā)表于 @ 2008年12月12日 18:11:00|評論(0)|編輯|收藏

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    三级高清有码在线观看| 成人免费在线视频大香蕉| 色婷婷久久五月中文字幕| 国产一区二区三区免费福利| 欧美午夜国产在线观看| 最近中文字幕高清中文字幕无| 麻豆一区二区三区在线免费| 日本 一区二区 在线| 91精品视频全国免费| 色综合久久中文综合网| 东北女人的逼操的舒服吗| 99视频精品免费视频| 色婷婷国产精品视频一区二区保健| 中文字幕亚洲精品人妻| 成人国产一区二区三区精品麻豆 | 五月综合激情婷婷丁香| 一个人的久久精彩视频| 精品国产品国语在线不卡| 日本不卡在线视频中文国产| 欧美一级内射一色桃子| 欧美午夜性刺激在线观看| 国产中文字幕一二三区| 少妇福利视频一区二区| 欧美大黄片在线免费观看| 欧美午夜不卡在线观看| 欧美三级不卡在线观线看| 国产欧美高清精品一区| 国产精品久久男人的天堂| 午夜精品久久久99热连载| 夫妻性生活真人动作视频 | 亚洲成人精品免费在线观看| 国产精品日本女优在线观看| 欧美日韩综合在线精品| 国产视频福利一区二区| 亚洲一区二区欧美在线| 日韩人妻av中文字幕| 亚洲成人精品免费在线观看| 国产视频在线一区二区| 国产成人精品一区二区三区| 粉嫩内射av一区二区| 欧美日韩中国性生活视频|