592 lines
20 KiB
C
592 lines
20 KiB
C
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Contains Multimedia Framework Interfaces and Prototypes
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation 1997
|
||
|
//
|
||
|
// 10/31/97 David Stewart / dstewart
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef _MMFRAMEWORK_PUBLICINTEFACES_
|
||
|
#define _MMFRAMEWORK_PUBLICINTEFACES_
|
||
|
|
||
|
#include "mmsystem.h"
|
||
|
#include "objbase.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
//literals the app needs to know
|
||
|
#define REG_KEY_NEW_FRAMEWORK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\DeluxeCD")
|
||
|
#define REG_KEY_FRAMEWORK_COMPONENTS REG_KEY_NEW_FRAMEWORK TEXT("\\Components")
|
||
|
#define FRAMEWORK_CLASS TEXT("MMFRAME_MAIN")
|
||
|
#define MENU_INIFILE_ENTRY TEXT("MENU%i")
|
||
|
#define URL_SEPARATOR TEXT("::")
|
||
|
#define WEBCD_MUTEX TEXT("WEBCD_MUTEX")
|
||
|
#define HELPFILENAME TEXT("DELUXCD.CHM")
|
||
|
|
||
|
//color modes
|
||
|
#define COLOR_VERYHI 0
|
||
|
#define COLOR_256 1
|
||
|
#define COLOR_16 2
|
||
|
#define COLOR_HICONTRAST 3
|
||
|
|
||
|
// Allocator functions for the LIBs that used to be DLLs
|
||
|
void WINAPI CDNET_Init(HINSTANCE hInst);
|
||
|
void WINAPI CDNET_Uninit(void);
|
||
|
HRESULT WINAPI CDNET_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void ** ppvObj);
|
||
|
HRESULT WINAPI CDPLAY_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void ** ppvObj);
|
||
|
HRESULT WINAPI CDOPT_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void ** ppvObj);
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Interface Definitions
|
||
|
//
|
||
|
// Defines the GUIDs / IIDs for this project:
|
||
|
//
|
||
|
// IID_IMMFWNotifySink, IMMComponent, IMMComponentAutomation
|
||
|
//
|
||
|
// These are the three interfaces for Framework / Component communications.
|
||
|
// All other interfaces should be private to the specific project.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
#define lMMFWIIDFirst 0xb2cd5bbb
|
||
|
#define DEFINE_MMFWIID(name, x) DEFINE_GUID(name, lMMFWIIDFirst + x, 0x5221,0x11d1,0x9b,0x97,0x0,0xc0,0x4f,0xa3,0xb6,0xc)
|
||
|
|
||
|
DEFINE_MMFWIID(IID_IMMFWNotifySink, 0);
|
||
|
DEFINE_MMFWIID(IID_IMMComponent, 1);
|
||
|
DEFINE_MMFWIID(IID_IMMComponentAutomation, 2);
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Interface Typedefs
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef interface IMMFWNotifySink IMMFWNotifySink;
|
||
|
typedef IMMFWNotifySink* LPMMFWNOTIFYSINK;
|
||
|
|
||
|
typedef interface IMMComponent IMMComponent;
|
||
|
typedef IMMComponent* LPMMCOMPONENT;
|
||
|
|
||
|
typedef interface IMMComponentAutomation IMMComponentAutomation;
|
||
|
typedef IMMComponentAutomation* LPMMCOMPONENTAUTOMATION;
|
||
|
|
||
|
#ifndef LPUNKNOWN
|
||
|
typedef IUnknown* LPUNKNOWN;
|
||
|
#endif
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// HRESULT Return Codes
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// Success Codes
|
||
|
|
||
|
#define MM_S_FIRST (OLE_S_FIRST + 9000)
|
||
|
|
||
|
#define S_FINISHED (S_OK)
|
||
|
#define S_CONTINUE (MM_S_FIRST + 1)
|
||
|
#define S_CHECKMENU (MM_S_FIRST + 2)
|
||
|
|
||
|
// Error Codes
|
||
|
|
||
|
#define MM_E_FIRST (OLE_E_FIRST + 9000)
|
||
|
|
||
|
#define E_NOTINITED (MM_E_FIRST + 1)
|
||
|
#define E_INCOMPATIBLEDLL (MM_E_FIRST + 2)
|
||
|
#define E_GRAYMENU (MM_E_FIRST + 3)
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Common enums
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MMEVENTS = Event notifications that should be send to the framework via the NotifySink.
|
||
|
// This allows the framework to do things like fire events to a web browser's script language
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
enum MMEVENTS
|
||
|
{
|
||
|
MMEVENT_SETTITLE = 0, //change title of playing media
|
||
|
MMEVENT_CHANGEUIELEMENT = 1, //indicates major change in display, transport, or menu (i.e. handle is now different)
|
||
|
MMEVENT_ONPLAY = 2, //begin playing media
|
||
|
MMEVENT_ONSTOP = 3, //stop media
|
||
|
MMEVENT_ONPAUSE = 4, //pause media
|
||
|
MMEVENT_ONUSERNOTIFY = 5, //use instead of putting up your own message boxes ... framework may have alternative display method
|
||
|
MMEVENT_ONMEDIALOADED = 6, //media has been loaded
|
||
|
MMEVENT_ONMEDIAUNLOADED = 7, //media has been unloaded
|
||
|
MMEVENT_ONTRACKCHANGED = 8, //media track changed
|
||
|
MMEVENT_ONDISCCHANGED = 9, //disc changed
|
||
|
MMEVENT_ONSETVOLUME = 10, //device volume changed
|
||
|
MMEVENT_ONERROR = 11 //error occurred
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MMACTIONS = Commands sent to IMMComponentAutomation.
|
||
|
// This allows the framework to drive the component without UI (i.e. in a web script)
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
enum MMACTIONS
|
||
|
{
|
||
|
MMACTION_PLAY = 0,
|
||
|
MMACTION_STOP = 1,
|
||
|
MMACTION_SETPOSITION = 2,
|
||
|
MMACTION_LOADMEDIA = 3,
|
||
|
MMACTION_UNLOADMEDIA = 4,
|
||
|
MMACTION_NEXTTRACK = 5,
|
||
|
MMACTION_PREVTRACK = 7,
|
||
|
MMACTION_PAUSE = 8,
|
||
|
MMACTION_REWIND = 9,
|
||
|
MMACTION_FFWD = 10,
|
||
|
MMACTION_NEXTMEDIA = 11,
|
||
|
MMACTION_GETMEDIAID = 12,
|
||
|
MMACTION_READSETTINGS = 13,
|
||
|
MMACTION_GETTRACKINFO = 14,
|
||
|
MMACTION_GETDISCINFO = 15,
|
||
|
MMACTION_SETTRACK = 16,
|
||
|
MMACTION_SETDISC = 17,
|
||
|
MMACTION_GETNETQUERY = 18,
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MMICONSIZES = The various sizes for icons the framework can request.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
enum MMICONSIZES
|
||
|
{
|
||
|
MMICONSIZE_16BY16 = 16,
|
||
|
MMICONSIZE_32BY32 = 32,
|
||
|
MMICONSIZE_48BY48 = 48
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MMINFOTEXT = Different types of text requested in IMMComponent::GetText.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
enum MMINFOTEXT
|
||
|
{
|
||
|
MMINFOTEXT_TITLE = 0,
|
||
|
MMINFOTEXT_ARTIST = 1,
|
||
|
MMINFOTEXT_MEDIATYPE = 2,
|
||
|
MMINFOTEXT_DESCRIPTION = 3,
|
||
|
MMINFOTEXT_MENULABEL = 4,
|
||
|
MMINFOTEXT_MENUPROMPT = 5,
|
||
|
MMINFOTEXT_MEDIAID = 6
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MMUIELEMENTS = FLAGS for use with MMEVENT_CHANGEUIELEMENT
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
enum MMUIELEMENTS
|
||
|
{
|
||
|
MMUIELEMENT_DISPLAY = 1,
|
||
|
MMUIELEMENT_TRANSPORT = 2,
|
||
|
MMUIELEMENT_MENU = 4
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MMPOSTYPE = Indicator of type of positioning scheme used.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
enum MMPOSTYPE
|
||
|
{
|
||
|
MMPOSTYPE_SAMPLES = 0,
|
||
|
MMPOSTYPE_MILLISECONDS = 1,
|
||
|
MMPOSTYPE_BYTES = 2,
|
||
|
MMPOSTYPE_SMPTE = 3,
|
||
|
MMPOSTYPE_CDFRAMES = 4
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Type definitions
|
||
|
//
|
||
|
// Structs for Events and Actions
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef struct MMNET
|
||
|
{
|
||
|
DWORD discid;
|
||
|
BOOL fForceNet;
|
||
|
HWND hwndCallback;
|
||
|
void* pData;
|
||
|
void* pData2;
|
||
|
} MMNET, *LPMMNET;
|
||
|
|
||
|
typedef struct MMSETTITLE
|
||
|
{
|
||
|
MMINFOTEXT mmInfoText;
|
||
|
LPTSTR szTitle;
|
||
|
} MMSETTITLE, *LPMMSETTITLE;
|
||
|
|
||
|
typedef struct MMCHANGEUIELEMENT
|
||
|
{
|
||
|
MMUIELEMENTS mmElementFlag;
|
||
|
HANDLE hElement;
|
||
|
} MMCHANGEUIELEMENT, *LPMMCHANGEUIELEMENT;
|
||
|
|
||
|
typedef struct MMONSTOP
|
||
|
{
|
||
|
int nReason;
|
||
|
DWORD dwPosition;
|
||
|
} MMONSTOP, *LPMMONSTOP;
|
||
|
|
||
|
typedef struct MMONUSERNOTIFY
|
||
|
{
|
||
|
LPTSTR szNotification;
|
||
|
UINT uType; //see MessageBox API in Win32 SDK
|
||
|
} MMONUSERNOTIFY, *LPMMONUSERNOTIFY;
|
||
|
|
||
|
typedef struct MMONMEDIALOADED
|
||
|
{
|
||
|
LPTSTR szMediaName;
|
||
|
} MMONMEDIALOADED, *LPMMONMEDIALOADED;
|
||
|
|
||
|
typedef struct MMONTRACKCHANGED
|
||
|
{
|
||
|
int nNewTrack;
|
||
|
} MMONTRACKCHANGED, *LPMMONTRACKCHANGED;
|
||
|
|
||
|
typedef struct MMONDISCCHANGED
|
||
|
{
|
||
|
int nNewDisc;
|
||
|
BOOL fDisplayVolChange;
|
||
|
} MMONDISCCHANGED, *LPMMONDISCCHANGED;
|
||
|
|
||
|
typedef struct MMONVOLCHANGED
|
||
|
{
|
||
|
DWORD dwNewVolume;
|
||
|
BOOL fMuted;
|
||
|
TCHAR* szLineName;
|
||
|
} MMONVOLCHANGED, *LPMMONVOLCHANGED;
|
||
|
|
||
|
typedef struct MMONERROR
|
||
|
{
|
||
|
MMRESULT mmrErrorCode;
|
||
|
LPTSTR szErrorString;
|
||
|
} MMONERROR, *LPMMONERROR;
|
||
|
|
||
|
typedef struct MMSETPOSITION
|
||
|
{
|
||
|
MMPOSTYPE mmPosType;
|
||
|
DWORD dwPosition;
|
||
|
} MMSETPOSITION, *LPMMSETPOSITION;
|
||
|
|
||
|
typedef struct MMLOADMEDIA
|
||
|
{
|
||
|
LPTSTR szMedia;
|
||
|
} MMLOADMEDIA, *LPMMLOADMEDIA;
|
||
|
|
||
|
typedef struct MMCHANGETRACK
|
||
|
{
|
||
|
int nNewTrack;
|
||
|
} MMCHANGETRACK, *LPMMCHANGETRACK;
|
||
|
|
||
|
typedef struct MMCHANGEDISC
|
||
|
{
|
||
|
int nNewDisc;
|
||
|
} MMCHANGEDISC, *LPMMCHANGEDISC;
|
||
|
|
||
|
typedef struct MMTRACKORDISC
|
||
|
{
|
||
|
int nNumber; //input to call: sequential number of track or disc we are requesting
|
||
|
BOOL fCurrent; //returned from call to say that track or disc request is current
|
||
|
int nID; //unique ID of track or disc returned from call
|
||
|
TCHAR szName[MAX_PATH]; //name of track or disc returned from call
|
||
|
} MMTRACKORDISC, *LPMMTRACKORDISC;
|
||
|
|
||
|
typedef struct MMMEDIAID
|
||
|
{
|
||
|
int nDrive; //-1 means "use current"
|
||
|
DWORD dwMediaID;
|
||
|
DWORD dwNumTracks;
|
||
|
TCHAR szMediaID[MAX_PATH];
|
||
|
TCHAR szTitle[MAX_PATH];
|
||
|
TCHAR szTrack[MAX_PATH];
|
||
|
TCHAR szArtist[MAX_PATH];
|
||
|
} MMMEDIAID, *LPMMMEDIAID;
|
||
|
|
||
|
typedef struct MMNETQUERY
|
||
|
{
|
||
|
int nDrive; //-1 means "use current"
|
||
|
TCHAR* szNetQuery;
|
||
|
} MMNETQUERY, *LPMMNETQUERY;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Interface Definitions
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IMMFWNotifySink
|
||
|
DECLARE_INTERFACE_(IMMFWNotifySink, IUnknown)
|
||
|
{
|
||
|
//--- IUnknown methods---
|
||
|
STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
//--- IMMFWNotifySink methods---
|
||
|
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMFWNotifySink::OnEvent
|
||
|
|
||
|
This is the component's primary method of communication back to the framework.
|
||
|
|
||
|
It is used to indicate that something has changed so that the framework can update its
|
||
|
UI or fire an event through to the web scripting language, etc. The component
|
||
|
should not expect that the framework will actually do anything with any notification.
|
||
|
|
||
|
mmEventID = Event enum indicating type of event
|
||
|
pEvent = Pointer to structure of type associated with mmEventID
|
||
|
|
||
|
return values = S_OK, E_FAIL
|
||
|
Except for MMEVENT_ONUSERNOTIFY, hr = MessageBox response value
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD (OnEvent) (THIS_ MMEVENTS mmEventID,
|
||
|
LPVOID pEvent) PURE;
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMFWNotifySink::GetCustomMenu
|
||
|
|
||
|
Returns the custom menu object for the framework
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD_(void*,GetCustomMenu) (THIS) PURE;
|
||
|
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMFWNotifySink::GetPalette
|
||
|
|
||
|
Returns the custom palette handle for the framework
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD_(HPALETTE,GetPalette) (THIS) PURE;
|
||
|
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMFWNotifySink::GetOptions
|
||
|
|
||
|
Returns the options object for the framework
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD_(void*,GetOptions) (THIS) PURE;
|
||
|
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMFWNotifySink::GetData
|
||
|
|
||
|
Returns the data object for the framework
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD_(void*,GetData) (THIS) PURE;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
*****************************************************************************
|
||
|
About Registering Components
|
||
|
|
||
|
Components should be registered under:
|
||
|
|
||
|
HKCU\Software\Microsoft\MediaFramework\Components\<component guid>
|
||
|
Default = "Friendly Name"
|
||
|
HandlesExtensions = "File extensions (without periods) that this handles" (optional)
|
||
|
HandlesTypes = "Media types supported, such as 'cdaudio' or 'wave'"
|
||
|
Command = "Command line that will trigger this component to be shown by default, just text, no slashes"
|
||
|
|
||
|
The component's class factory should be registered like an inproc server:
|
||
|
|
||
|
HKCR\CLSID\<component guid>
|
||
|
Default = "Name"
|
||
|
\InprocServer32
|
||
|
Default = "DLL_Full_Path.DLL"
|
||
|
ThreadingModel = "Apartment"
|
||
|
|
||
|
The following is an example .RGS script file for the Active Template Library:
|
||
|
|
||
|
HKCR
|
||
|
{
|
||
|
ExampleComp.ExampleComp.1 = s 'ExampleComp Class'
|
||
|
{
|
||
|
CLSID = s '{E5927147-521E-11D1-9B97-00C04FA3B60C}'
|
||
|
}
|
||
|
ExampleComp.ExampleComp = s 'ExampleComp Class'
|
||
|
{
|
||
|
CurVer = s 'ExampleComp.ExampleComp.1'
|
||
|
}
|
||
|
NoRemove CLSID
|
||
|
{
|
||
|
ForceRemove {E5927147-521E-11D1-9B97-00C04FA3B60C} = s 'ExampleComp Class'
|
||
|
{
|
||
|
ProgID = s 'ExampleComp.ExampleComp.1'
|
||
|
VersionIndependentProgID = s 'ExampleComp.ExampleComp'
|
||
|
InprocServer32 = s '%MODULE%'
|
||
|
{
|
||
|
val ThreadingModel = s 'Apartment'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
HKCU
|
||
|
{
|
||
|
'Software'
|
||
|
{
|
||
|
'Microsoft'
|
||
|
{
|
||
|
'MediaFramework'
|
||
|
{
|
||
|
'Components'
|
||
|
{
|
||
|
ForceRemove {E5927147-521E-11D1-9B97-00C04FA3B60C} = s 'Example Component'
|
||
|
{
|
||
|
HandlesExtensions = s 'wav mid'
|
||
|
HandlesTypes = s 'cdaudio'
|
||
|
Command = s 'cd'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*****************************************************************************
|
||
|
*/
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Component enlistment structure
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
#define MAX_NAME 50
|
||
|
|
||
|
typedef struct MMCOMPDATA
|
||
|
{
|
||
|
DWORD dwSize; //size in bytes of structure
|
||
|
HICON hiconSmall; //16 by 16 icon
|
||
|
HICON hiconLarge; //32 by 32 icon
|
||
|
int nAniResID; //resource id of animated icon
|
||
|
HINSTANCE hInst; //instance handle
|
||
|
TCHAR szName[MAX_NAME]; //name of component
|
||
|
BOOL fVolume; //supports volume?
|
||
|
BOOL fPan; //supports pan?
|
||
|
RECT rect; //suggested rect for display window
|
||
|
} MMCOMPDATA, *LPMMCOMPDATA;
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IMMComponent
|
||
|
DECLARE_INTERFACE_(IMMComponent, IUnknown)
|
||
|
{
|
||
|
//--- IUnknown methods---
|
||
|
|
||
|
STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
//--- IMMComponent methods---
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMComponent::GetInfo
|
||
|
|
||
|
This function fills in an MMCOMPDATA structure supplied by the framework.
|
||
|
|
||
|
The framework will call this function before calling Init. It is used to
|
||
|
figure out how to display your component on the switchbar.
|
||
|
|
||
|
mmCompData = pointer to MMCOMPDATA structure from the framework
|
||
|
|
||
|
return values = S_OK, E_FAIL
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD (GetInfo) (THIS_ MMCOMPDATA* mmCompData) PURE;
|
||
|
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMComponent::Init
|
||
|
|
||
|
This function is called when the framework actually wants you to create your
|
||
|
display window and be ready to play back media.
|
||
|
|
||
|
If at all possible, you should delay loading anything that will increase your
|
||
|
memory footprint (i.e. support DLLs) until this call is made. That will allow
|
||
|
the framework to load much more quickly and only take the hit if the user actually
|
||
|
decides to use your component. Once the Init call is made, however, you will not
|
||
|
be asked to unload until this object's refcount is 0, which may or may not be when
|
||
|
the framework itself unloads.
|
||
|
|
||
|
pSink = pointer to framework notification sink
|
||
|
hwndMain = handle to main framework window for DirectX calls and others that require it
|
||
|
pRect = main size and position rect for your window
|
||
|
phwndComp = out parameter ... store your main window handle here. All other windows in the
|
||
|
component should be child windows of this one, so when the framework calls
|
||
|
show / hide on this main window, all of your childen will show / hide as well
|
||
|
This window should be created as a child of the "main" window sent into this
|
||
|
function, and it should be created without the WS_VISIBLE flag set.
|
||
|
phMenu = out parameter ... store your custom menu handler here, or NULL if not applicable.
|
||
|
|
||
|
return values = S_OK, E_FAIL
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD (Init) (THIS_ IMMFWNotifySink* pSink, HWND hwndMain, RECT* pRect, HWND* phwndComp, HMENU* phMenu) PURE;
|
||
|
};
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IMMComponentAutomation
|
||
|
DECLARE_INTERFACE_(IMMComponentAutomation, IUnknown)
|
||
|
{
|
||
|
//--- IUnknown methods---
|
||
|
|
||
|
STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
|
||
|
//--- IMMComponentAutomation methods---
|
||
|
|
||
|
/*
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
IMMComponentAutomation::OnAction
|
||
|
|
||
|
If the component supports IMMComponentAutomation, it is able to respond to transport
|
||
|
control requests without having its UI pressed. This is handy to allow the user to
|
||
|
script the component via VBScript or JavaScript on a web page. The framework will
|
||
|
handle all of the necessary details; the component just needs to respond appropriately
|
||
|
to this method.
|
||
|
|
||
|
mmActionID = Action type indicator
|
||
|
pAction = Pointer to action structure of type indicated by mmActionID
|
||
|
|
||
|
return value = S_OK, E_FAIL
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
*/
|
||
|
STDMETHOD (OnAction) (THIS_ MMACTIONS mmActionID,
|
||
|
LPVOID pAction) PURE;
|
||
|
};
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
#endif //_MMFRAMEWORK_PUBLICINTEFACES_
|