Toon posts:

[COM/C++] Fire event vanuit andere thread

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een COM object gemaakt, die een worker thread start. Deze worker thread moet events kunnen firen. Ik krijg het momenteel alleen voor elkaar om events te firen vanuit de primaire thread. Ik heb enkele dingen gelezen over de functie CoMarshalInterThreadInterfaceInStream, maar ik krijg het niet voor elkaar.

Ik heb een dispinterface genaamd _IMP2ExportEvents, waarin de mogelijke events beschreven staan: (OnProgress, OnFinished, OnStatus)

Als eerste argument moet ik de interfaceIID meegeven van de interface die ik binnen de andere thread wil gaan gebruiken. Ik kan niet de interfaceiid meegeven van mijn COM object, aangezien hier niet de events in gedeclareerd staan. Ik maak gebruik van de automatisch gegenereerde proxy door visual studio 6.

Verwijderd

Topicstarter
Ik ben inmiddels wel zover dat ik invoke kan aanroepen op de event dispinterface. Hoe kan ik hier vermijden dat ik lelijke calls als pointer->Invoke(0x3, ....); moet doen?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik snap jouw verhaal niet helemaal dus ik geef maar even een simpele uitleg over de theorie van die functie:

Als thread A een interface wil aanroepen die gecreerd is in thread B zal thread B deze interface in moeten paken in een IStream met CoMarshalInterThreadInterfaceInStream, doorgeven aan thread A en die pakt m weer uit met CoGetInterfaceAndReleaseStream.
Verwijderd schreef op dinsdag 07 december 2004 @ 13:10:
Ik ben inmiddels wel zover dat ik invoke kan aanroepen op de event dispinterface. Hoe kan ik hier vermijden dat ik lelijke calls als pointer->Invoke(0x3, ....); moet doen?
De interface QueryInterfacen naar de juiste?

[ Voor 32% gewijzigd door LordLarry op 07-12-2004 13:11 ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Er bestaat blijkbaar alleen een dispinterface voor het event gebeuren, dus ik zal toch op de 1 of andere manier Invoke moeten aanroepen. Misschien kan ik de gegenereerde proxy hergebruiken?

Verwijderd

Topicstarter
Het eerste argument van CoMarshalInterThreadInterfaceInStream is niet juist... welk argument moet ik hier meegeven? Ik kan op het internet ook nergens een goed voorbeeld vinden van dit gebeuren, alhoewel het mij toch een veel voorkomend probleem lijkt?
code:
1
2
3
4
5
6
7
8
9
struct ExportParms {
  _IMP2ExportEvents *pMP2ExportEvents;
  LPSTREAM pStm;
};

CoMarshalInterThreadInterfaceInStream(
  IID_IMP2Export,
  pExportParms->pMP2ExportEvents,
  &pExportParms->pStm);

[ Voor 31% gewijzigd door Verwijderd op 07-12-2004 13:20 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik heb alleen ervaring met Delphi en COM, dus hoe dat in VC zit kan ik je niet echt zeggen: Misschien helpen de volgende pagina's je verder?

http://msdn.microsoft.com...cessmarshalinghelpers.asp

http://www.experts-exchan...Cplusplus/Q_20120284.html

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1