/*++ Copyright (c) 1997 Microsoft Corporation Module Name: main.cxx Abstract: Server Instance Controller. Author: Keith Moore (keithmo) 05-Feb-1997 Revision History: --*/ #include "precomp.hxx" #pragma hdrstop // // Private constants. // #define TEST_HRESULT(api,hr,fatal) \ if( FAILED(hr) ) { \ \ wprintf( \ L"%S:%lu failed, error %lx %S\n", \ (api), \ __LINE__, \ (result), \ (fatal) \ ? "ABORTING" \ : "CONTINUING" \ ); \ \ if( fatal ) { \ \ goto cleanup; \ \ } \ \ } else // // Private types. // // // Private globals. // COMMAND_TABLE CommandTable[] = { { L"Start", &StartCommand }, { L"Stop", &StopCommand }, { L"Pause", &PauseCommand }, { L"Continue", &ContinueCommand }, { L"Query", &QueryCommand } }; #define NUM_COMMANDS ( sizeof(CommandTable) / sizeof(CommandTable[0]) ) // // Private prototypes. // VOID Usage( VOID ); // // Public functions. // INT __cdecl wmain( IN INT argc, IN LPWSTR argv[] ) { HRESULT result; ADMIN_SINK * sink; IMSAdminBase * admCom; DWORD i; PCOMMAND_TABLE command; // // Setup locals so we know how to cleanup on exit. // admCom = NULL; sink = NULL; // // Validate the arguments. // if( argc == 1 ) { Usage(); return 1; } for( i = 0, command = CommandTable ; i < NUM_COMMANDS ; i++, command++ ) { if( !_wcsicmp( argv[1], command->Name ) ) { break; } } if( i == NUM_COMMANDS ) { Usage(); return 1; } argc -= 2; // Skip the program name... argv += 2; // ...and the command name. // // Initialize COM. // result = CoInitializeEx( NULL, COINIT_MULTITHREADED ); TEST_HRESULT( "CoInitializeEx()", result, TRUE ); // // Get the admin object. // result = MdGetAdminObject( &admCom ); TEST_HRESULT( "MdGetAdminObject()", result, TRUE ); // // Setup the advise sink. // sink = new ADMIN_SINK(); if( sink == NULL ) { result = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); } else { sink->AddRef(); result = sink->Initialize( (IUnknown *)admCom ); } TEST_HRESULT( "sink->Initialize()", result, TRUE ); // // Let the command handler do the dirty work. // command->Handler( admCom, sink, argc, argv ); cleanup: if( sink != NULL ) { sink->Unadvise(); sink->Release(); } // // Release the admin object. // if( admCom != NULL ) { result = MdReleaseAdminObject( admCom ); TEST_HRESULT( "MdReleaseAdminObject()", result, FALSE ); } // // Shutdown COM. // CoUninitialize(); return 0; } // main // // Private functions. // VOID Usage( VOID ) { wprintf( L"Use: iisnet operation service/instance\n" L"\n" L"Valid operations are:\n" L"\n" L" start\n" L" stop\n" L" pause\n" L" continue\n" L" query\n" L"\n" L"For example:\n" L"\n" L" iisnet pause w3svc/1\n" ); } // Usage