2012-10-05 30 views
1

我想傳遞一個委託給一個C++方法的代碼:傳遞一個委託作爲方法指針

#pragma unmanaged 
void login(char *uname, void (*cb)()) 
{ 
    if (strcmp(uname, "test")==0) 
    { 
     printf("Correct!\n"); 
     cb(); 
    } 
    else 
    { 
     printf("False\n"); 
    } 
} 
#pragma managed 
public ref class log 
{ 
    public: delegate void successdelg(); 
    public: static void logme(String ^s, successdelg ^success) 
    { 
     login((char*)(void*)Marshal::StringToHGlobalAnsi(s), success); 
    } 
}; 

但我發現了這個錯誤:「錯誤C2664:‘登錄’:不能轉換參數2從'log :: successdelg ^'到'void(__cdecl *)(void)'「

正常情況下,我可以跳過這個錯誤,只是將方法沒有任何委託給我的C++函數,但我用這個一個引用我的C#項目的庫,它將方法從我的C#應用​​程序傳遞給C++ dll。

+1

與您的實際問題無關,但您使用'StringToHGlobalAnsi'錯誤。正如文檔中提到的,當你完成後你必須調用'FreeHGlobal'。 – hvd

回答

1

使用Marshal.GetFunctionPointerForDelegate方法。使用回調函數時,始終保持傳遞給此方法的委託實例處於活動狀態,因爲此函數調用不會爲此委託添加引用計數器。

+0

謝謝,如果有人對完全修復感興趣:在unmanaged add typedef void(__stdcall * cb)();並在login參數中將指針更改爲受管部分中的cb:GCHandle gch = GCHandle :: Alloc(successdelg); \t \t IntPtr ip = Marshal :: GetFunctionPointerForDelegate(successdelg); cb c_b = static_cast (ip.ToPointer());現在只需傳遞c_b。 – method