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:'login':无法将参数 2 从 'log::successdelg ^' 转换为 'void (__cdecl *)(void)'”

通常我可以通过将没有任何委托的方法传递给我的 c++ 函数来跳过这个错误,但我将它用作引用我的 c# 项目的库,它将方法从我的 c# 应用程序传递给 c++ dll。

4

1 回答 1

1

使用 Marshal.GetFunctionPointerForDelegate 方法。使用回调函数时,始终保持传递给此方法的委托实例处于活动状态,因为此函数调用不会为此委托添加引用计数器。

于 2012-10-05T16:58:49.847 回答