【问题标题】:void* to Object^ in C++/CLIvoid* 到 C++/CLI 中的 Object^
【发布时间】:2010-11-12 09:35:46
【问题描述】:

我正在努力将大量 .h 和 .lib 文件从原生 C++ 包装到托管 C++ 以最终用作 C# 中的引用 .dll。

一些本机 C++ 函数的返回类型为 void*。当我将值传回我的调用代码时,我不确定如何处理这个问题。例如:如果一个 C# 应用程序调用我的 dll 包装器,我从本机调用返回什么:

void* start(ThreadFunc,void *, unsigned *);

我目前正在尝试将返回装箱在通用 System::Object^ 中,但没有运气。这是包装器中的调用:

m_NativeThread->start(cb, 
        GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(),
        static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer())));

谁能提供解决方案?

【问题讨论】:

    标签: c++-cli wrapper void-pointers


    【解决方案1】:

    如果您的托管代码需要查看 void* 中的数据:

    您不能将 void* 强制转换为非托管 内存到托管对象引用。 要将其转换为托管内存, 你必须使用 Marshal.Copy() 或 Marshal.PtrToStructure()。那个意志 当然只有在你知道类型的情况下才有效 void* 指向的数据。 source

    如果您的托管代码不需要查看 void* 中的数据:

    如果您将其存储在 IntPtr 中 托管代码不需要查看什么 它是并且只是将它传递回 以后的非托管代码。 source

    【讨论】:

      【解决方案2】:

      你能把它变成一个 IntPtr 吗?您希望客户如何处理 void*?

      【讨论】:

      • 老实说,我不知道他们会对 void * 做什么。我想如果我知道为什么首先用 void* 声明它会有所帮助... void * 的目的是什么?为什么/何时使用它?
      • 空指针是一个指向未知类型的指针,有点像 .NET 中对 System.Object 的引用,但没有相关的运行时类型信息(也就是说,您无法查询其类型的参考)。我的问题措辞很糟糕,我的真正意思是:“start() 函数希望您使用它的返回值做什么?”因为如果它从未使用过,你可以丢弃它。如果它被用作手柄,例如终止线程,我会将其公开为 IntPtr。
      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2011-08-28
      • 2016-09-24
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多