Re: [問題] 使用 & 製作 dll的問題
※ 引述《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
12/27 18:20, 1F
推
12/29 21:23, , 2F
12/29 21:23, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 6 篇):