我如何发送一个管理对象,以本地函数来使用它? [英] How can I send a managed object to native function to use it?

查看:174
本文介绍了我如何发送一个管理对象,以本地函数来使用它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何发送一个管理对象,以本地函数来使用它?

 无效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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆