我如何发送一个管理对象,以本地函数来使用它? [英] How can I send a managed object to native function to use it?
本文介绍了我如何发送一个管理对象,以本地函数来使用它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何发送一个管理对象,以本地函数来使用它?
无效managed_function()
{
对象^ OBJ = gcnew对象();
无效* PTR = OBJ ??? //如何将管理对象为void *?
unmanaged_function(PTR);
}
//参数类型应该是void *的,我不能改变的类型。
//这个函数是本地人,但它使用的管理的对象。由于PTR类型不能
//对象^我把它叫做非托管函数。
无效unmanaged_function(无效* PTR)
{
对象^ OBJ = PTR ??? //如何void *的转换为托管对象?
obj-> SomeManagedMethods();
}
解决方案
在谷歌上搜索,阅读MSDN和尝试一些codeS,我发现这种方法将管理对象传递给非托管函数。
这些方法展示如何转换对象^为void *,并转换无效*为Object ^。
使用命名空间系统;
使用命名空间系统:运行:: InteropServices;
无效managed_function()
{
对象^ OBJ = gcnew对象();
//转换对象^为void *
的GCHandle手柄=的GCHandle ::的Alloc(OBJ);
IntPtr的指针=的GCHandle :: ToIntPtr(手柄);
无效* PTR = pointer.ToPointer();
unmanaged_function(PTR);
handle.Free();
}
无效unmanaged_function(无效* PTR)
{
//转换的void *到对象^
IntPtr的指针(PTR);
的GCHandle手柄=的GCHandle :: FromIntPtr(指针);
对象^ OBJ =(对象^)handle.Target;
obj-> SomeManagedMethods();
}
请注意:如果unmanaged_function有变量参数,这种方法是行不通的。
How can I send a managed object to native function to use it?
void managed_function()
{
Object^ obj = gcnew Object();
void* ptr = obj ??? // How to convert Managed object to void*?
unmanaged_function(ptr);
}
// The parameter type should be void* and I can not change the type.
// This function is native but it uses managed object. Because type of ptr could not be
// Object^ I called it "Unmanaged Function".
void unmanaged_function(void* ptr)
{
Object^ obj = ptr ??? // How to convert void* to Managed object?
obj->SomeManagedMethods();
}
解决方案
After googling, reading MSDN and try some codes, I found this method to pass a managed object to an unmanaged function.
These methods show how to convert Object^ to void* and convert void* to Object^.
using namespace System;
using namespace System::Runtime::InteropServices;
void managed_function()
{
Object^ obj = gcnew Object();
// Convert Object^ to void*
GCHandle handle = GCHandle::Alloc(obj);
IntPtr pointer = GCHandle::ToIntPtr(handle);
void* ptr = pointer.ToPointer();
unmanaged_function(ptr);
handle.Free();
}
void unmanaged_function(void* ptr)
{
// Convert void* to Object^
IntPtr pointer(ptr);
GCHandle handle = GCHandle::FromIntPtr(pointer);
Object^ obj = (Object^)handle.Target;
obj->SomeManagedMethods();
}
Note: if "unmanaged_function" has variable arguments, this method won't work.
这篇关于我如何发送一个管理对象,以本地函数来使用它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文