場景
- 最近看了
《COM本質論》
里關于如何設計基于抽象基類作為二進制接口,把編譯器和鏈接器的實現隱藏在這個二進制接口中,從而使用該DLL
時不需要重新編譯。在編譯出C
接口時,發現接口名直接是函數名,比如BindNativePort
,怎么不是_BindNativePort
?
說明
-
VC++
導出的函數默認是使用__cdcel
約定。__cdecl
是C
和C++
程序的默認調用約定。按照規范導出函數必須是_
開頭。 -
使用
Dependencies
開源工具看到以下導出函數,這個工具描述不夠詳細。
圖1:
- 使用
VC
命令行自帶的dumpbin
工具來查看導出函數更詳細。可以看到BindNativePort
實際上會通過@ILT+2265(_BindNativePort)
的方式查找。ILT
是INCREMENTAL LINK TABLE
的縮寫,這個@ILT
其實就是一個靜態函數跳轉的表,它記錄了一些函數的入口然后跳過去。
一般VS
的默認設置會