【发布时间】: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->m_PlayM4GetPort(&lport)) { nPort = lport; return true; } else { nPort = 0; return false; } -
这样会编译,很好。但它现在在 DLL 中抛出 System.AccessViolationException :( 。这可能与最后一个错误有关吗?
-
也许你在调用这个函数时没有分配
nPort对象? -
请注意在这种情况下更改函数签名仍然有意义。获得 FALSE 返回值是您几乎不应该传递的东西。没有端口,接下来发生的任何事情都行不通。所以抛出一个异常。