作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題[問題] __stdcall 和 __cdecl的問題
時間Mon Apr 23 13:58:07 2012
大家好
刻意google這兩者的差別
都有做簡短的介紹
除了name mangling會不一樣
好像是處理堆疊的方式會因為這兩個 "修飾字" 而不一樣
但這網頁特別有說一句話
http://www.wretch.cc/blog/zevoid/216921
"不論透過動態或靜態連結至第三方的函式庫,一定要弄清楚呼叫協定為何,不然執行時
期會發生堆疊被打亂的嚴重情形。"
乍聽之下好像有道理
但我想一想
假如我做一個dll
declaration 在.h 有冠上__stdcall
對方引用我的dll
若他是implicit 方式 , 勢必需要我的.h檔案
那這樣為啥還會有她說的那句話問題產生?
我想到唯一可能的方式 是...他刻意修改我的.h檔案
把__stdcall拿掉 改成__cdecl
但這樣 name mangling後...應該會變成unresolved external symbol...
所以我想不到他這句話會有甚麼情況會產生這問題?
若是explicit link...
我用GetProcAddress 也不用 (更是不知道) 對方到底是__stdcall還是__cdecl...
這樣會出問題嗎?
這邊也不是很明白
提出來請教各位
謝謝
ps. 我故意在VC打 void __stdcall Foo(); 下一行打 void __cdecl Foo();
他會寫說我redefine了..
這是VC compiler刻意擋掉嗎? 照理講不是Decorate後 會不一樣 怎會產生這compile
error@@?
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.147.15.66
→ legnaleurc:當你要宣告一個 function pointer 時就要明確指定 04/23 15:29
→ legnaleurc:e.g.: void (__stdcall *f)(int)=GetProcAddress(...) 04/23 15:30
推 purpose:你不是有看程式設計師的自我修養,上面第十章比這網頁 04/23 16:44
→ purpose:寫得更詳細、完整,光看片面的資訊不太有用 04/23 16:45
→ QQ29:請問1F 我之前並沒有特別加上__stdcall 也 可以成功呼叫 04/24 22:36
→ QQ29:我不加的話預設是_cdecl吧? win32 API應該都是__stdcall吧 04/24 22:38
→ QQ29:為啥我沒遇到問題呢? 04/24 22:38
→ legnaleurc:我沒加是直接當掉 ... 04/24 23:51
→ QQ29:請問是load win32 API 某dll裡面的API嗎? 04/25 00:10
→ QQ29:我確實沒加 因為之前根本不懂這個orz~但可以work.. 04/25 00:11
→ legnaleurc:之前是 load dwmapi.dll 04/25 02:36