2 * Modified for use with MPlayer, detailed CVS changelog at
3 * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
8 #include "wine/winerror.h"
13 static inline int unimplemented(const char* s
, void* p
)
15 Debug
printf("%s(%p) called (UNIMPLEMENTED)", s
, p
);
33 static long STDCALL
CEnumPins_Next(IEnumPins
* This
,
34 /* [in] */ unsigned long cMediaTypes
,
35 /* [size_is][out] */ IPin
** ppMediaTypes
,
36 /* [out] */ unsigned long* pcFetched
)
38 CEnumPins
* pin
= (CEnumPins
*)This
;
40 Debug
printf("CEnumPins_Next(%p) called\n", This
);
43 if (!pcFetched
&& (cMediaTypes
!=1))
48 //lcounter = ((CEnumPins*)This)->counter;
49 //lpin1 = ((CEnumPins*)This)->pin1;
50 //lpin2 = ((CEnumPins*)This)->pin2;
51 if (((pin
->counter
== 2) && pin
->pin2
)
52 || ((pin
->counter
== 1) && !pin
->pin2
))
63 *ppMediaTypes
= pin
->pin1
;
64 pin
->pin1
->vt
->AddRef((IUnknown
*)pin
->pin1
);
68 *ppMediaTypes
= pin
->pin2
;
69 pin
->pin2
->vt
->AddRef((IUnknown
*)pin
->pin2
);
77 static long STDCALL
CEnumPins_Skip(IEnumPins
* This
,
78 /* [in] */ unsigned long cMediaTypes
)
80 Debug
unimplemented("CEnumPins_Skip", This
);
84 static long STDCALL
CEnumPins_Reset(IEnumPins
* This
)
86 Debug
printf("CEnumPins_Reset(%p) called\n", This
);
87 ((CEnumPins
*)This
)->counter
= 0;
91 static long STDCALL
CEnumPins_Clone(IEnumPins
* This
,
92 /* [out] */ IEnumPins
** ppEnum
)
94 Debug
unimplemented("CEnumPins_Clone", This
);
98 static void CEnumPins_Destroy(CEnumPins
* This
)
104 IMPLEMENT_IUNKNOWN(CEnumPins
)
106 static CEnumPins
* CEnumPinsCreate(IPin
* p
, IPin
* pp
)
108 CEnumPins
* This
= (CEnumPins
*) malloc(sizeof(CEnumPins
));
118 This
->vt
= (IEnumPins_vt
*) malloc(sizeof(IEnumPins_vt
));
124 This
->vt
->QueryInterface
= CEnumPins_QueryInterface
;
125 This
->vt
->AddRef
= CEnumPins_AddRef
;
126 This
->vt
->Release
= CEnumPins_Release
;
127 This
->vt
->Next
= CEnumPins_Next
;
128 This
->vt
->Skip
= CEnumPins_Skip
;
129 This
->vt
->Reset
= CEnumPins_Reset
;
130 This
->vt
->Clone
= CEnumPins_Clone
;
132 This
->interfaces
[0] = IID_IUnknown
;
133 This
->interfaces
[1] = IID_IEnumPins
;
144 static long STDCALL
CInputPin_Connect(IPin
* This
,
145 /* [in] */ IPin
* pReceivePin
,
146 /* [in] */ AM_MEDIA_TYPE
* pmt
)
148 Debug
unimplemented("CInputPin_Connect", This
);
152 static long STDCALL
CInputPin_ReceiveConnection(IPin
* This
,
153 /* [in] */ IPin
* pConnector
,
154 /* [in] */ const AM_MEDIA_TYPE
*pmt
)
156 Debug
unimplemented("CInputPin_ReceiveConnection", This
);
160 static long STDCALL
CInputPin_Disconnect(IPin
* This
)
162 Debug
unimplemented("CInputPin_Disconnect", This
);
166 static long STDCALL
CInputPin_ConnectedTo(IPin
* This
,
167 /* [out] */ IPin
** pPin
)
169 Debug
unimplemented("CInputPin_ConnectedTo", This
);
173 static long STDCALL
CInputPin_ConnectionMediaType(IPin
* This
,
174 /* [out] */ AM_MEDIA_TYPE
*pmt
)
176 Debug
printf("CInputPin_ConnectionMediaType(%p) called\n", This
);
179 *pmt
=((CInputPin
*)This
)->type
;
180 if (pmt
->cbFormat
> 0)
182 pmt
->pbFormat
=(char *)malloc(pmt
->cbFormat
);
183 memcpy(pmt
->pbFormat
, ((CInputPin
*)This
)->type
.pbFormat
, pmt
->cbFormat
);
188 static long STDCALL
CInputPin_QueryPinInfo(IPin
* This
,
189 /* [out] */ PIN_INFO
*pInfo
)
191 CBaseFilter
* lparent
=((CInputPin
*)This
)->parent
;
192 Debug
printf("CInputPin_QueryPinInfo(%p) called\n", This
);
193 pInfo
->dir
= PINDIR_OUTPUT
;
194 pInfo
->pFilter
= (IBaseFilter
*) lparent
;
195 lparent
->vt
->AddRef((IUnknown
*)lparent
);
196 pInfo
->achName
[0] = 0;
200 static long STDCALL
CInputPin_QueryDirection(IPin
* This
,
201 /* [out] */ PIN_DIRECTION
*pPinDir
)
203 *pPinDir
= PINDIR_OUTPUT
;
204 Debug
printf("CInputPin_QueryDirection(%p) called\n", This
);
208 static long STDCALL
CInputPin_QueryId(IPin
* This
,
209 /* [out] */ unsigned short* *Id
)
211 Debug
unimplemented("CInputPin_QueryId", This
);
215 static long STDCALL
CInputPin_QueryAccept(IPin
* This
,
216 /* [in] */ const AM_MEDIA_TYPE
* pmt
)
218 Debug
unimplemented("CInputPin_QueryAccept", This
);
222 static long STDCALL
CInputPin_EnumMediaTypes(IPin
* This
,
223 /* [out] */ IEnumMediaTypes
** ppEnum
)
225 Debug
unimplemented("CInputPin_EnumMediaTypes", This
);
229 static long STDCALL
CInputPin_QueryInternalConnections(IPin
* This
,
230 /* [out] */ IPin
** apPin
,
231 /* [out][in] */ unsigned long *nPin
)
233 Debug
unimplemented("CInputPin_QueryInternalConnections", This
);
237 static long STDCALL
CInputPin_EndOfStream(IPin
* This
)
239 Debug
unimplemented("CInputPin_EndOfStream", This
);
244 static long STDCALL
CInputPin_BeginFlush(IPin
* This
)
246 Debug
unimplemented("CInputPin_BeginFlush", This
);
251 static long STDCALL
CInputPin_EndFlush(IPin
* This
)
253 Debug
unimplemented("CInputPin_EndFlush", This
);
257 static long STDCALL
CInputPin_NewSegment(IPin
* This
,
258 /* [in] */ REFERENCE_TIME tStart
,
259 /* [in] */ REFERENCE_TIME tStop
,
260 /* [in] */ double dRate
)
262 Debug
unimplemented("CInputPin_NewSegment", This
);
266 static void CInputPin_Destroy(CInputPin
* This
)
272 IMPLEMENT_IUNKNOWN(CInputPin
)
274 CInputPin
* CInputPinCreate(CBaseFilter
* p
, const AM_MEDIA_TYPE
* amt
)
276 CInputPin
* This
= (CInputPin
*) malloc(sizeof(CInputPin
));
285 This
->vt
= (IPin_vt
*) malloc(sizeof(IPin_vt
));
293 This
->vt
->QueryInterface
= CInputPin_QueryInterface
;
294 This
->vt
->AddRef
= CInputPin_AddRef
;
295 This
->vt
->Release
= CInputPin_Release
;
296 This
->vt
->Connect
= CInputPin_Connect
;
297 This
->vt
->ReceiveConnection
= CInputPin_ReceiveConnection
;
298 This
->vt
->Disconnect
= CInputPin_Disconnect
;
299 This
->vt
->ConnectedTo
= CInputPin_ConnectedTo
;
300 This
->vt
->ConnectionMediaType
= CInputPin_ConnectionMediaType
;
301 This
->vt
->QueryPinInfo
= CInputPin_QueryPinInfo
;
302 This
->vt
->QueryDirection
= CInputPin_QueryDirection
;
303 This
->vt
->QueryId
= CInputPin_QueryId
;
304 This
->vt
->QueryAccept
= CInputPin_QueryAccept
;
305 This
->vt
->EnumMediaTypes
= CInputPin_EnumMediaTypes
;
306 This
->vt
->QueryInternalConnections
= CInputPin_QueryInternalConnections
;
307 This
->vt
->EndOfStream
= CInputPin_EndOfStream
;
308 This
->vt
->BeginFlush
= CInputPin_BeginFlush
;
309 This
->vt
->EndFlush
= CInputPin_EndFlush
;
310 This
->vt
->NewSegment
= CInputPin_NewSegment
;
312 This
->interfaces
[0]=IID_IUnknown
;
322 static long STDCALL
CBaseFilter_GetClassID(IBaseFilter
* This
,
323 /* [out] */ CLSID
*pClassID
)
325 Debug
unimplemented("CBaseFilter_GetClassID", This
);
329 static long STDCALL
CBaseFilter_Stop(IBaseFilter
* This
)
331 Debug
unimplemented("CBaseFilter_Stop", This
);
335 static long STDCALL
CBaseFilter_Pause(IBaseFilter
* This
)
337 Debug
unimplemented("CBaseFilter_Pause", This
);
341 static long STDCALL
CBaseFilter_Run(IBaseFilter
* This
, REFERENCE_TIME tStart
)
343 Debug
unimplemented("CBaseFilter_Run", This
);
347 static long STDCALL
CBaseFilter_GetState(IBaseFilter
* This
,
348 /* [in] */ unsigned long dwMilliSecsTimeout
,
349 // /* [out] */ FILTER_STATE *State)
352 Debug
unimplemented("CBaseFilter_GetState", This
);
356 static long STDCALL
CBaseFilter_SetSyncSource(IBaseFilter
* This
,
357 /* [in] */ IReferenceClock
*pClock
)
359 Debug
unimplemented("CBaseFilter_SetSyncSource", This
);
363 static long STDCALL
CBaseFilter_GetSyncSource(IBaseFilter
* This
,
364 /* [out] */ IReferenceClock
**pClock
)
366 Debug
unimplemented("CBaseFilter_GetSyncSource", This
);
371 static long STDCALL
CBaseFilter_EnumPins(IBaseFilter
* This
,
372 /* [out] */ IEnumPins
**ppEnum
)
374 Debug
printf("CBaseFilter_EnumPins(%p) called\n", This
);
375 *ppEnum
= (IEnumPins
*) CEnumPinsCreate(((CBaseFilter
*)This
)->pin
, ((CBaseFilter
*)This
)->unused_pin
);
379 static long STDCALL
CBaseFilter_FindPin(IBaseFilter
* This
,
380 /* [string][in] */ const unsigned short* Id
,
381 /* [out] */ IPin
**ppPin
)
383 Debug
unimplemented("CBaseFilter_FindPin\n", This
);
387 static long STDCALL
CBaseFilter_QueryFilterInfo(IBaseFilter
* This
,
388 // /* [out] */ FILTER_INFO *pInfo)
391 Debug
unimplemented("CBaseFilter_QueryFilterInfo", This
);
395 static long STDCALL
CBaseFilter_JoinFilterGraph(IBaseFilter
* This
,
396 /* [in] */ IFilterGraph
* pGraph
,
397 /* [string][in] */ const unsigned short* pName
)
399 Debug
unimplemented("CBaseFilter_JoinFilterGraph", This
);
403 static long STDCALL
CBaseFilter_QueryVendorInfo(IBaseFilter
* This
,
404 /* [string][out] */ unsigned short** pVendorInfo
)
406 Debug
unimplemented("CBaseFilter_QueryVendorInfo", This
);
410 static IPin
* CBaseFilter_GetPin(CBaseFilter
* This
)
415 static IPin
* CBaseFilter_GetUnusedPin(CBaseFilter
* This
)
417 return This
->unused_pin
;
420 static void CBaseFilter_Destroy(CBaseFilter
* This
)
425 This
->pin
->vt
->Release((IUnknown
*)This
->pin
);
426 if (This
->unused_pin
)
427 This
->unused_pin
->vt
->Release((IUnknown
*)This
->unused_pin
);
431 IMPLEMENT_IUNKNOWN(CBaseFilter
)
433 CBaseFilter
* CBaseFilterCreate(const AM_MEDIA_TYPE
* type
, CBaseFilter2
* parent
)
435 CBaseFilter
* This
= (CBaseFilter
*) malloc(sizeof(CBaseFilter
));
441 This
->pin
= (IPin
*) CInputPinCreate(This
, type
);
442 This
->unused_pin
= (IPin
*) CRemotePinCreate(This
, parent
->GetPin(parent
));
444 This
->vt
= (IBaseFilter_vt
*) malloc(sizeof(IBaseFilter_vt
));
445 if (!This
->vt
|| !This
->pin
|| !This
->unused_pin
)
447 CBaseFilter_Destroy(This
);
451 This
->vt
->QueryInterface
= CBaseFilter_QueryInterface
;
452 This
->vt
->AddRef
= CBaseFilter_AddRef
;
453 This
->vt
->Release
= CBaseFilter_Release
;
454 This
->vt
->GetClassID
= CBaseFilter_GetClassID
;
455 This
->vt
->Stop
= CBaseFilter_Stop
;
456 This
->vt
->Pause
= CBaseFilter_Pause
;
457 This
->vt
->Run
= CBaseFilter_Run
;
458 This
->vt
->GetState
= CBaseFilter_GetState
;
459 This
->vt
->SetSyncSource
= CBaseFilter_SetSyncSource
;
460 This
->vt
->GetSyncSource
= CBaseFilter_GetSyncSource
;
461 This
->vt
->EnumPins
= CBaseFilter_EnumPins
;
462 This
->vt
->FindPin
= CBaseFilter_FindPin
;
463 This
->vt
->QueryFilterInfo
= CBaseFilter_QueryFilterInfo
;
464 This
->vt
->JoinFilterGraph
= CBaseFilter_JoinFilterGraph
;
465 This
->vt
->QueryVendorInfo
= CBaseFilter_QueryVendorInfo
;
467 This
->interfaces
[0] = IID_IUnknown
;
468 This
->interfaces
[1] = IID_IBaseFilter
;
470 This
->GetPin
= CBaseFilter_GetPin
;
471 This
->GetUnusedPin
= CBaseFilter_GetUnusedPin
;
482 static long STDCALL
CBaseFilter2_GetClassID(IBaseFilter
* This
,
483 /* [out] */ CLSID
* pClassID
)
485 Debug
unimplemented("CBaseFilter2_GetClassID", This
);
489 static long STDCALL
CBaseFilter2_Stop(IBaseFilter
* This
)
491 Debug
unimplemented("CBaseFilter2_Stop", This
);
495 static long STDCALL
CBaseFilter2_Pause(IBaseFilter
* This
)
497 Debug
unimplemented("CBaseFilter2_Pause", This
);
501 static long STDCALL
CBaseFilter2_Run(IBaseFilter
* This
, REFERENCE_TIME tStart
)
503 Debug
unimplemented("CBaseFilter2_Run", This
);
508 static long STDCALL
CBaseFilter2_GetState(IBaseFilter
* This
,
509 /* [in] */ unsigned long dwMilliSecsTimeout
,
510 // /* [out] */ FILTER_STATE *State)
513 Debug
unimplemented("CBaseFilter2_GetState", This
);
517 static long STDCALL
CBaseFilter2_SetSyncSource(IBaseFilter
* This
,
518 /* [in] */ IReferenceClock
* pClock
)
520 Debug
unimplemented("CBaseFilter2_SetSyncSource", This
);
524 static long STDCALL
CBaseFilter2_GetSyncSource(IBaseFilter
* This
,
525 /* [out] */ IReferenceClock
** pClock
)
527 Debug
unimplemented("CBaseFilter2_GetSyncSource", This
);
531 static long STDCALL
CBaseFilter2_EnumPins(IBaseFilter
* This
,
532 /* [out] */ IEnumPins
** ppEnum
)
534 Debug
printf("CBaseFilter2_EnumPins(%p) called\n", This
);
535 *ppEnum
= (IEnumPins
*) CEnumPinsCreate(((CBaseFilter2
*)This
)->pin
, 0);
539 static long STDCALL
CBaseFilter2_FindPin(IBaseFilter
* This
,
540 /* [string][in] */ const unsigned short* Id
,
541 /* [out] */ IPin
** ppPin
)
543 Debug
unimplemented("CBaseFilter2_FindPin", This
);
547 static long STDCALL
CBaseFilter2_QueryFilterInfo(IBaseFilter
* This
,
548 // /* [out] */ FILTER_INFO *pInfo)
551 Debug
unimplemented("CBaseFilter2_QueryFilterInfo", This
);
555 static long STDCALL
CBaseFilter2_JoinFilterGraph(IBaseFilter
* This
,
556 /* [in] */ IFilterGraph
* pGraph
,
558 const unsigned short* pName
)
560 Debug
unimplemented("CBaseFilter2_JoinFilterGraph", This
);
564 static long STDCALL
CBaseFilter2_QueryVendorInfo(IBaseFilter
* This
,
566 unsigned short** pVendorInfo
)
568 Debug
unimplemented("CBaseFilter2_QueryVendorInfo", This
);
572 static IPin
* CBaseFilter2_GetPin(CBaseFilter2
* This
)
577 static void CBaseFilter2_Destroy(CBaseFilter2
* This
)
579 Debug
printf("CBaseFilter2_Destroy(%p) called\n", This
);
581 This
->pin
->vt
->Release((IUnknown
*) This
->pin
);
587 IMPLEMENT_IUNKNOWN(CBaseFilter2
)
589 static GUID CBaseFilter2_interf1
=
590 {0x76c61a30, 0xebe1, 0x11cf, {0x89, 0xf9, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}};
591 static GUID CBaseFilter2_interf2
=
592 {0xaae7e4e2, 0x6388, 0x11d1, {0x8d, 0x93, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}};
593 static GUID CBaseFilter2_interf3
=
594 {0x02ef04dd, 0x7580, 0x11d1, {0xbe, 0xce, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x37}};
596 CBaseFilter2
* CBaseFilter2Create()
598 CBaseFilter2
* This
= (CBaseFilter2
*) malloc(sizeof(CBaseFilter2
));
604 This
->pin
= (IPin
*) CRemotePin2Create(This
);
606 This
->vt
= (IBaseFilter_vt
*) malloc(sizeof(IBaseFilter_vt
));
608 if (!This
->pin
|| !This
->vt
)
610 CBaseFilter2_Destroy(This
);
614 memset(This
->vt
, 0, sizeof(IBaseFilter_vt
));
615 This
->vt
->QueryInterface
= CBaseFilter2_QueryInterface
;
616 This
->vt
->AddRef
= CBaseFilter2_AddRef
;
617 This
->vt
->Release
= CBaseFilter2_Release
;
618 This
->vt
->GetClassID
= CBaseFilter2_GetClassID
;
619 This
->vt
->Stop
= CBaseFilter2_Stop
;
620 This
->vt
->Pause
= CBaseFilter2_Pause
;
621 This
->vt
->Run
= CBaseFilter2_Run
;
622 This
->vt
->GetState
= CBaseFilter2_GetState
;
623 This
->vt
->SetSyncSource
= CBaseFilter2_SetSyncSource
;
624 This
->vt
->GetSyncSource
= CBaseFilter2_GetSyncSource
;
625 This
->vt
->EnumPins
= CBaseFilter2_EnumPins
;
626 This
->vt
->FindPin
= CBaseFilter2_FindPin
;
627 This
->vt
->QueryFilterInfo
= CBaseFilter2_QueryFilterInfo
;
628 This
->vt
->JoinFilterGraph
= CBaseFilter2_JoinFilterGraph
;
629 This
->vt
->QueryVendorInfo
= CBaseFilter2_QueryVendorInfo
;
631 This
->GetPin
= CBaseFilter2_GetPin
;
633 This
->interfaces
[0] = IID_IUnknown
;
634 This
->interfaces
[1] = IID_IBaseFilter
;
635 This
->interfaces
[2] = CBaseFilter2_interf1
;
636 This
->interfaces
[3] = CBaseFilter2_interf2
;
637 This
->interfaces
[4] = CBaseFilter2_interf3
;
648 static long STDCALL
CRemotePin_ConnectedTo(IPin
* This
, /* [out] */ IPin
** pPin
)
650 Debug
printf("CRemotePin_ConnectedTo(%p) called\n", This
);
653 *pPin
= ((CRemotePin
*)This
)->remote_pin
;
654 (*pPin
)->vt
->AddRef((IUnknown
*)(*pPin
));
658 static long STDCALL
CRemotePin_QueryDirection(IPin
* This
,
659 /* [out] */ PIN_DIRECTION
* pPinDir
)
661 Debug
printf("CRemotePin_QueryDirection(%p) called\n", This
);
664 *pPinDir
=PINDIR_INPUT
;
668 static long STDCALL
CRemotePin_ConnectionMediaType(IPin
* This
, /* [out] */ AM_MEDIA_TYPE
* pmt
)
670 Debug
unimplemented("CRemotePin_ConnectionMediaType", This
);
674 static long STDCALL
CRemotePin_QueryPinInfo(IPin
* This
, /* [out] */ PIN_INFO
* pInfo
)
676 CBaseFilter
* lparent
= ((CRemotePin
*)This
)->parent
;
677 Debug
printf("CRemotePin_QueryPinInfo(%p) called\n", This
);
678 pInfo
->dir
= PINDIR_INPUT
;
679 pInfo
->pFilter
= (IBaseFilter
*) lparent
;
680 lparent
->vt
->AddRef((IUnknown
*)lparent
);
685 static void CRemotePin_Destroy(CRemotePin
* This
)
687 Debug
printf("CRemotePin_Destroy(%p) called\n", This
);
692 IMPLEMENT_IUNKNOWN(CRemotePin
)
694 CRemotePin
* CRemotePinCreate(CBaseFilter
* pt
, IPin
* rpin
)
696 CRemotePin
* This
= (CRemotePin
*) malloc(sizeof(CRemotePin
));
701 Debug
printf("CRemotePinCreate() called -> %p\n", This
);
704 This
->remote_pin
= rpin
;
707 This
->vt
= (IPin_vt
*) malloc(sizeof(IPin_vt
));
715 memset(This
->vt
, 0, sizeof(IPin_vt
));
716 This
->vt
->QueryInterface
= CRemotePin_QueryInterface
;
717 This
->vt
->AddRef
= CRemotePin_AddRef
;
718 This
->vt
->Release
= CRemotePin_Release
;
719 This
->vt
->QueryDirection
= CRemotePin_QueryDirection
;
720 This
->vt
->ConnectedTo
= CRemotePin_ConnectedTo
;
721 This
->vt
->ConnectionMediaType
= CRemotePin_ConnectionMediaType
;
722 This
->vt
->QueryPinInfo
= CRemotePin_QueryPinInfo
;
724 This
->interfaces
[0] = IID_IUnknown
;
735 static long STDCALL
CRemotePin2_QueryPinInfo(IPin
* This
,
736 /* [out] */ PIN_INFO
* pInfo
)
738 CBaseFilter2
* lparent
=((CRemotePin2
*)This
)->parent
;
739 Debug
printf("CRemotePin2_QueryPinInfo(%p) called\n", This
);
740 pInfo
->pFilter
=(IBaseFilter
*)lparent
;
741 lparent
->vt
->AddRef((IUnknown
*)lparent
);
742 pInfo
->dir
=PINDIR_OUTPUT
;
747 // FIXME - not being released!
748 static void CRemotePin2_Destroy(CRemotePin2
* This
)
750 Debug
printf("CRemotePin2_Destroy(%p) called\n", This
);
755 IMPLEMENT_IUNKNOWN(CRemotePin2
)
757 CRemotePin2
* CRemotePin2Create(CBaseFilter2
* p
)
759 CRemotePin2
* This
= (CRemotePin2
*) malloc(sizeof(CRemotePin2
));
764 Debug
printf("CRemotePin2Create() called -> %p\n", This
);
769 This
->vt
= (IPin_vt
*) malloc(sizeof(IPin_vt
));
777 memset(This
->vt
, 0, sizeof(IPin_vt
));
778 This
->vt
->QueryInterface
= CRemotePin2_QueryInterface
;
779 This
->vt
->AddRef
= CRemotePin2_AddRef
;
780 This
->vt
->Release
= CRemotePin2_Release
;
781 This
->vt
->QueryPinInfo
= CRemotePin2_QueryPinInfo
;
783 This
->interfaces
[0] = IID_IUnknown
;