看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《james732 (好人超)》之銘言: : 假如我有這樣的一組介面: : class Calc : { : public: : virtual int add(int x, int y) = 0; : virtual int sub(int x, int y) = 0; : virtual int mul(int x, int y) = 0; : virtual int div(int x, int y) = 0; : }; : 我想問的是,有沒有辦法做到類似這樣的東西? : int main() : { : Calc *calc = NULL; : HANDLE hLibrary = Dynamic_Load("FastCalc.dll"); : calc = GetInterface(hLibrary); : calc->add(....); : calc->sub(....); : calc->mul(....); : calc->div(....); : return 0; : } : 也就是說,我有一個 pure virtual class 來描述介面 : 另外有個 FastCalc.dll 裡面實作了這個介面 (當然不管它是怎麼實作的) : 我想像上例這樣很簡單的載入整組介面來使用它 : 稍微研究過COM,不過還不是很熟,不知道它能不能做到這樣 : 如果可以的話請給我一些關鍵字或範例,COM對我來說實在不容易理解orz : 另外我也很好奇,在Linux環境有沒有辦法解決這個問題? : 話說,這個時候真的會很羨慕C#/Java的Reflection機制 XD 剛試了個方法,適用 VC + Windows 環境, 如下 ---- /* filename: calc.h */ struct calcFunctions { int (*myAdd)(int, int); int (*mySub)(int, int); }; ---- /* filename: foo.c compile with: cl.exe /LD foo.c */ #include "calc.h" #include <windows.h> int myAdd(int a, int b) { return a + b; } int mySub(int a, int b) { return a - b; } __declspec(dllexport) struct calcFunctions casio; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { casio.myAdd = myAdd; casio.mySub = mySub; return TRUE; } ---- /* filename: test.c compile with: cl.exe test.c */ #include <windows.h> #include <stdio.h> #include "calc.h" int main() { struct calcFunctions* pCasio; HMODULE dll = LoadLibrary("foo.dll"); pCasio = (struct calcFunctions*) GetProcAddress(dll, "casio"); printf("add(12, 23) = %d\n", pCasio->myAdd(12, 23)); printf("sub(12, 23) = %d\n", pCasio->mySub(12, 23)); return 0; } ---- 輸出 D:\Desktop>test add(12, 23) = 35 sub(12, 23) = -11 ---- 可以不必用到 class,但 dll 寫起來麻煩。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.133.151
purincess:原來getprocaddress可以不拿proc address而拿變數的addr 02/25 01:51
purincess:ess 學到了 (筆記) 02/25 01:52
purincess:還有記得calling convention也要統一 不能一下子cdecl 02/25 01:52
purincess:一下子stdcall XD 02/25 01:52
diabloevagto:太深奧了.. 02/25 02:02
james732:覺得好驚訝,我以為GetProcAddress只能拿function而已 02/25 02:08
purincess:可能dll的symbol table本來就沒在分變數或function (嗎? 02/25 02:23
loveme00835:http://bit.ly/w9cDIx 02/25 04:18
purincess:真的欸function or variable 02/25 05:33
purincess:真的要學起來 (再度筆記) 02/25 05:34
james732:被發現沒有爬MSDN了...XDD 02/25 06:20
alongalone:這招好強阿~~~用 struct包func ptr再包成dll ...!! 02/25 08:58
angleevil:版主OS:超哥 02/25 12:42
VictorTom:和l大的方法一樣都很讚:) 02/25 13:25
ibmibmibm:這就是linux kernel內部使用的方式 02/27 00:42
請教一下前輩,出於何種目的,才讓 linux kernel 這麼做呢? 謝謝 ※ 編輯: purpose 來自: 124.8.145.239 (02/27 03:00)