2012-09-07 39 views
2

我有這樣一個在DLL中的代碼:LoadLibrary和定義回調C DLL(函數指針)

int (*callback)(int a, int b); 
void mainfunc() 
{ 
    callback(1, 2); 
    callback(3, 4); 
} 

爲了從C程序訪問該DLL,我用做:

#include <windows.h> 

int callback(int a, int b) {return a+b;} 

int main() 
{ 
    HANDLE dll = LoadLibrary("test.dll"); 
    *(void**)GetProcAddress(dll, "callback") = (void*)callback; 
    ((void(*))GetProcAddress(dll, "mainfunc"))(); 
    FreeLibrary(dll); 
} 

該DLL仍然是C代碼,但主程序已切換到C#。如何處理函數指針?該代碼將如何在C#中?

+0

也許是一個代表?不知道這實際上是如何做到的,儘管... – ekolis

+0

這是一個簡化的例子嗎?不知道爲什麼你需要回調這樣一個簡單的等式。 – SwDevMan81

+0

@ SwDevMan81,是的。 –

回答

3

callback是一個在dll中的全局變量,所以你不能[1]從c#中設置它。

你不應該從C設置它。如果回調真的是共享的,你應該有什麼功能,像SetCallback(MyCallbackType callback)這樣的功能來設置它。

但可能你想把這個函數傳遞給mainfunc。

在這兩種情況下,這很容易在C#中要做到:

// C# 
public delegate Int32 Callback(Int32 a, Int32 b); 
[DllImport("test.dll")] 
static extern void mainfunc(Callback callback); 
// Or if you're setting the callback globally, 
[DllImport("test.dll")] 
static extern void SetCallback(Callback callback); 
[DllImport("test.dll")] 
static extern void mainfunc(); 

的帶回家的消息是,的DllImport是足夠聰明的委託轉換具有相當接近簽名的C函數指針。

[1]好的,你可以...... dll注入有時會沿着這些線使用一些黑客中的一種,但是在任何其他情況下都會採用各種錯誤的方式。