)才能正確呼叫,這是因為c++中的函式過載機制把函式名字重新編碼了,如果使用def檔案,你可以顯式指定沒編碼前的函式名。
有了這些知識,你可以開始寫一些簡單的dll的應用,但是我可以百分之百的肯定,你會遇到崩潰,而之前的非dll的版本則沒有問題。假如你通過顯式載入來使用dll,有可能會是呼叫約定不一致而引起崩潰,所謂呼叫約定就是函式宣告前面加上__stdcall __cdecl等等限定詞,注意一些巨集如winapi會定義成這些限定詞之一,不理解他們沒關係,但是記住一定要保持一致,即宣告和定義時一致,這在用隱式載入時不成問題,但是顯示載入由於沒有利用標頭檔案,就有可能產生不一致。
呼叫約定並不是我真正要說的,雖然它是一種可能。我要說的是記憶體分配與釋放的問題。請看下面**:
void foo(string& str)
int main()
當函式foo和main在同乙個工程中,或者foo在靜態庫中時,不會有問題,但是如果foo是乙個dll的匯出函式時,請不要這麼寫,它有可能會導致崩潰[6]。崩潰的原因在於「乙個模組中分配的內存在另乙個模組中釋放」,dll與exe分屬兩個模組,例子中foo裡面賦值操作導致了記憶體分配,而main中return語句之後,string物件析構引起記憶體釋放。
我不想窮舉全部的這類情況,只請大家在設計dll介面時考慮清楚記憶體的分配釋放問題,請遵循誰分配,誰釋放的原則來進行。
如果不知道該怎麼設計,請抄襲我們常見的dll介面--微軟的api的做法,如:
createdc
releasedc
的成對呼叫,乙個函式分配了記憶體,另外乙個函式用來釋放記憶體。
回到我們有可能崩潰的例子中來,怎麼修改才能避免呢?
這可以做為乙個練習讓讀者來做,這個練習用的時間也許會比較長,如果你做好了,那麼你差不多就出師了。一時想不到也不用急,我至少見過兩個有五年以上經驗的程式設計師依然犯這樣的錯誤。
注[1]:為了說明的需要,我這裡使用直接宣告的方式,實際工程中是應該使用標頭檔案的。
注[2]: 還有執行緒建立與銷毀也會路過dll的入口,但是這對新手來說意義不大。
注[3]:def檔案格式很簡單,關於def檔案的例子,可以通過新建乙個atl com工程看到。
注[4]:第一種方法和使用靜態庫差不多,包含標頭檔案,鏈結庫檔案,然後就像是使用普通函式一樣,稱為隱式載入。
注[5]:具體呼叫方法請參閱msdn。
注[6]:之所以說有可能是因為,如果兩個工程的設定都是採用動態連線到執行庫,那麼分配釋放其實都在執行庫的dll中進行,那麼這種情況便不會發生崩潰
引用:http://tieba.baidu.com/f?kz=462808373
lib和dll檔案的區別和聯絡
lib和dll lib和dll檔案的區別和聯絡 dll是在你的程式執行的時候才連線的檔案,因此它是一種比較小的可執行檔案格式,dll還有其他的檔案格式如.ocx等,所有的.dll檔案都是可執行。lib是在你的程式編譯連線的時候就連線的檔案,因此你必須告知編譯器連線的lib檔案在那裡。一般來說,與動態...
lib和dll檔案的區別和聯絡
lib和dll lib和dll檔案的區別和聯絡 dll是在你的程式執行的時候才連線的檔案,因此它是一種比較小的可執行檔案格式,dll還有其他的檔案格式如.ocx等,所有的.dll檔案都是可執行。lib是在你的程式編譯連線的時候就連線的檔案,因此你必須告知編譯器連線的lib檔案在那裡。一般來說,與動態...
lib和dll檔案的區別和聯絡
lib和dll檔案的區別和聯絡 2006 09 23 21 09 lib和dll lib和dll檔案的區別和聯絡 dll是在你的程式執行的時候才連線的檔案,因此它是一種比較小的可執行檔案格式,dll還有其他的檔案格式如.ocx等,所有的.dll檔案都是可執行。lib是在你的程式編譯連線的時候就連線的...