C++ cli C+中的void*到Object^+/CLI 我正在研究从C++中封装大量的.h和.LB文件到托管C++,最终作为引用的.dll在C</p>中使用。 一些本地C++函数具有返回类型的空隙*。当我将值传递回调用代码时,我不确定如何处理这个问题。例如:如果一个C#应用程序调用我的dll包装器,我从本机调用返回什么: void* start(ThreadFunc,void *, unsigned *);

C++ cli C+中的void*到Object^+/CLI 我正在研究从C++中封装大量的.h和.LB文件到托管C++,最终作为引用的.dll在C</p>中使用。 一些本地C++函数具有返回类型的空隙*。当我将值传递回调用代码时,我不确定如何处理这个问题。例如:如果一个C#应用程序调用我的dll包装器,我从本机调用返回什么: void* start(ThreadFunc,void *, unsigned *);,c++-cli,wrapper,void-pointers,C++ Cli,Wrapper,Void Pointers,我目前正试图在一个通用系统::Object^中装箱,但运气不佳。这是包装中的调用: m_NativeThread->start(cb, GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(), static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer()))); m_NativeThread->start

我目前正试图在一个通用系统::Object^中装箱,但运气不佳。这是包装中的调用:

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

有人能提供解决方案吗?

你能把它变成一个IntPtr吗?如果托管代码需要查看void*中的数据,您希望客户端如何处理void*?

不能将void*强制转换为非托管 内存到托管对象引用。 要将其转换为托管内存, 您必须使用Marshal.Copy()或 Marshal.PtrToStructure()。这是我的意愿 当然,只有你知道类型才行 void*指向的数据的。

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

如果您的 托管代码不需要看到什么 是的,只是把它传回到 非托管代码。


老实说,我不知道他们会怎么处理空虚。我想如果我知道为什么在第一个平面上用void*来声明它会有所帮助……void*的目的是什么?为什么/何时使用它?空指针是指向未知类型的指针,有点像.NET中对System.Object的引用,但没有关联的运行时类型信息(也就是说,您无法查询其类型的引用)。我的问题措辞很糟糕,我的意思是:“start()函数期望您使用它的返回值做什么?”因为如果它从未被使用过,您可以丢弃它。如果它用作句柄,例如终止线程,我会将其公开为IntPtr。