windows-nt/Source/XPSP1/NT/multimedia/media/mcihwnd/mcihwnd.c
2020-09-26 16:20:57 +08:00

245 lines
7.9 KiB
C

/* mcitest.c - WinMain(), main dialog box and support code for MCITest.
*
* MCITest is a Windows with Multimedia sample application illustrating
* the use of the Media Control Interface (MCI). MCITest puts up a dialog
* box allowing you to enter and execute MCI string commands.
*
* (C) Copyright (c) 1991-1998 Microsoft Corporation
*
* You have a royalty-free right to use, modify, reproduce and
* distribute the Sample Files (and/or any modified version) in
* any way you find useful, provided that you agree that
* Microsoft has no warranty obligations or liability for any
* Sample Application Files which are modified.
*/
/*----------------------------------------------------------------------------*\
| mcitest.c - A testbed for MCI |
| |
| |
| History: |
| 01/01/88 toddla Created |
| 03/01/90 davidle Modified quick app into MCI testbed |
| 09/17/90 t-mikemc Added Notification box with 3 notification types |
| 11/02/90 w-dougb Commented & formatted the code to look pretty |
| 05/29/91 NigelT ported to Win32
| |
\*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*\
| |
| i n c l u d e f i l e s |
| |
\*----------------------------------------------------------------------------*/
#include "mcihwnd.h"
CHAR aszMciWindow[] = MCI_GLOBAL_PROCESS;
PGLOBALMCI base;
/*
// BOOL CreateMappedFile(void) INTERNAL
//
// Set up a global named file to use for interprocess communication.
// This process will be the only one to write into this shared memory.
// On exit the memory has been mapped, and our global variable set to
// point to it. From here on in most of the work is done in WINMM,
// including the window creation.
*/
BOOL CreateMappedFile(void)
{
HANDLE hFileMapping;
DWORD err;
hFileMapping = CreateFileMapping(
(HANDLE)-1, // put onto the paging file
NULL, // security attributes
PAGE_READWRITE,
0, // high order size
sizeof(GLOBALMCI),// only need a few bytes
aszMciWindow // name of file
);
dprintf3("hFileMapping from CreateFileMapping is %x", hFileMapping);
if (!hFileMapping) {
// Note: This prevents the module being run twice...
// The second create will fail
err = GetLastError();
dprintf2("Error %d from CreateFileMapping", err);
return FALSE;
}
base = MapViewOfFile( hFileMapping, FILE_MAP_WRITE,
0, 0, 0); // from beginning for total length
dprintf3("Base address from MapViewOfFile is %x", base);
if (!base) {
err = GetLastError();
dprintf2("Error %d from MapViewOfFile", err);
return(FALSE);
}
memset(base, 0, sizeof(GLOBALMCI));
base->dwGlobalProcessId = GetCurrentProcessId();
base->dwGlobalThreadId = GetCurrentThreadId();
dprintf3("Setting notify pid/tid to %x %x", base->dwGlobalProcessId, base->dwGlobalThreadId);
return(TRUE);
}
//
// MYCREATEEVENT
//
BOOL SrvCreateEvent(VOID)
{
SECURITY_ATTRIBUTES SA;
HANDLE hEvent;
SA.bInheritHandle = TRUE;
SA.lpSecurityDescriptor = NULL;
SA.nLength = sizeof(SA);
hEvent = CreateEvent( &SA,
TRUE, // Manual reset
FALSE, // initially not signalled
NULL); // no name
if (hEvent) {
dprintf2("Created shared event, handle is %8x", hEvent);
base->hEvent = hEvent;
return(TRUE);
} else {
#if DBG
DWORD err;
err = GetLastError();
dprintf2("Error %d creating MCI shared event", err);
#endif
return(FALSE);
}
}
//
// MYCREATEMUTEX
//
BOOL SrvCreateMutex(VOID)
{
SECURITY_ATTRIBUTES SA;
HANDLE hMutex;
SA.bInheritHandle = TRUE;
SA.lpSecurityDescriptor = NULL;
SA.nLength = sizeof(SA);
hMutex = CreateMutex( &SA,
FALSE, // initially not owned
NULL); // no name
if (hMutex) {
dprintf2("Created shared mutex, handle is %8x", hMutex);
base->hMutex = hMutex;
return(TRUE);
} else {
#if DBG
DWORD err;
err = GetLastError();
dprintf2("Error %d creating MCI shared mutex", err);
#endif
return(FALSE);
}
}
/*----------------------------------------------------------------------------*\
| MAIN: |
| |
| Description: |
| The main procedure for the app. After initializing, it just goes |
| into a message-processing loop until it gets a WM_QUIT message |
| (meaning the app was closed). |
| |
| Arguments: |
| hInst instance handle of this instance of the app |
| hPrev instance handle of previous instance, NULL if first |
| szCmdLine null-terminated command line string |
| sw specifies how the window is to be initially displayed |
| |
| Returns: |
| The exit code as specified in the WM_QUIT message. |
| |
\*----------------------------------------------------------------------------*/
typedef BOOL (* BOOLPROC)(void);
int __cdecl main(
int argc,
char *argv[],
char *envp[])
{
MSG Msg; /* Windows message structure */
HANDLE hLib;
BOOLPROC proc;
// If we are in DEBUG mode, get debug level for this module
dGetDebugLevel(aszAppName);
#if DBG
dprintf2("MCIHWND started (debug level %d)", __iDebugLevel);
#endif
/* Call the initialization procedure */
/* We load the library explicitly to prevent module load causing */
/* WINMM's DLL initialisation to be run. We have probably started */
/* as a result of that initialisation. */
if (!CreateMappedFile()) return 0;
if (!SrvCreateEvent()) return 0; // Set up the shared event
if (!SrvCreateMutex()) return 0; // Set up the shared mutex
base->dwType = GMCI_MCIHWND;
UnmapViewOfFile(base);
base = NULL;
hLib = LoadLibrary("WINMM");
if (!hLib) {
dprintf("MCIHWND failed to load WINMM");
return(FALSE);
}
proc = (BOOLPROC)GetProcAddress(hLib, (LPCSTR)"mciSoundInit");
if (NULL == proc) {
dprintf("cannot get address of mciWndInit");
return FALSE;
}
if (!(*proc)()) {
dprintf("failure returned from mciWndInit");
return FALSE;
}
dprintf4("MCIHWND now going into its message loop");
/* Poll the event queue for messages */
while (GetMessage(&Msg, NULL, 0, 0)) {
/* Main message processing */
dprintf4("Message received %8x Hwnd=%8x wParam=%8x lParam=%8x", Msg.message, Msg.hwnd, Msg.wParam, Msg.lParam);
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
dprintf2("MCIHWND exited its message loop");
dprintf2(" Last message %8x Hwnd=%8x wParam=%8x lParam=%8x", Msg.message, Msg.hwnd, Msg.wParam, Msg.lParam);
DebugBreak();
dprintf1("MCIHWND should not be here...");
return Msg.wParam;
}