这是一个类似的问题这个帖子 https://stackoverflow.com/questions/1154929/void-to-object-in-c-cli,我一直无法用它来解决我的问题。我在这里包含了一些代码,希望能帮助某人了解其他帖子所传达的信息。
我想编写一个 CLI/C++ 方法,它可以将 void 指针作为参数并返回它指向的托管对象(我知道其类型)。我有一个托管结构:
public ref struct ManagedStruct { double a; double b;};
我正在尝试编写的方法,它将指向托管结构的空指针作为参数并返回该结构。
ManagedStruct^ VoidPointerToObject(void* data)
{
Object^ result = Marshal::PtrToStructure(IntPtr(data), Object::typeid);
return (ManagedStruct^)result;
}
该方法在这里被调用:
int main(array<System::String ^> ^args)
{
// The instance of the managed type is created:
ManagedStruct^ myData = gcnew ManagedStruct();
myData->a = 1; myData->b = 2;
// Suppose there was a void pointer that pointed to this managed struct
void* voidPtr = &myData;
//A method to return the original struct from the void pointer
Object^ result = VoidPointerToObject(voidPtr);
return 0;
}
它崩溃在VoidPointerToObject
调用时的方法PtrToStructure
,出现错误:指定的结构必须是 blittable 或具有布局信息
我知道这是一件奇怪的事情,但这种情况我已经遇到过几次,特别是当非托管代码对托管代码进行回调并传递 void* 作为参数时。
(原解释如下)
如果您需要将托管句柄作为void*
通过本机代码,您应该使用
void* voidPtr = GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer();
// ...
GCHandle h = GCHandle::FromIntPtr(IntPtr(voidPtr));
Object^ result = h.Target;
h.Free();
(或使用 C++/CLI 帮助程序类gcroot
)
Marshal::PtrToStructure
致力于值类型.
在 C++/CLI 中,这意味着value class
or value struct
。您正在使用ref struct
,这是一个参考类型尽管使用了关键字struct
.
一个相关问题:
void* voidPtr = &myData;
不指向对象,它指向句柄。
为了创建指向托管堆上数据的本机指针,您需要使用固定。因此,之间的转换void*
and Object^
并不像乍一看那么有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)