看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
diabloevagto:http://ideone.com/MIZiG 這個寫法是為了避免這樣? 02/25 01:15
james732:工作目前現有的code是用了約30個GetProcAddress逐一載入 02/25 01:16
angleevil:我比較好奇是超哥,妳在寫mfc? 02/25 14:14