سؤال

ولدي. NET التجمع. ويحدث أن تكون مكتوبة في C ++ / CLI. أنا تعريض بعض الأشياء عن طريق COM. كل شيء يسير على ما يرام، ولكن لا أستطيع لحياة لي معرفة كيفية إرجاع مجموعة من الأشياء الخاصة بي من طريقة. في كل مرة أقوم به، وأنا أحصل على خطأ عدم تطابق نوع في وقت التشغيل. أستطيع العودة مجموعة من [إينتس] أو سلاسل على ما يرام.

وهنا صفي الرئيسية

[Guid("7E7E69DD-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
public ref class Foo sealed : IFoo
{
public:
    virtual array<IBar^>^ GetStuff();
}

[Guid("21EC1AAA-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]  
public interface class IFoo
{
public:
    virtual array<IBar^>^ GetStuff()
    {
        // For simplicity, return an empty array for now.
        return gcnew array<IBar^>(0);
    }
};

وهنا هي الطبقة أنا عائد

[Guid("43A37BD4-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]  
public interface class IBar
{
    // Completely empty class, just for testing.  
    //In real life, I would like to return two strings and an int.
};

[Guid("634708AF-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
[Serializable]
public ref class Bar : IBar
{
};

وهذا هو بلدي (الأصلي) رمز C ++ الذي يستدعي ما يلي:

MyNamespace::IFooPtr session(__uuidof(MyNamespace::Foo));
// For simplicity, don't even check the return.
session->GetStuff();

ودعوة GetStuff () يحصل لي _com_error 0x80020005 (DISP_E_TYPEMISMATCH). استطيع ان اقول يتم استدعاء أسلوب بلدي بشكل صحيح، انها مجرد أنه عندما الصافي / COM يذهب إلى مارشال عودة، ويغص بها. كما قلت، فإنه يعمل بشكل جيد مع صفائف [إينتس] أو سلاسل. ماذا علي أن أفعل لصفي للسماح له أن تعاد في مجموعة؟

وكما يحدث، صفي سيحتوي سوى بضع سلاسل وعدد صحيح (أي الطرق)، إذا كان هذا يجعل من أي أسهل. ومن الواضح أن حاولت العودة مجموعة والطبقات غير الفارغة التي تحتوي في الحقيقة على بعض البيانات، وهذا هو مجرد أبسط الحالات التي توضح المشكلة.

هل كانت مفيدة؟

المحلول

وتحتاج إلى تنفيذ IDispatch وطريقة Enumerator

public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top