Windows dll編寫與def檔案

來源:互聯網
上載者:User

問題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中增加定義,新手寫的代碼又無人檢查,最嚴重的是後期的版本問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.