2009-12-03 21:37:41| 分類: c++ |舉報 |字型大小 訂閱
今天接觸了
def檔案,在客戶端工程裡有不少
def檔案,有關
dll匯出的今天就花時間看了看,以前包括現在自己在使用
dll的時候很少用到
dll乙個強大功能,就是跨語言,用
vb做介面呼叫
vc寫的
dll各取所長。以前沒碰到過
def這個檔案,就上網看了看,看完後明白了大概的作用。
為了實現
c++語言的函式過載、運算子過載之類的高階特性,因為函式過載的時候不同的函式公用乙個相同的函式名,所以編譯器就使用了名稱修飾對不同函式進行名字修飾用以區分各個函式。例如
c的函式
void function
();這個函式被編譯器編譯後名字就成了
_function@
這個樣子了,所以匯出
dll的時候函式名就是
_function@
,c++
為了實現過載這些高階特性修飾規則會更複雜,這就不多說了。這裡有個
c++修飾過的函式名,看起來真得很可怕,太長了。
還有乙個比較關鍵的因素是函式的呼叫約定,它規定了該語言的函式中的引數傳送方式、引數是否可變和由誰來處理堆疊等問題,
c++預設的抵用約定是
__cdecl
這種型別的,典型的
printf
這種可變引數就是依賴了這種呼叫方式,此外還有其他幾種呼叫約定,這裡就不細說了。
明白了上面
2個問題,這時候引出新的問題,為了使其他語言(vb、
pascal
什麼的)可以使用
vc編寫的
dll,因為vb和
c++的函式呼叫約定是不同的,那麼就有問題,首先是函式名修飾規則不一樣,
vb呼叫函式
function
的時候就會提示找不到所引用的函式,因為
dll中的函式名是
_function@
,這時候就引入
def檔案,他能指定匯出
dll的時候函式名,例如我在咱
1.48
客戶端找到
d3d的渲染
dll,有個
def檔案叫
ogred3d9rendersystem.def
,裡面有這樣的語句
按照我的理解,應該存在乙個名字為
rendersystem_direct3d9.dll
的檔案,而裡面有名字為
dllstartplugin
和dllstopplugin
兩個匯出函式,果然在
1.48
的資料夾下搜尋到了這個
dll,用
dumpbin
工具檢視裡面的匯出函式,看到了如下的結果
這下明白了
def檔案的作用。
在網上看到了這樣的描述,使用
def檔案來輸出函式的乙個主要目的就是:將編譯器生成的函式修飾去掉,用更加自然、更加容易理解、更加容易記憶的名字來命名函式,而不是一串讓人一看就嚇一跳的修飾名字。
客戶端就是
c++編碼,也沒有什麼別的語言來呼叫了?為什麼還要這麼弄呢?也是在網上看的,他這麼說:「寫動態庫要著眼於『大局』,
要一切符合『標準』,什麼是『大局』?大局就是走可持續發展道路,就是復用。「
以上是今天自己的一點看法,還不是很清楚再什麼時候用
def檔案。
php生成pdf生成
fpdf是乙個純粹的通過php類來生成pdf文件的方法,需要生成的內容直接在php 中來指定,生成文字,線條等等,都有自己的方法。下面介 紹乙個用fpdf來生成 hello world 的pdf文件 php require fpdf.php pdf new fpdf pdf addpage pdf ...
生成樹和生成森林
1 無向圖的生成樹和生成森林 對於無向連通圖,在圖的深度優先遍歷或廣度優先搜尋遍歷過程中經歷的邊的集合和 圖中的所有頂點一起構成圖的極小連通子圖,就是一顆生成樹 深度優先生成樹 廣度優先生成樹 對非連通無向圖,深度優先搜尋遍歷或廣度優先搜尋遍歷,每個連通分量中的頂點集合遍歷時走過的邊一起構成若干顆生...
生成 重新生成 清理
1.在解決方案資源管理器中,選擇或開啟所需的解決方案。2.在 生成 選單上,選擇 生成解決方案 重新生成解決方案 或 清理解決方案 選擇 生成 或 生成解決方案 將只編譯自上次生成以來更改過的那些專案檔案和元件。說明 如果解決方案中包括多個專案,則 生成 命令將變成 生成解決方案 選擇 重新生成解決...