2009-06-15 6 views
5

comment peut-on utiliser un Safearray pour passer un tableau de types personnalisés (une classe contenant uniquement les propriétés) de C++ C#? Est-ce que l'utilisation du type VT_RECORD est la bonne façon de le faire?Le passage d'un SAFEARRAY de types personnalisés de C++ C#

J'essaye de la façon suivante, mais SafeArrayPutElement renvoie une erreur en essayant de remplir le safearray la référence au tableau de classes obtient le code managé comme NULL.

J'ai quelque chose comme ce qui suit dans le monde géré:

[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; } 
} 

monde Unmanaged:

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]++; 
} 

S'il vous plaît noter que le je pu utiliser le SafeArray pour passer d'autres tableaux de BSTR sans problèmes entre les deux applications. Donc, c'est quelque chose de particulier à passer une structure.

Stefano

+0

Quelle est l'erreur? – fretje

Répondre

3

Je ne suis pas sûr si je comprends votre bonne question, mais peut-être vous besoin VT_DISPATCH? Je pense que si vous voulez travailler avec VT_RECORD, votre struct devrait effectivement être un struct (pas une classe) et doit également l'attribut [StructLayout(LayoutKind.Sequential)].

Modifier: Peut-il s'agir de l'erreur DISP_E_BADINDEX? Quel est exactement indices dans votre code? Que contient-il? (Vous savez que la signature de SafeArrayPutElement exige qu'il soit un pointeur, non?)

+0

Tout ce qui fait le travail est ok avec moi;) Juddging seulement du nom, VT_RECORD semblait être l'option la plus proche de ce que je suis en train d'accomplir. J'ai juste besoin d'être capable d'exposer cette structure/classe au code non managé pour le peupler. –

+0

Pouvez-vous élaborez sur COMMENT votre solution actuelle échoue exactement? Un message d'erreur peut-être? – fretje

+0

* ;-) cours hors attarder – fretje