※ 引述《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