2017-11-14 3 views
0

I COM-Bibliothek bin mit und ich habe Schnittstelle in TLH-Datei wie folgt definiert:SAFEARRAY von COM-Objekten

_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface)); 

Dann erstelle ich Objekt:

//1st object 
IMyInterfacePtr pMyInterface1; 
pMyInterface1.CreateInstance(CLSID_MyInterface); 
pMyInterface1->call_some_method(BSTR("pass example text1")); 

//2nd object 
IMyInterfacePtr pMyInterface2; 
pMyInterface2.CreateInstance(CLSID_MyInterface); 
pMyInterface2->call_some_method(BSTR("pass example text2")); 

Dann brauche ich SAFEARRAY erstellen von diesen Objekten:

SAFEARRAYBOUND rgsabound[1]; 
rgsabound[0].cElements = 2; 
rgsabound[0].lLbound = 0; 

SAFEARRAY *pData = SafeArrayCreate(VT_VARIANT, 1, rgsabound); 

LONG i = 0; 
SafeArrayPutElement(pData, &i, pMyInterface1); 
i = 1; 
SafeArrayPutElement(pData, &i, pMyInterface2); 

Aber leider nach diesem Array Elemente bleibt leer. Welches ist der richtige Weg, um dieses Array von IMyInterfacePtr-Objekten zu füllen?

Vielen Dank für Hilfe.

------ EDIT ------

Danke für Antworten. Ich habe diese Lösungen aus Kommentaren versucht, aber leider funktioniert es immer noch nicht. Ich muss dieses Array von COM-Methode an COM zurücksenden. So Erstellen ich ein neues Objekt:

IResponsePtr pResponse;//This is also smart com ptr 
pResponse.CreateInstance(CLSID_Response); 
pResponse->put_Response(pData);//safearray here 

wo put_Response hat Unterschrift folgende: (SAFEARRAY *value). Leider während das Aufrufen dieser Methode erhalte ich die folgende Ausnahme:

First-chance exception at 0x76BEC54F in MyApp.exe: Microsoft C++ exception: EEException at memory location 0x0042F144. 
First-chance exception at 0x76BEC54F (KernelBase.dll) in MyApp.exe: 0xE0434352 (parameters: 0x80131533, 0x00000000, 0x00000000, 0x00000000, 0x72D30000). 

Irgendwelche Ideen, was mit diesem SAFEARRAY ptr falsch sein könnte?

+0

Für die Ausnahme zeigen Sie den Callstack. Wenden Sie sich an den Entwickler der COM-Komponente. Vielleicht sind deine Schnittstellen falsch ... zu vielen Möglichkeiten ... Auch deine Bearbeitung ist eine neue Frage. Es hat nichts mit deinem Original zu tun. Markieren Sie diese Frage als beantwortet. Erstellen Sie eine neue Frage und zeigen Sie den neuen Code, den Sie haben. – xMRi

Antwort

3

Verwenden Sie nicht die Zeiger. Speichern Sie die Zeiger in der Variante zuerst und kopieren Sie dann die Daten.

VARIANT v; 
v.vt = VT_UNKNOWN; 
v.punkVal = pMyInterface1; 
SafeArrayPutElement(pData, &i, &v); 

SafeArrayPutElement verwendet AddRef intern, wenn es kopiert die Variante.

+0

Sie sollten VariantClear in diesem Beispielcode nicht aufrufen, das SafeArray muss eine Referenz auf der Schnittstelle beibehalten (diese Referenz wird entfernt, wenn das SafeArray deaktiviert ist). Oder rufe QueryInterface zuerst auf, um v.punkVal zu definieren (was ich hier empfehlen würde, das Zuweisen von Zeigern ist gefährlich) –

+0

Du hast Recht ... meine Antwort geändert! Der Benutzer verwendet einen intelligenten Zeiger, den ich nicht gesehen habe. – xMRi

Verwandte Themen