INVOKOBJ.CPP

/*++ 

Copyright (c) 1997 Microsoft Corporation

Module Name: InvokObj.cpp

Abstract:

ISAPI Extension sample to invoke an automation server method

--*/

#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <httpext.h>


//
// Import type library information about the COM object
//

#import "GetUserName.dll"


BOOL WINAPI
GetExtensionVersion(
HSE_VERSION_INFO *pVer
)
/*++

Purpose:

This is required ISAPI Extension DLL entry point.

Arguments:

pVer - poins to extension version info structure

Returns:

always returns TRUE

--*/
{
pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR,
HSE_VERSION_MAJOR );
lstrcpyn( pVer->lpszExtensionDesc,
"InvokObj ISAPI Sample", HSE_MAX_EXT_DLL_NAME_LEN );

//
// Ensure COM is initialized
//

CoInitialize( NULL );

return TRUE;
}


DWORD WINAPI
HttpExtensionProc(
EXTENSION_CONTROL_BLOCK *pECB
)
/*++

Purpose:

Demonstrate how to create an instance of the automation object
using VC++ 5.0 extensions and how to invoke its method.

Arguments:

pECB - pointer to the extenstion control block

Returns:

HSE_STATUS_SUCCESS on successful transmission completion
HSE_STATUS_ERROR on failure

--*/
{
char szOutput[1024];
DWORD dwBuffSize;
GETUSERNAMELib::IGetUserNameObjPtr pItf;
HSE_SEND_HEADER_EX_INFO HeaderExInfo;
HRESULT hr;

//
// Send headers back to client
//

HeaderExInfo.pszStatus = "200 OK";
HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus );
HeaderExInfo.pszHeader = "Content-type: text/html\r\n\r\n";
HeaderExInfo.cchHeader = strlen( HeaderExInfo.pszHeader );
HeaderExInfo.fKeepConn = FALSE;

pECB->ServerSupportFunction( pECB->ConnID,
HSE_REQ_SEND_RESPONSE_HEADER_EX,
&HeaderExInfo, NULL, NULL );

//
// Initialize an instance of the automation server
//

hr = pItf.CreateInstance( L"GetUserNameObj.GetUserNameObj.1" );

if ( FAILED( hr ) )
{
wsprintf( szOutput, "<h1>Error.</h1><hr>Attempt to create instance "
"of GetUserNameObj object failed with error %x.", hr );
dwBuffSize = strlen( szOutput );

pECB->WriteClient( pECB->ConnID, szOutput, &dwBuffSize, 0 );

return HSE_STATUS_SUCCESS;
}


//
// Build the output using the result of the call to
// GetUserNameObj's GetMyName method
//

wsprintf( szOutput, "<h1>GetUserNameObj successfully instantiated."
"</h1><hr>The GetMyName method returned %s.",
(char *)pItf->GetMyName( ) );


//
// Send the output back to the client
//

dwBuffSize = strlen( szOutput );
pECB->WriteClient( pECB->ConnID, szOutput, &dwBuffSize, 0 );


return HSE_STATUS_SUCCESS;
}


BOOL WINAPI
TerminateExtension(
DWORD dwFlags
)
/*++

Purpose:

This is optional ISAPI extension DLL entry point.
If present, it will be called before unloading the DLL,
giving it a chance to perform any shutdown procedures.

Arguments:

dwFlags - specifies whether the DLL can refuse to unload or not

Returns:

TRUE, if the DLL can be unloaded

--*/
{
//
// Balance the call to CoInitialize that we made in GetExtensionVersion
//

CoUninitialize( );

//
// It is now OK to unload
//

return TRUE;
}