246 lines
4.5 KiB
C++
246 lines
4.5 KiB
C++
|
/*++
|
|||
|
|
|||
|
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
|
|||
|
|