C++ C+中的long^到long*转换+/CLI
我有一个DLL,我需要写一个包装。我们的目标是在C#.NET应用程序中使用它,所以我需要使用C++/CLI(以前从未读过,所以我是新手) dll中的函数头如下所示:C++ C+中的long^到long*转换+/CLI,c++,dll,c++-cli,wrapper,C++,Dll,C++ Cli,Wrapper,我有一个DLL,我需要写一个包装。我们的目标是在C#.NET应用程序中使用它,所以我需要使用C++/CLI(以前从未读过,所以我是新手) dll中的函数头如下所示: extern "C" __declspec(dllexport) BOOL __stdcall PlayM4_GetPort(LONG* nPort); 我在包装器中定义的标题如下: 据我所知,circunflex符号(^)表示指向参数(nPort)的指针。因此,我试图编写以下代码,但我得到了一个转换错误错误C2664'BOOL
extern "C" __declspec(dllexport) BOOL __stdcall PlayM4_GetPort(LONG* nPort);
我在包装器中定义的标题如下:
据我所知,circunflex符号(^)表示指向参数(nPort
)的指针。因此,我试图编写以下代码,但我得到了一个转换错误错误C2664'BOOL(LONG*)':el argumento 1 no puede convertirse de'System::Int32^'a'LONG*'
。
bool PlayM4Wrapper::GetPort(长^nPort)
{
BOOL ret=\u mLoader->m\u PlayM4GetPort(nPort);
返回静态_-cast(ret);
}
有人能帮我吗?我应该如何编写这个包装器函数
谢谢
据我所知,circunflex符号(^)意味着它是指向参数的指针
不在C++的指针理解中。是的,它是对对象实例的引用。但是这个引用是你在C++中所不能使用的。它不是指针,您不能将其用作指针。首先,.NET中的
long
不是,所以您不需要它。但是从你的方法签名来看,我猜它被用作一个隐藏的返回值,所以你需要写入它,因此确实需要一个引用。由于它不是.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;
}
相应地,
%
被称为a 我认为,^
意味着对gc管理对象的引用,在本例中,该对象被长框括起来。因此,您可能应该使用正规局部变量::LONG lport;如果(FALSE!=\u mLoader->m\u PlayM4GetPort(&lport)){nPort=lport;return true;}否则{nPort=0;return FALSE;}
它将以这种方式编译,这很好。但它现在在DLL中抛出System.AccessViolationException:(.这可能与最后一个错误有关吗?调用此函数时,可能您没有分配nPort
对象?请注意,在这种情况下更改函数签名仍然有意义。获取错误的返回值几乎是不应该传递的。没有端口,接下来发生的任何事情都不会起作用。所以抛出一个异常。
bool PlayM4Wrapper::GetPort(long^ nPort)
{
BOOL ret =_mLoader->m_PlayM4GetPort(nPort);
return static_cast<BOOL>(ret);
}
// 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;
}