乙個用VC生成DLL並用於其它工具的問題

2021-06-15 22:06:09 字數 2315 閱讀 9389

乙個用vc生成dll並用於其它工具的問題

前一陣子,我寫了乙個

.dll ,

用於在dbmaker

資料庫中實現使用者自定義函式,覺的沒有什麼地方錯了,但是加了斷點,也還是怎麼都進不去,資料庫直接崩潰,也沒有辦法除錯。

我的程式是這樣寫的:

--declspec(dllexport)

int utf8toutf16(……)

………

今天早上,我在看書《

windows

核心程式設計》時,找到了問題的答案。

書上是這樣說的:

「如果使用microsoft visual c++來建立d l l和將要鏈結到該d l l的可執行模組,可以跳過本節內容的學習。但是,如果使用visual c++建立d l l,而這個d l l要鏈結到使用任何**商的工具建立的可執行模組,那麼必須做一些額外的工作。」

所以我今天把文章摘抄下來,供大家學習,當然也希望書的作者能夠允許,因為我畢竟是用於個人學習的目的,方便大家共同進步

,希望能得到它老人家的同意。哈哈,不說了,還是看「書」吧!

如果使用microsoft visual c++來建立d l l和將要鏈結到該d l l的可執行模組,可以跳過本

節內容的學習。但是,如果使用visual c++建立d l l,而這個d l l要鏈結到使用任何**商的工具建立的可執行模組,那麼必須做一些額外的工作。前面講過當進行c和c + +混合程式設計時使用e x t e r n「c」修改符的問題。也講過c + +類的問題以及為什麼因為名字改變的緣故你必須使用同乙個編譯器**商的工具的問題。當你直接將c語言程式設計用於多個工具**商時將會出現另乙個問題。這個問題是,即使你根本不使用c + +,m i c r o s o f t的c編譯器也會損害c函式。當你的函式使用_ _ s t d c a l l ( w i n a p i )呼叫規則時會出現這種問題。這種呼叫規則是最流行的一種型別。

當使用_ _ s t d c a l l將c函式輸出時,m i c r o s o f t的編譯器就會改變函式的名字,設定乙個前導下劃線,再加上乙個@符號的字首,後隨乙個數字,表示作為引數傳遞給函式的位元組數。例如,下面的函式是作為d l l的輸出節中的_ m y f u n c @ 8輸出的:

__declspec(dllexport) long __stdcall myfunc(int a,int b);

如果用另乙個**商的工具建立了乙個可執行模組,它將設法鏈結到乙個名叫m y f u n c的

函式,該函式在m i c r o s o f t編譯器已有的d l l中並不存在,因此鏈結將失敗。

若要使用與其他編譯器**商的工具鏈結的m i c r o s o f t的工具建立乙個可執行模組,必須告訴m i c r o s o f t的編譯器輸出沒有經過改變的函式名。可以用兩種方法來進行這項操作。第一種方法是為程式設計專案建立乙個. d e f檔案,並在該. d e f檔案中加上類似下面的exports節:

exports

myfunc

當m i c r o s o f t的鏈結程式分析這個. d e f檔案時,它發現_ m y f u n c @ 8和m y f u n c均被輸出。由於這兩個函式名是互相匹配的(除了截斷的尾部外),因此鏈結程式使用m y f u n c的. d e f檔名來輸出該函式,而根本不使用_ m y f u n c @ 8的名字來輸出函式。

現在你可能認為,如果使用m i c r o s o f t的工具建立乙個可執行模組,並且設法將它鏈結到包含未截斷名字的d l l,那麼鏈結程式的執行將會失敗,因為它將試圖鏈結到稱為_ m y f u n c @ 8的函式。當然,你會高興地了解到m i c r o s o f t的鏈結程式進行了正確的操作,將可執行模組鏈結到名字為m y f u n c的函式。

如果想避免使用. d e f檔案,可以使用第二種方法輸出未截斷的函式版本。在d l l的源**

模組中,可以新增下面這行**:

#pragma comment(linker,」/export:myfunc= _myfunc@8

」)這行**使得編譯器發出乙個鏈結程式指令,告訴鏈結程式,乙個名叫m y f u n c的函式將

被輸出,其進入點與稱為_ m y f u n c @ 8的函式的進入點相同。第二種方法沒有第一種方法容易,因為你必須自己截斷函式名,以便建立該**行。另外,當使用第二種方法時, d l l實際上輸出用於標識單個函式的兩個符號,即m y f u n c和_ m y f u n c @ 8,而第一種方法只輸出符號m y f u n c。第二種方法並沒有給你帶來更多的好處,它只是使你可以避免使用. d e f的檔案而已。

用java生成乙個xml檔案

乙個xml文件,可以先構造乙個dom,然後將dom轉化為xml序列,輸出或者生成檔案。網上有很多這樣的 所以我這邊也借鑑了一下別人的。以下的 大部分是轉的。輸出檔案之後的 是自己編寫的,將乙個document物件轉換為乙個string型別,這裡需要使用的是transformer類的transform...

用遞迴演算法解決VC中CEdit的乙個Bug

摘要visual c 是microsoft程式設計工具中的 老大,它功能強大,使用它幾乎可以開發windows平台上的任何程式。但同時由於其功能強大,涉及面廣而讓人很難進入vc 的 門檻。由於是microsoft開發工具的拳頭產品,發布前都要經過嚴格的測試,同時不斷地公升級 維護,因此,其中常用的功...

用VC 開發乙個螢幕顏色拾取器

一 用到的關鍵api及說明 1 函式功能 該函式檢索指定座標點的畫素的rgb顏色值。函式原型 colorref getpixel hdc hdc,int nxpos,int nypos 2 函式功能 捕捉滑鼠訊息 函式原型 hwnd setcapture hwnd hwnd hwnd 當前執行緒裡要...