作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 動態載入一組函式
時間Sat Feb 25 00:34:18 2012
※ 引述《james732 (好人超)》之銘言:
: 也就是說,我有一個 pure virtual class 來描述介面
: 另外有個 FastCalc.dll 裡面實作了這個介面 (當然不管它是怎麼實作的)
: 我想像上例這樣很簡單的載入整組介面來使用它
: 稍微研究過COM,不過還不是很熟,不知道它能不能做到這樣
: 如果可以的話請給我一些關鍵字或範例,COM對我來說實在不容易理解orz
: 另外我也很好奇,在Linux環境有沒有辦法解決這個問題?
: 話說,這個時候真的會很羨慕C#/Java的Reflection機制 XD
可以的,而且不需要用到 COM
然而主程式不知道誰實作了這個界面,沒辦法產生這個物件的實體
因此你需要另外一個介面來產生及銷毀物件的實體
FastCalc.dll 的實作大概像這樣:
class FastCalc : public Calc {
... // 實作
};
Calc* CreateCalc()
{
return new FastCalc;
}
void DeleteCalc(Calc* c)
{
delete c;
}
用起來則是像這樣:
typedef Calc* (*CreateFunc)(); // 先用 typedef 省麻煩
HMODULE lib = LoadLibrary("FastCalc.dll");
CreateFunc create_func = (CreateFunc)GetProcAddress(lib, "CreateCalc");
Calc* calc = create_func();
calc->add(...);
用完再用同樣的方法把 calc 傳進 DeleteCalc 銷毀即可
Linux 下的過程一模一樣
只是把 LoadLibrary 改成 dlopen
GetProcAddress 改成 dlsym 這樣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.88.109
→ littleshan:附註一提,dll和主程式要用同一個compiler編譯 02/25 00:35
→ littleshan:不然會發生悲劇 02/25 00:35
→ james732:原來可以把 creator 丟出來產生物件,怎麼沒想到這招 XD 02/25 00:36
→ james732:我一直在想要怎麼直接丟出一個物件,倒是死腦筋了 02/25 00:37
推 james732:這篇文章解了我的疑惑,補個推XD 02/25 00:49
→ diabloevagto:j大怎麼最近一直在用dp的東西?好奇xdd 02/25 00:58
→ angleevil:明顯是他工作的東西 02/25 01:03
推 angleevil:可是L大好讚喔,有空來研究一下 02/25 01:06
→ james732:確實跟工作有關係,順便釐清一些觀念XD 02/25 01:14
→ james732:工作目前現有的code是用了約30個GetProcAddress逐一載入 02/25 01:16
→ angleevil:我比較好奇是超哥,妳在寫mfc? 02/25 14:14