El paso de un safearray de tipos personalizados de C ++ a C #
-
13-09-2019 - |
Pregunta
¿cómo se puede utilizar un Safearray
a pasar una matriz de tipos personalizados (una clase que contenga sólo las propiedades) de C ++ a C #? Se utiliza el tipo de VT_RECORD
la forma correcta de hacerlo?
Estoy tratando de la siguiente manera, pero la referencia a la variedad de clases llega al código administrado como NULL. SafeArrayPutElement
devuelve un error al intentar llenar el safearray
Tengo algo como lo siguiente en el mundo administrado:
[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; }
}
No administrado mundo:
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]++;
}
Tenga en cuenta que la opción Soy capaz de utilizar la SafeArray
pase a otras matrices de BSTR
sin problemas entre las dos aplicaciones. Así que esto es algo peculiar de pasar una estructura.
Stefano
Solución
No estoy realmente seguro si entiendo su pregunta correcta, pero tal vez hace falta que le VT_DISPATCH
?
Creo que si se quiere que funcione con VT_RECORD
, a continuación, su estructura debería ser en realidad una estructura (no una clase) y también necesita el atributo [StructLayout(LayoutKind.Sequential)]
.
Editar : ¿Puede ser que el error que tienes primero fue DISP_E_BADINDEX
? Lo que se indices
exactamente en el código? ¿Qué contiene? (Usted sabe que la firma de SafeArrayPutElement
requiere que sea un puntero , ¿verdad?)