2014-01-27 25 views
0

讓我們假設我有以下功能:如何間接調用C函數

int func(int a, char* b, float c) 
{ 
    return 42; 
} 

我珍玩,如果有可能調用這個函數沒有:

  • 顯式調用它(func(1, "abc", 2.4)
  • 創建一個指向它的函數指針,然後通過函數指針調用它。

該函數是用C(或C++)編寫的,可能位於庫(Windows上的DLL)或當前應用程序中編譯的某處。現在讓我們假設沒有名稱修改問題。

但是,我瞭解以下內容:

  • 函數的名稱。 (例如「int」,「char*」,「float」)。
  • 它的返回類型

我接受任何建議,但我有點害怕一些較低級別的裝配黑客,因爲我想這是儘可能便攜。

我寧願一個C解決方案,我想避免boost::bind ......

編輯 - 一些澄清...

的一個「通話中」的「功能」是一個腳本語言的編譯庫(DLL)。它會加載腳本語言(源文件),該語言具有「綁定」到外部函數(我試圖調用的那些函數),並且在腳本語言遇到「調用這個外部函數」時,它會嘗試調用那個外部函數可能在一個DLL ......或實際加載腳本語言的DLL的應用程序......

+1

這些是標準的便攜式C中的唯一選項。但是,將會有特定於平臺的方法來訪問庫中的函數(例如,POSIX的'dlsym')。 –

+0

在你的情況下,x86和AMD64是否具有可移植性? – athre0z

+0

@athreoz在這個項目階段我只專注於這兩個:) – fritzone

回答

0

爲了能夠調用編譯器時不明確的參數類型的函數,我擔心你不會回過頭來說一下「低級裝配黑客」。

如果移植到x86或AMD64以外的體系結構的可移植性不相關,請查看at this wonderful library。它允許在運行時生成原生字節碼的操作系統非特定方式,並且應該是實現您的願望的最簡單方式。

它仍然是測試版,但我現在使用它一段時間沒有遇到任何問題。

+0

這看起來有趣,我會看看它是否可以達到這個目的:) – fritzone

+0

它可以肯定地獄 - 我做了一些與之前相似的東西。 :) – athre0z