SETUP.CPP


//=========================================================================
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1996 - 1997 Microsoft Corporation. All Rights Reserved.
//
//=========================================================================

#include <windows.h>
#include "setup.h"

// This sample demonstrates how a 3rd party package can set up the DirectXMedia
// redist. bits from their setup program. This sample assumes the DXMEDIA.EXE
// is sitting in the same directory as the compiled version of this code.

#define TITLE "Sample DXMedia Install Package"

// Forward prototyping
BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM);

DWORD ExecuteSynchCmdLine (LPTSTR szProgExe, LPTSTR szCmdLine)

{ // ExecuteSynchCmdLine //

DWORD dwTimeout = 30;
DWORD dwRC = WAIT_TIMEOUT;
MSG msg;
DWORD dw;
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;

ZeroMemory(&StartupInfo, sizeof STARTUPINFO);
StartupInfo.cb = sizeof STARTUPINFO;
StartupInfo.wShowWindow = SW_NORMAL;
ZeroMemory(&ProcessInformation, sizeof PROCESS_INFORMATION);

TCHAR cPad[MAX_PATH];
lstrcpy(cPad, " ");
lstrcat(cPad, szCmdLine);

if (CreateProcess(szProgExe, cPad, NULL, NULL, NULL, NULL, NULL, NULL, &StartupInfo, &ProcessInformation))

{ // Spin off child process

while (dwRC == WAIT_TIMEOUT)

{ // Poll status every 'dwTimeout' milliseconds

dwRC = WaitForSingleObject(ProcessInformation.hProcess, dwTimeout);

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

} // Poll status every 'dwTimeout' milliseconds

} // Spin off child process

GetExitCodeProcess(ProcessInformation.hProcess, &dw);

return dw;

} // ExecuteSynchCmdLine //

int WINAPI WinMain (HINSTANCE a, HINSTANCE b, LPSTR c, int d)

{// WinMain //

HRESULT hr = NOERROR;

// Prompt to install the package
if (!DialogBox(a, MAKEINTRESOURCE(IDD_DIALOG1), GetDesktopWindow(), (DLGPROC)DialogProc))
return FALSE; // Selected CANCEL

// DXMedia.exe redist. package needs to be in same (current) directory!
hr = ExecuteSynchCmdLine("dxmedia.exe","-id:ExampleIdentifier");

switch(hr)

{ // Most common return codes

case ERROR_SUCCESS:
MessageBox(GetDesktopWindow(), "Redist. package installed successfully; no reboot required.", TITLE, MB_OK);
break;

case ERROR_SUCCESS_REBOOT_REQUIRED:
MessageBox(GetDesktopWindow(), "Redist. package installed successfully; reboot required!", TITLE, MB_ICONHAND);
break;

case E_FAIL:
MessageBox(GetDesktopWindow(), "Redist. package failed to install! Is dxmedia.exe in the same directory?", TITLE, MB_ICONHAND);
break;

default:

TCHAR cDbgMsg[255];
wsprintf(cDbgMsg, "Redist. package returned an unexpected error code (hr=0x%08X)", hr);
MessageBox(GetDesktopWindow(), cDbgMsg, TITLE, MB_ICONHAND);
break;

} // Most common return codes

return FALSE;

}// WinMain //

BOOL CALLBACK DialogProc (HWND hWnd, UINT mMsg, WPARAM wParam, LPARAM lParam)

{ // DialogProc //

switch(mMsg)

{ // Msg handling

case WM_COMMAND:

switch(wParam)

{ // Command msg handling

case IDOK:
EndDialog(hWnd,1);
break;

case IDCANCEL:
EndDialog(hWnd,0);
break;

} // Command msg handling

break;

} // Msg handling

return 0;

} // DialogProc //