我有一个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);
}
有人可以帮我吗?我应该如何编写该包装器函数?
谢谢。
答案 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。