• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Code Knight

            Programming is so cool
            隨筆 - 52, 文章 - 0, 評(píng)論 - 14, 引用 - 0
            數(shù)據(jù)加載中……

            [轉(zhuǎn)]__cdecl和__stdcall的區(qū)別

            看到的不錯(cuò)的學(xué)習(xí)文章,轉(zhuǎn)帖過來方便自己學(xué)習(xí),無意侵犯作者。只當(dāng)學(xué)習(xí)用

             

            __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)槊總€(gè)調(diào)用的地方都需要生成一段調(diào)整堆棧的代碼,所以最后生成的文件較大。

             

             

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

             

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

             

             

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

             

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

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

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

             

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

            對(duì)于定義在 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.

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

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

             

             

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

             

             

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

             

             

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

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

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

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

            我也是初學(xué)者,若有不對(duì)的地方、可以補(bǔ)充的地方,請(qǐng)指教。謝謝。

            posted on 2010-03-07 18:48 Code Knight 閱讀(1403) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 跬步千里

            国产精品99久久久精品无码 | 91久久九九无码成人网站| 国产精品久久久久天天影视| 国产精品久久99| 久久久久久亚洲精品无码| 久久综合偷偷噜噜噜色| .精品久久久麻豆国产精品| 久久久久无码中| 99久久er这里只有精品18| 国内精品久久久久久久coent| 亚洲人成无码www久久久| 久久久综合九色合综国产| 亚洲伊人久久综合影院| 久久青青草原精品影院| 亚洲中文字幕久久精品无码APP | 国产精品久久久久久久| 久久91精品国产91久| 99久久亚洲综合精品网站| 综合网日日天干夜夜久久| 国产精品免费久久久久电影网| 日韩AV无码久久一区二区 | 精品久久国产一区二区三区香蕉 | 无码人妻精品一区二区三区久久久 | 色噜噜狠狠先锋影音久久| 7777精品久久久大香线蕉 | 一级做a爰片久久毛片16| 久久久无码精品亚洲日韩蜜臀浪潮| 欧美成a人片免费看久久| 久久久久久狠狠丁香| 精品国际久久久久999波多野| 狠狠色婷婷久久综合频道日韩 | 久久精品国产99国产精偷| 性欧美丰满熟妇XXXX性久久久| 一本久久综合亚洲鲁鲁五月天| 国产高清国内精品福利99久久| 国产精品一久久香蕉国产线看| 久久婷婷激情综合色综合俺也去| 亚洲狠狠婷婷综合久久蜜芽 | 久久亚洲熟女cc98cm| 亚洲国产香蕉人人爽成AV片久久| 久久精品国产一区二区三区|