C ++ / CLI中将long ^转换为LONG *

时间:2018-12-10 13:51:04

标签: c++ dll c++-cli wrapper

我有一个DLL,我需要为其编写包装。目标是在C#.NET应用程序中使用它,因此我需要使用C ++ / CLI(以前从未阅读过它,所以我是新手)。

dll中的函数标头如下:

extern "C" __declspec(dllexport) BOOL __stdcall PlayM4_GetPort(LONG* nPort);

我在包装器中定义的标头是这样的:

bool PlayM4Wrapper::GetPort(long^ nPort);

据我了解,回旋符号(^)表示它是指向参数(nPort)的指针。所以我想写的是下面的代码,但是我遇到了转换错误Error C2664 'BOOL (LONG *)': el argumento 1 no puede convertirse de 'System::Int32 ^' a 'LONG *'

bool PlayM4Wrapper::GetPort(long^ nPort)
{
    BOOL ret =_mLoader->m_PlayM4GetPort(nPort);
    return static_cast<BOOL>(ret);
}

有人可以帮我吗?我应该如何编写该包装器函数?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

据我所知,圆音符号(^)表示指向该参数的指针

在C ++中不了解指针。是的,它是对对象实例的引用。但是,此参考资料不能在C ++中使用。它不是指针,不能将其用作指针。首先,.NET中的long不是reference type,因此您不需要它。但是从您的方法签名中,我猜想它被用作隐藏的返回值,因此您需要对其进行写入,因此确实需要一个引用。由于它不是.NET中的引用类型,因此您将需要另一个修饰符以使该值可以传回:

// equivalent C# signature:
// bool GetPort(ref long nPort) 

bool PlayM4Wrapper::GetPort(long% nPort) 
{
    LONG local = nPort;

    if(_mLoader->m_PlayM4GetPort(&local))
    {
        nPort = local;
        return true;
    }

    return false;
}

显然,%被称为tracking reference