Re: [問題] 動態載入一組函式

看板C_and_CPP作者 (我要加入劍道社!)時間13年前 (2012/02/24 16:34), 編輯推噓2(2010)
留言12則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《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

02/25 00:35, , 1F
附註一提,dll和主程式要用同一個compiler編譯
02/25 00:35, 1F

02/25 00:35, , 2F
不然會發生悲劇
02/25 00:35, 2F

02/25 00:36, , 3F
原來可以把 creator 丟出來產生物件,怎麼沒想到這招 XD
02/25 00:36, 3F

02/25 00:37, , 4F
我一直在想要怎麼直接丟出一個物件,倒是死腦筋了
02/25 00:37, 4F

02/25 00:49, , 5F
這篇文章解了我的疑惑,補個推XD
02/25 00:49, 5F

02/25 00:58, , 6F
j大怎麼最近一直在用dp的東西?好奇xdd
02/25 00:58, 6F

02/25 01:03, , 7F
明顯是他工作的東西
02/25 01:03, 7F

02/25 01:06, , 8F
可是L大好讚喔,有空來研究一下
02/25 01:06, 8F

02/25 01:14, , 9F
確實跟工作有關係,順便釐清一些觀念XD
02/25 01:14, 9F

02/25 01:15, , 10F
http://ideone.com/MIZiG 這個寫法是為了避免這樣?
02/25 01:15, 10F

02/25 01:16, , 11F
工作目前現有的code是用了約30個GetProcAddress逐一載入
02/25 01:16, 11F

02/25 14:14, , 12F
我比較好奇是超哥,妳在寫mfc?
02/25 14:14, 12F
文章代碼(AID): #1FHxmELc (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FHxmELc (C_and_CPP)