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.