看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 大家好 今天在試著寫簡單的DLL看怎麼用 : 目前我是用vc8 開 console專案 Application type選dll 勾選export symbols : 然後就開始試著玩看看 : 產生了.lib .dll和 原來的.h : 想問各位 : 我寫.h檔案 是不是一定要使用 : #ifdef __cplusplus : extern "C" { : 把宣告的函式包起來 : 在另一個讀dll的程式利用 : HMODULE hGAL=LoadLibrary("xxx.dll") : GetProcAddress(hGAL,"function_name") <=======這函式讀取某function : 問題1 : 之前卡在一直都無法讀到這函式 原來是沒加上extern"C" : 所以C++ compiler會對function name做手腳 導致找不到這function : 所以寫dll一定要使用extern"C"來包嗎?? : 如果不用extern"C"包 就一定要附上.lib, 不要用GetProcAddress來找函式 : 以上是我測試所得到的心得但是不知道是不是真的這樣子@@ 好像是 ... 兩回事(吧?) 之所以要 extern "C" 應該是因為 GetProcAddress 是 C 的函式 所以在 C++ 的 name mangling 上要加上 extern "C" 才找得到 __declspec(dllexport) 出來的 .lib 是給那些"在編譯期就需要 symbol"用的 : 問題2 : 如果dll裡面有寫class : 是不是就一定要附上 .lib 才可以利用這class產生instance : 有沒有類似問題一的函式可以讀取class嗎??(我想說是不是可以不用給.lib) : 因為我同事說他沒給lib也可以new一個class的instance 讓我覺得很怪異.. : 我卻一直出現無法解析的外部符號 需要附上lib才可以..... 通常的作法是另外宣告一個函式: extern "C" YourClass * createYourClass(); 然後就可以用 dlsym 或是 GetProcAddress 拿到這個函式 再用它來生成 instance,這樣你不需要 explicit export dll : 問題3 : 我以為作dll就不會產生lib檔案 : 之前編譯靜態lib 就想成 把cpp轉換成lib 其實lib就是cpp~~ : 但是今天做dll 原來會產生.lib檔案 : 請教各位這lib檔案是紀錄什麼資訊 : 明明定義的資訊都跑到dll了為什麼還需要lib檔案呢 : 以上問題有點煩雜 想釐清觀念 : 謝謝各位~ 我的理解是,如果你在編譯期就要用到 dll 的 symbol 比方說你繼承某 class 或是不經由 dlsym 就要用 dll 裡的函式 就要 explicit export dll (好像只有 Windows 搞這套?) 這種的特徵是程式執行前就要載入 dll,否則不能執行 如果你是執行期才會用到該 dll 的內容,就不需要 export 比方說 plugin 或是其他和主要介面無關的 lib 這種通常是程式執行到一半才會載入,也可以中途卸載 : ps. 另外有看到某個前輩code 有使用interface這關鍵字 行為很像class : 這也是跟做DLL有關嗎= = thx sorry, 才疏學淺,沒看過 orz -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.205.248.119