سؤال

كيف يمكن للمرء استخدام Safearray لتمرير مجموعة من أنواع مخصصة (فئة تحتوي على خصائص فقط) من C ++ إلى C #؟ يستخدم VT_RECORD اكتب الطريقة الصحيحة للقيام بذلك؟

أحاول بالطريقة التالية، لكن SafeArrayPutElement إرجاع خطأ عند محاولة ملء Safearray المرجع إلى مجموعة الصفوف يحصل على التعليمات البرمجية المدارة كغامة.

لدي شيء مثل ما يلي في العالم المدار:

[ComVisible(true)]
public interface IStatistics
{
    double Mean { get; set; } 
    double StdDev { get; set; } 
}

[Serializable]
[ComVisible(true)]
public class Statistics : IStatistics
{
    public Mean { get; set; }
    public double StdDev { get; set; } 
}

عالم غير مدار:

HRESULT hr = CoInitialize(NULL);
...
SAFEARRAY *pEquationsStatistics;

// common dimensions for all arrays
SAFEARRAYBOUND dimensions[1];  
dimensions[0].cElements = 2;   
dimensions[0].lLbound = 0;    

pEquationsStatistics = SafeArrayCreate(VT_RECORD, 1, dimensions);
...

for (long i = 0; i < dimensions[0].cElements; i++)
{
    long indices[1];
    indices[0] = 0;

    ... 

    // Equation statistics
    IStatisticsPtr pIStatistics(__uuidof(Statistics)); 
    pIStatistics->PutMean(1.0); // so far so good

    result = SafeArrayPutElement(pEquationsStatistics, indices, pIStatistics);

    ...
    indices[0]++;
}

يرجى ملاحظة أن أنا قادر على استخدام SafeArray لتمرير صفائف أخرى من BSTR مع عدم وجود مشاكل بين التطبيقين. لذلك هذا شيء غريب من اجتياز هيكل.

ستيفانو

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

المحلول

لست متأكدا حقا إذا فهمت سؤالك الصحيح، لكن ربما تحتاج VT_DISPATCHب أعتقد إذا كنت تريد أن تعمل مع VT_RECORD, ، ثم يجب أن تكون بنية الخاص بك في الواقع هيكل (وليس فئة) ويحتاج أيضا [StructLayout(LayoutKind.Sequential)] ينسب.

تعديل: هل يمكن أن يكون الخطأ الذي حصلت عليه لأول مرة DISP_E_BADINDEXب ما هو بالضبط indices في الكود الخاص بك؟ ماذا تحتوي؟ (أنت تعرف أن توقيع SafeArrayPutElement يتطلب أن يكون مؤشرا، أليس كذلك؟)

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