gpt4 book ai didi

c++ - C++/CLI 中 long^ 到 LONG* 的转换

转载 作者:太空狗 更新时间:2023-10-29 21:32:49 26 4
gpt4 key购买 nike

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

dll中的函数头如下:

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

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

bool PlayM4Wrapper::GetPort(long^ nPort);

据我所知,circunflex 符号 (^) 表示它是指向参数 ( 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);
}

谁能帮我解决这个问题?我应该如何编写这个包装函数?

谢谢。

最佳答案

From what I've understood, the circunflex sign (^) means that is a pointer to the argument

不是在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 .

关于c++ - C++/CLI 中 long^ 到 LONG* 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com