作者purpose (purpose)
看板C_and_CPP
標題Re: [問題] 動態載入一組函式
時間Sat Feb 25 01:50:11 2012
※ 引述《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
→ 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)