【问题标题】:long^ to LONG* conversion in C++/CLIC++/CLI 中的 long^ 到 LONG* 的转换
【发布时间】:2018-12-10 13:51:04
【问题描述】:

我有一个 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);
}

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

谢谢。

【问题讨论】:

  • 我认为 ^ 表示对 gc 管理对象的引用,在这种情况下它被装箱很长。所以你可能应该使用普通的局部变量::LONG lport; if(FALSE != _mLoader-&gt;m_PlayM4GetPort(&amp;lport)) { nPort = lport; return true; } else { nPort = 0; return false; }
  • 这样会编译,很好。但它现在在 DLL 中抛出 System.AccessViolationException :( 。这可能与最后一个错误有关吗?
  • 也许你在调用这个函数时没有分配nPort对象?
  • 请注意在这种情况下更改函数签名仍然有意义。获得 FALSE 返回值是您几乎不应该传递的东西。没有端口,接下来发生的任何事情都行不通。所以抛出一个异常。

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


【解决方案1】:

据我了解,圆形符号 (^) 表示它是指向参数的指针

在 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

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多