تمرير Safearray من أنواع مخصصة من C ++ إلى C #
-
13-09-2019 - |
سؤال
كيف يمكن للمرء استخدام 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
يتطلب أن يكون مؤشرا، أليس كذلك؟)