[問題] dll :implicit link 和 explicit link

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間16年前 (2010/02/09 20:49), 編輯推噓4(4016)
留言20則, 2人參與, 最新討論串1/2 (看更多)
之前有發文問過 目前觀念是使用dll有兩種方法 implicit link 和 explicit link explicit link似乎就是用loadlibrary / GetProcAddress方式 搭配.h implicit link似乎就是 dll要搭配lib給 也要搭配.h 我和一個朋友詢問 他不是很清楚原理 但是他跟我講他給別人用都只給dll和.h 讓我覺得很難理解 因為他.h裡面有class 用explicit link似乎不可行.... 我就去驗證一下 export出來的.h 內容: class TESTDLL_API CTestDLL { public: // TODO: add your methods here. virtual void XD()=0; //不定義給兒子override virtual void ORZ(); //我在cpp定義 }; 另一個.h內容 class Son:CTestDLL { public: void XD(){cout<<"我是derived"<<endl;} } cpp定義 void CTestDLL::ORZ(){cout<<"我是orz"<<endl;} 順便export一個function 用來產生instance TESTDLL_API void CreateInstance(CTestDLL **ptr) { *ptr = new Son; } 再來是 要使用dll的程式 只加入dll和.h HMODULE hGAL; if (NULL != (hGAL =LoadLibrary(L".\\TestDLL.dll"))) { cout<<"load dll successful"<<endl; typedef void(*FUNPTR)(CTestDLL**); FUNPTR FPTR; FPTR=(FUNPTR)GetProcAddress(hGAL, "CreateInstance"); CTestDLL *ptr; FPTR(&ptr); //以下兩個呼叫 都可以成功印出....... ptr->XD(); ptr->ORZ(); } 以上讓我對為啥要給.lib用implicit link 感到很怪 不知為啥要給lib 然後我就試著把virtual void ORZ(); //我在cpp定義的virtual拿掉 void ORZ(); ptr->ORZ();只要一呼叫就出現link error 對於link error和不link error這原因我沒有觀念... 變成目前結論是你export給別人如果class都是virtual就不用給lib 如果有非virtual就要lib... 如果不用GetProcAddress 來取得CreateInstance 直接呼叫 沒有lib也會link error 可是以上這兩個觀察到的現象 可否給我一個很好理解的觀念.... 我實在不懂為什麼有時要lib有時不用給 感謝!@@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222

02/09 21:14, , 1F
你的程式碼不是explicit link嗎 @@?
02/09 21:14, 1F

02/09 21:15, , 2F
你好~~我只是為了取得 CreateInstance這函式
02/09 21:15, 2F

02/09 21:15, , 3F
用explicit...其他的我以為要用implicit發現不用
02/09 21:15, 3F

02/09 21:16, , 4F
我的explicit和implicit 只是有沒有用到.lib的差別@@
02/09 21:16, 4F

02/09 21:16, , 5F
你用LoadLibrary的時候就是用explicit link了呀
02/09 21:16, 5F

02/09 21:16, , 6F
我把不用lib當成explicit去想 不知道觀念有沒有錯~
02/09 21:16, 6F

02/09 21:17, , 7F
但是我不加virtual 就無法這樣呼叫了
02/09 21:17, 7F

02/09 21:18, , 8F
explicit是不用lib檔沒錯,就算DLL檔不存在你的程式還是可
02/09 21:18, 8F

02/09 21:18, , 9F
以啟動,不會跳出找不到DLL的錯誤視窗。
02/09 21:18, 9F

02/09 21:21, , 10F
以C的DLL來說,所有要存取的東西都必須GetProc
02/09 21:21, 10F

02/09 21:23, , 11F
C++的DLL我沒有寫過 orz 不過照理說XD、ORZ也要GetProc
02/09 21:23, 11F

02/09 21:34, , 12F
還有就是我對GetProcAddress抓得到CreateInstance感到好奇
02/09 21:34, 12F

02/09 21:34, , 13F
,如果你的CreateInstance沒有extern "C" 修飾的話,他應
02/09 21:34, 13F

02/09 21:35, , 14F
該會是C++修飾過的函數名稱,用"CreateInstance"還可以回
02/09 21:35, 14F

02/09 21:36, , 15F
傳正確的address還蠻怪的。 囧a
02/09 21:36, 15F

02/09 22:49, , 16F
有~有把宣告用extern包起來 不過您一開始說的 啟動會錯誤
02/09 22:49, 16F

02/09 22:50, , 17F
是因為用implicit 所以exe必須和dll共存一開始就要load?
02/09 22:50, 17F

02/09 22:50, , 18F
如果動態用 getproc去抓的話應該是 跑到那行才會死吧?
02/09 22:50, 18F

02/10 13:23, , 19F
http://tinyurl.com/y8ejwzt 這個是Linux用的,class的
02/10 13:23, 19F

02/10 13:24, , 20F
explicit linking似乎可行,但是要另外做建構子的wrapper
02/10 13:24, 20F
文章代碼(AID): #1BSLda-z (C_and_CPP)
文章代碼(AID): #1BSLda-z (C_and_CPP)