كيف يمكنني إرسال كائن مدار إلى الوظيفة الأصلية لاستخدامه?

StackOverflow https://stackoverflow.com/questions/7371775

سؤال

كيف يمكنني إرسال كائن مدار إلى الوظيفة الأصلية لاستخدامه?

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();
}
هل كانت مفيدة؟

المحلول 2

بعد البحث في googling وقراءة MSDN وتجربة بعض الرموز ، وجدت هذه الطريقة لتمرير كائن مُدار إلى وظيفة غير مُدارة.

توضح هذه الطرق كيفية تحويل Object ^ إلى void * وتحويل void * إلى Object ^.

Genacodicetagpre

ملاحظة: إذا كانت "unmanaged_function" بها وسيطات متغيرة ، فلن تعمل هذه الطريقة.

نصائح أخرى

نظافة والنهج الأفضل هو استخدام غكروت قالب.

اقتباس من مسن كيف:أعلن مقابض في أنواع الأم:

يتم تنفيذ قالب غكروت باستخدام مرافق نظام فئة القيمة:: وقت التشغيل::إنتيروبسرفيسز:: غشاندل ، الذي يوفر "مقابض" في كومة القمامة التي تم جمعها.لاحظ أن المقابض نفسها ليست القمامة التي تم جمعها ويتم تحريرها عندما لم تعد قيد الاستخدام من قبل المدمر في فئة غكروت (لا يمكن استدعاء هذا المدمر يدويا).إذا قمت بإنشاء مثيل كائن غكروت على كومة الذاكرة المؤقتة الأصلية ، يجب استدعاء حذف على هذا المورد.

نموذج التعليمات البرمجية تكييفها للاستخدام gcroot (رمز يجمع ويعمل باستخدام فس 2010):

using namespace System;
using namespace System::Runtime::InteropServices;

public ref class SomeManagedObject
{
public:
    String^ data;
    SomeManagedObject()
    {
        data = "Initial Data";
    }
    void SomeManagedMethods()
    {
        data = "Changed Data";
    }
};

void unmanaged_function(void* ptr) 
{
    gcroot<SomeManagedObject^>& obj = *((gcroot<SomeManagedObject^>*)ptr);
    obj->SomeManagedMethods();
} 

void managed_function() 
{ 
    // gcroot handles all allocations/deallocation and convertions
    gcroot<SomeManagedObject^>* pObj = new gcroot<SomeManagedObject^>();

    *pObj = gcnew SomeManagedObject();
    unmanaged_function(pObj);

    delete pObj;
} 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top