2009-10-09 7 views
1

Je dois retourner un tableau de structure (classes) d'une bibliothèque C# à un client C++ non géré. Ceci est la fonction dans la bibliothèque C#:Gestion d'un SAFEARRAY retourné à partir du serveur C#

[ComVisible(true)] 
[Serializable] 
public sealed class RetrieverProxy : IRetrieverProxy 
{ 
    public IMyRecord[] RetrieveMyRecords(long[] ids) 
    { 
     IList<IMyRecord> result = new List<IMyRecord>(); 
     for (int i = 0; i < ids.Count(); i++) 
     { 
      result.Add(new MyRecord() 
      { 
       // some test data 
      }); 
     } 

     return result.ToArray(); 
    } 
} 

MyRecord lui-même contient un éventail de structures, qui sont également visibles COM et contiennent un double et un champ DateTime.

Je reçois l'emballage de suivi de regasm:

inline SAFEARRAY * IRetrieverProxy::RetrieveMyRecords (SAFEARRAY * ids) { 
    SAFEARRAY * _result = 0; 
    HRESULT _hr = raw_RetrieveMyRecords(ids, &_result); 
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); 
    return _result; 
} 

À partir du code client, j'appelle la bibliothèque, comme ce qui suit:

SAFEARRAY *pMyRecordsSA; 
SAFEARRAY *pIds; 
// omitting pIds initialization, because from the library I can see 
// that they are ok 
pMyRecordsSA = pIRetrieverProxy->RetrieveMyRecords(pIds); 

Le problème que j'ai est de savoir comment récupérer les résultats qui sont maintenant stockés dans pMyRecordsSA. Je l'ai essayé ce qui suit, mais je cela ne fonctionne pas:

IMyRecordPtr pIMyRecords(__uuidof(MyRecord)); 
    HRESULT hr = SafeArrayAccessData(pMyRecordsSA, (void**)&pIMyRecords); 

mais en essayant d'utiliser le pointeur pIMyRecords donne une violation d'accès (hr est 0K).

Des idées? Je suis vraiment coincé là-dessus.

Répondre

2

Il s'est avéré que j'avais juste besoin d'un "autre niveau d'indirection". C'est-à-dire, un pointeur vers un pointeur par rapport à un simple pointeur.

IMyRecords** pIMyRecords; 
HRESULT hr = SafeArrayAccessData(pMyRecordsSA, (void**)&pIMyRecords); 

Cela a fait l'affaire.

0

Jetez un oeil à CComSafeArray cela pourrait vous faire gagner du temps.

Questions connexes