windows下dll開發雜記《一》

2021-08-09 16:33:53 字數 1994 閱讀 2185

在目前的專案中,發現原子業務的匯出沒有使用extern "c"關鍵字,而業務dll匯出函式中使用了extern 「c」關鍵字,仔細思考了下,什麼情況下需要使用extern "c",一.在c++**中呼叫的c的函式,需要先extern "c"宣告,二.宣告c++的函式為extern "c"提供給c呼叫,使用extern "c"告訴編譯器,按照c的方式來編譯介面函式,這裡可以使用巨集來復用

#ifdef __cplusplus

extern "c"{

#endif

__declspec(dllexport) void* export_func(char *pca);

#ifdef __cplusplus

extern "c"{

#endif

引用上文的標頭檔案,在c裡面編譯的話,(c不支援extern "c"的語法),只需要常規宣告,因為c++匯出的時候已經宣告成了extern "c",按照c的編譯方式,是可以找到該函式的,如果在c++裡面編譯,就會按照c的方式編譯介面函式。

得出以下結論,原子業務封裝只是供匯出業務封裝dll呼叫,都是c++不需要宣告為extern "c',推論二,業務中介軟體在呼叫業務dll的時候,使用的c語言開發的執行邏輯,不然就不會將業務dll匯出函式宣告為extern "c"。

值得注意的是上文的

__declspec(dllexport) void* export_func(char *pca);

這就是另乙個問題了(dll的匯出函式),匯出的時候是

__declspec(dllexport)

匯入的時候對應的是 __declspec(dllimport),但是按照網上的資料,__declspecl(dllimport其實是可以不寫的),按照msdn的說法,

不使用 __declspec(dllimport) 也能正確編譯**,但使用 __declspec(dllimport) 使編譯器可以生成更好的**。編譯器之所以能夠生成更好的**,是因為它可以確定函式是否存在於 dll 中,這使得編譯器可以生成跳過間接定址級別的**,而這些**通常會出現在跨 dll 邊界的函式呼叫中。但是,必須使用 __declspec(dllimport) 才能匯入 dll 中使用的變數。

詳細理解請參見的帖子

總的來說,就是可以不寫__declspec(dllimport)去使用外部dll的匯出函式,除非你需要用到的在另乙個dll中定義的全域性變數或者類中的靜態成員。

而反觀目前專案中的**,在原子中匯出函式是使用以下hong:

#if defined(atom_busi_exports)

#define atom_busi_api __declspec(dllexport)

#else

#define atom_busi_api __declspec(dllimport)

#endif

atom_busi_exports巨集,在原子專案屬性中有定義,也就是作為匯出__declspec,在原子的呼叫業務專案屬性是沒有新增atom_busi_exports預處理器的,也就是在編譯業務的時候,是按照__declspec(dllimport)去使用的。

以上是原子與原子的關係,在業務專案中匯出巨集是:

#if defined(_msc_ver)

#define export_lbm_func(export_func) \

__declspec(dllexport) void* export_func(char *pca);

#else

#define export_lbm_func(export_func) \

void* export_func(char *pca);

#endif

也對,畢竟中介軟體在呼叫dll的匯出函式的時候,不可能會需要重新去編譯一次,而是會根據配置的xml,動態地去載入具體的dll

如果在c++裡面編譯,就會按照c的方式編譯。

windows下 遠端DLL注入

核心函式 createtoolhelp32snapshot createtoolhelp32snapshot函式為指定的程序 程序使用的堆 heap 模組 module 執行緒 thread 建立乙個快照 snapshot handle winapi createtoolhelp32snapshot...

windows下lib與dll關係

1.lib與dll 區別 1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執...

Windows 命令雜記錄

區域網共享,檢視已登入過的帳號 net use清除已登入過的所有帳號 net use del登入,表示要求輸入密碼,net use 10.10.20.193 user 登入帳號 persistent yes 表示要輸入密碼 net use 10.10.20.193 密碼 user 登入帳號 pers...