問題1:
查看一個編寫的dll的輸出,函數名老是 _xxxx@n之類,已經使用了extern "C"並工程中添加了def檔案。在“問專家”中搜尋到這麼一段:
在VC++中,如果產生DLL可以不使用.def檔案。你只需要在VC++的函數定義前要加
__declspec(dllexport)修飾就可以了。但是使用__declspec(dllexport)和使用.def檔案是有區別的。如果你的
DLL是提供給VC++使用者使用的,你只需要把編譯DLL時產生的.lib提供給使用者,它可以很輕鬆地調用你的DLL。但是如果你的DLL是供VB、
PB、Delphi使用者使用的,那麼會產生一個小麻煩。因為VC++對於__declspec(dllexport)聲明的函數會進行名稱轉換,如下面的
函數:
__declspec(dllexport) int __stdcall IsWinNT()
會轉換為IsWinNT@0,這樣你在VB中必須這樣聲明:
Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
@的後面的數由於參數類型不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式。
EXPORTS後面的數可以不給,系統會自動分配一個數。對於VB、PB、Delphi使用者,通常使用按名稱進行調用的方式,這個數關係不大,但是對於使用.lib連結的VC程式來說,不是按名稱進行調用,而是按照這個數進行調用的,所以最好給出。
看來是def檔案沒起到作用。最終發現需要將def檔案配置到VC工程中的“連結器”的“模組定義檔案”中。
問題2:
在def中增加幾個輸出函數定義後(這些函數本來已經輸出,但沒有加到def檔案中),發現某些以前編譯的程式執行報錯找不著函數,但其他一些程式沒有報錯。看來報錯的程式串連時沒有使用lib檔案,而沒報錯的使用了;沒使用lib檔案的通過hint定位函數,所以總能找到但可能找錯了——難怪聽說這個庫以前發生過函數調錯的現象。
增加了輸出函數卻忘了在def中增加定義,新手寫的代碼又無人檢查,最嚴重的是後期的版本問題。