我在寫一個通用測試函數,它將接受函數地址(從映射文件讀取)和參數作爲逗號分隔的數據作爲來自套接字的參數。C中的通用函數指針
我能夠實現它已知的函數指針。
像
void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);
通過上面的方法,我會寫的函數指針的所有類型的代碼庫功能的實現。有沒有通用的方法來做到這一點?
我在寫一個通用測試函數,它將接受函數地址(從映射文件讀取)和參數作爲逗號分隔的數據作爲來自套接字的參數。C中的通用函數指針
我能夠實現它已知的函數指針。
像
void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);
通過上面的方法,我會寫的函數指針的所有類型的代碼庫功能的實現。有沒有通用的方法來做到這一點?
不,因爲編譯器需要知道如何表示參數。它不能知道排除信息的函數指針類型,因此它不能生成該調用。
例如,當調用多個參數時,具有少量參數的函數可能會將它們傳遞到CPU寄存器中,「溢出」到堆棧。
您可以使用可變參數來解決這個問題,這樣做基本上可以「鎖定」參數傳遞的方式。當然,它會強制被調用的函數處理可變參數,這不是很方便。
您可以執行以下操作。
fn_t fncptr;
fncptr= MapAddress + 0x(offset);
MapAdress是你的地圖文件到內存地址。 (如果C++編譯器無法將偏移量添加到void,則可以在之前將其轉換爲DWORD)Offset是文件中函數代碼的位置。但是記住,你將需要exetuce地址來指向窗口中的指針是PAGE_EXETUCE_READWRITE。如果編譯器在第一個代碼失敗ThenCall像,
fncptr(arg1, arg2, arg3);
,這樣做: fn_t fncptr; fncptr =(fn_t)((DWORD)MapAddress + 0x(offset));
是固定函數的參數個數嗎?或者,你試圖實現的變量是什麼? – Kevin 2012-08-15 14:29:34
可能與[如何結合函數指針使用可變參數](http://stackoverflow.com/questions/7308449/how-to-use-varargs-in-conjunction-with-function-pointers-in-c-在-Win64上)。 – DCoder 2012-08-15 14:30:13