Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

259 lines
8.1 KiB

/*************************************************************************/
/* Copyright (C) 1999 Microsoft Corporation */
/* File: dvdplay.cpp */
/* Description: Implementation of WinMain for hosting DLL container. */
/* This is simple stub exe, that contains resources and startups an */
/* OLE container. */
/* Author: David Janecek */
/*************************************************************************/
#include "stdafx.h"
#include "tchar.h"
#include <stdio.h>
#include "resource.h"
#include "..\MSMFCnt\MSMFCnt.h"
#include "..\MSMFCnt\MSMFCnt_i.c"
/*************************************************************************/
/* Function: AnotherInstanceRunning */
/* Description: Trys to figure out if we have another instance of this */
/* app running. If so brings it to foregraound and exits. */
/*************************************************************************/
BOOL AnotherInstanceRunning(){
HWND hwnd = ::FindWindow(TEXT("MSMFVideoClass"), TEXT("DVDPlay"));
if(NULL == hwnd){
return(FALSE);
}/* end of if statement */
// OK we have something running
HWND hwndFirstChild = ::GetLastActivePopup(hwnd);
if(::IsIconic(hwnd)){
::OpenIcon(hwnd);
}/* end of if statement */
::SetForegroundWindow(hwnd);
if(hwndFirstChild != hwnd){
if(::IsIconic(hwndFirstChild)){
::OpenIcon(hwndFirstChild);
}/* end of if statement */
::SetForegroundWindow(hwndFirstChild);
}/* end of if statement */
return(TRUE);
}/* end of function AnotherInstanceRunning */
/*************************************************************************/
/* Function: FindOneOf */
/*************************************************************************/
LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2){
while (p1 != NULL && *p1 != NULL){
LPCTSTR p = p2;
while (p != NULL && *p != NULL){
if (*p1 == *p)
return CharNext(p1);
p = CharNext(p);
}/* end of while loop */
p1 = CharNext(p1);
}/* end of while loop */
return NULL;
}/* end of function FindOnOf */
/*************************************************************************/
/* Function: WinMain */
/* Description: Initializes the object, and sets the script to it */
/*************************************************************************/
#if 0
extern "C" int WINAPI _tWinMain(HINSTANCE /* hInstance */,
HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/){
#else
int APIENTRY WinMain(HINSTANCE /* hInst */,
HINSTANCE /*hPrevInstance*/,
LPSTR /*lpCmdLine*/,
int /*nCmdShow*/){
#endif
try {
BSTR strFileName = NULL;
BSTR strScriptFile = ::SysAllocString(L"dvdlayout.js");
if(AnotherInstanceRunning()){
// only one instance at a time
return(-1);
}/* end of if statement */
TCHAR szTokens[] = _T("-/ ");
LPTSTR lpCmdLine = ::GetCommandLine();
LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
while (lpszToken != NULL)
{
// Read the command line argument
TCHAR opt[MAX_PATH];
#ifdef _UNICODE
_stscanf(lpszToken, TEXT("%ws"), opt);
#else
_stscanf(lpszToken, TEXT("%s"), opt);
#endif
// Set run the default directory name
if (lstrcmpi(opt, _T("play"))==0) {
lpszToken = FindOneOf(lpszToken, szTokens);
TCHAR fileName[MAX_PATH];
#ifdef _UNICODE
_stscanf(lpszToken, TEXT("%ws"), fileName);
//*( _tcsrchr( fileName, '\\' ) + 1 ) = TEXT('\0');
strFileName = SysAllocString(fileName);
#else
_stscanf(lpszToken, "%s", fileName);
#ifdef _DEBUG
::MessageBox(::GetFocus(), TEXT("test"), fileName, MB_OK);
#endif
// *( _tcsrchr( fileName, '\\' ) + 1 ) = TEXT('\0');
WCHAR strTmpFileName[MAX_PATH];
LONG lLength = _tcslen(fileName) + 1;
::MultiByteToWideChar(CP_ACP, 0, fileName, lLength, strTmpFileName, MAX_PATH);
strFileName = ::SysAllocString(strTmpFileName);
#endif
}/* end of if statement */
if (lstrcmpi(opt, _T("script"))==0) {
lpszToken = FindOneOf(lpszToken, szTokens);
TCHAR scriptFile[MAX_PATH];
#ifdef _UNICODE
_stscanf(lpszToken, TEXT("%ws"), scriptFile);
if(NULL != strFileName){
::SysFreeString(strFileName);
}/* end of if statement */
strScriptFile = ::SysAllocString(scriptFile);
#else
_stscanf(lpszToken, "%s", scriptFile);
WCHAR strTmpFileName[MAX_PATH];
LONG lLength = _tcslen(scriptFile) + 1;
::MultiByteToWideChar(CP_ACP, 0, scriptFile, lLength, strTmpFileName, MAX_PATH);
if(NULL != strFileName){
::SysFreeString(strFileName);
}/* end of if statement */
strScriptFile = SysAllocString(strTmpFileName);
#endif
}/* end of if statement */
lpszToken = FindOneOf(lpszToken, szTokens);
}/* end of if statement */
HRESULT hr = ::CoInitialize(NULL);
#ifdef _DEBUG
bool fReload;
do {
fReload = false;
#endif
IMSMFBar* pIMFBar = NULL;
hr = ::CoCreateInstance(
CLSID_MSMFBar,
NULL,
CLSCTX_SERVER,
IID_IMSMFBar,
(LPVOID*) &pIMFBar);
if(FAILED(hr)){
return (-2);
}/* end of if statement */
hr = pIMFBar->put_CmdLine(strFileName);
if(SUCCEEDED(hr)){
hr = pIMFBar->put_ScriptFile(strScriptFile);
}/* end of if statement */
if(SUCCEEDED(hr)){
MSG msg;
while (::GetMessage(&msg, 0, 0, 0)){
#ifdef _DEBUG
// enable restarting of the app via F6 key
// did not use F5 since that is overused and if debugging could trigger unvanted behavior
if(WM_KEYUP == msg.message && VK_F6 == msg.wParam){
fReload = true;
::PostMessage(msg.hwnd, WM_CLOSE, NULL, NULL); // tell our container to close
}/* end of if statement */
#endif
//ATLTRACE2(atlTraceHosting, 20, TEXT("Message = %x \n"), msg.message);
::DispatchMessage(&msg);
}/* end of while loop */
}/* end of if statement */
// release the site
if(NULL != pIMFBar){
pIMFBar->Release();
pIMFBar = NULL;
}/* end of if statement */
if(NULL != strFileName){
::SysFreeString(strFileName);
}/* end of if statement */
if(NULL != strScriptFile){
::SysFreeString(strScriptFile);
}/* end of if statement */
#ifdef _DEBUG
}
while (fReload);
#endif
::CoUninitialize();
}
catch(...){
return(-1);
}/* end of catch statement */
return 0;
}/* end of function WinMain */
/*************************************************************************/
/* End of file: dvdplay.cpp */
/*************************************************************************/