[問題] DLL 觀念問題

看板C_and_CPP (C/C++)作者 (還是朋友?)時間12年前 (2014/01/03 22:44), 編輯推噓6(6011)
留言17則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VS2010 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 其實是被問倒了Q_Q 來求救的 1.第一個問題 #ifdef MYLIBDLL_APP #define MYLIBDLL _declspec(dllimport) #else #define MYLIBDLL _declspec(dllexport) #endif 主要是 被問到.h中 先這樣宣告後 假設 class MYLIBDLL test{ void xxx(); } 當AP call 這個dll時 對於 AP 和 DLL的檔案 如何得知 xxx 這個涵式 是要export 或 import 或是 兩者都要 2.另一個問題是 我是用VS2010寫 本來以為直接用vs include lib 是靜態連結 程式碼中寫是動態連結 類似 HINSTANCE hTest; HMODULE myPlugin=NULL; myPlugin = LoadLibrary( " test.dll " ) 但被指證 說兩個都是動態連接, 實際靜態連接是指編譯後會包到exe內 但這又該如何撰寫><? 這兩種的方式有點搞不太懂阿 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.240.185.176

01/03 23:01, , 1F
1. MYLIBDLL是否有define決定
01/03 23:01, 1F

01/03 23:02, , 2F
2. 該如果撰寫是什麼意思?
01/03 23:02, 2F

01/03 23:02, , 3F
回答2:用LoadLibrary 動態載入 lib在執行到LoadLibaray時
01/03 23:02, 3F

01/03 23:03, , 4F
才被載入到記憶體 用include lib若不指定靜態連結 程式庫
01/03 23:03, 4F

01/03 23:04, , 5F
是在OS load你的程式的時候幫你一起載入並連結
01/03 23:04, 5F

01/03 23:05, , 6F
用include lib指定靜態連結的話 程式庫直接編進你的程式
01/03 23:05, 6F

01/03 23:23, , 7F
*.lib 沒有分指不指定靜態連結吧,都是直接連結進*.exe內
01/03 23:23, 7F

01/03 23:24, , 8F
只不過 dll 用的 *.lib 只是幫忙動態連結,裡面沒程式碼
01/03 23:24, 8F

01/03 23:31, , 9F
1樓大大...@@ 還是不太懂
01/03 23:31, 9F

01/03 23:50, , 10F
compile的時候或者是code其他部分是否有定義MYLIBDLL
01/03 23:50, 10F

01/04 01:52, , 11F
痾..我的lib不是*.lib的意思是dll library 有點誤導抱歉
01/04 01:52, 11F

01/04 01:56, , 12F
那如果定義了MYLIBDLL 是import 還是export?
01/04 01:56, 12F

01/04 02:02, , 13F
話說那個 #ifdef MYLIBDLL 怪怪的.. 有重覆定義之可能..
01/04 02:02, 13F
漏了抱歉 ※ 編輯: pigcat1315 來自: 111.240.168.229 (01/05 03:22)

01/05 10:19, , 14F
那答案應該明顯了吧 @@ 有定義 MYLIBDLL_APP 時是 import,
01/05 10:19, 14F

01/05 10:19, , 15F
沒定義時是 export
01/05 10:19, 15F

01/05 12:08, , 16F
export 是做 DLL 輸出用的, import 是使用端用的, 優化呼叫
01/05 12:08, 16F

01/05 12:19, , 17F
dllimport 可以直接編成 IAT 呼叫, 沒有會多一個中間步驟
01/05 12:19, 17F
主要會不懂是還有幾點, 1.當我有在dll 先#define MYLIBDLL_APP xxx會變export對吧 但AP 也還是能呼叫,這樣有差異嗎? 2. 網路上我也看了文章,是指有import 編碼會較好 ,會少2個jump? 不過在VS上沒寫import dll是不會編譯過 3.AP 中我如果也先 #define MYLIBDLL_APP 會有差異嗎? , 我測試的檔案能使用此DLL ,但不知有沒有差異性 ※ 編輯: pigcat1315 來自: 111.240.168.229 (01/05 14:58)
文章代碼(AID): #1IniozHD (C_and_CPP)
文章代碼(AID): #1IniozHD (C_and_CPP)