windows-nt/Source/XPSP1/NT/multimedia/dshow/mfvideo/mswebdvd/thunkproc.h
2020-09-26 16:20:57 +08:00

80 lines
2.8 KiB
C++

/*************************************************************************/
/* Copyright (C) 1999 Microsoft Corporation */
/* File: ThunkProc.h */
/* Description: In order to get rid of the thread. Which causes problems */
/* since we have to marshal we use this timer stuff from ATL. */
/* The basic problem is that we would like to have a timer associated */
/* with an object and this is a way to do so */
/* Author: David Janecek */
/*************************************************************************/
#ifndef __THUNKPROC_H
#define __THUNKPROC_H
/////////////////////////////////////////////////////////////////////////////
// TimerProc thunks
class CTimerProcThunk
{
public:
_AtlCreateWndData cd;
CStdCallThunk thunk;
void Init(TIMERPROC proc, void* pThis)
{
thunk.Init((DWORD_PTR)proc, pThis);
}
};
template <class T>
class ATL_NO_VTABLE CMSDVDTimer {
private:
CTimerProcThunk m_TimerThunk;
HWND m_hwnd;
/*************************************************************************/
/* Function: FakeTimerProc */
/*************************************************************************/
static void CALLBACK FakeTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime){
CMSDVDTimer* pThis = (CMSDVDTimer*)hwnd;
pThis->RealTimerProc(pThis->m_hwnd, uMsg, idEvent, dwTime);
}/* end of function FakeTimerProc */
/*************************************************************************/
/* Function: RealTimerProc */
/*************************************************************************/
void RealTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime){
T* pT = static_cast<T*>(this);
if(NULL == pT){
return;
}/* end of if statement */
pT->TimerProc();
}/* end of function RealTimerProc */
public:
/*************************************************************************/
/* Function: MyTimerClass */
/*************************************************************************/
CMSDVDTimer(HWND hwnd = (HWND)NULL){
m_hwnd = hwnd;
m_TimerThunk.Init(FakeTimerProc, this);
}/* end of function MyTimerClass */
/*************************************************************************/
/* Function: GetTimerProc */
/*************************************************************************/
TIMERPROC GetTimerProc() {
return (TIMERPROC)(m_TimerThunk.thunk.pThunk);
}/* end of function GetTimerProc */
};
#endif // __THUNKPROC_H