Re: [問題] 使用 & 製作 dll的問題

看板C_and_CPP作者 (莉莉姆)時間16年前 (2009/12/27 13:46), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串6/6 (看更多)
※ 引述《legnaleurc (CA)》之銘言: : ※ 引述《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" 才找得到 這邊應該不太對 並不是因為GetProcAddress是C的函式,所以要用extern "C"才找得到 不使用extern "C"來宣告你要export的函式,GetProcAddress還是找的到的 這跟compiler為這個函式產生的名稱和你帶入GetProcAddress要找的名稱是否相符有關 在C++裡只有為函式指定c linkage時函式名稱才會以C的方式來紀錄 這樣我們才能只帶入單純函式名稱就找得到函式,否則我們要帶入C++的函式名稱來找 假設我們在dll有個function 定義成 bool Foo(const char*, int); 那使用GetProcAddress時可能要寫成這樣 GetProcAddress(hModule, "?Foo@@YG_NPBDH@Z");來取得 定義成 extern "C" bool Foo(const char*, int); 才能用GetProcAddress(hModule, "Foo");來取得 問題就在我們要知道C++為函式產生的名稱是比較麻煩的 所以用C的方式比較簡單 : : ps. 另外有看到某個前輩code 有使用interface這關鍵字 行為很像class : : 這也是跟做DLL有關嗎= = thx : sorry, 才疏學淺,沒看過 orz 這個應該屬於COM在用的東西,寫IDL檔時宣告介面所用的關鍵字 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.37.95

12/27 18:20, , 1F
COM/COM+ 這個討厭的東西..)
12/27 18:20, 1F

12/29 21:23, , 2F
原來如此!推!
12/29 21:23, 2F
文章代碼(AID): #1BDlJC_i (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BDlJC_i (C_and_CPP)