2025-04-27 07:49:33 -04:00

275 lines
6.1 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1996 Microsoft Corporation. All Rights Reserved.
Component: Main
File: CoInit.cpp
Owner: DaveK
Sample (and simple!) ISAPI app
===================================================================*/
#include "wtypes.h"
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "stdlib.h"
#include "iisext.h"
#include "objbase.h"
// Globals
char g_szExtensionDesc[] = "CoInit ISAPI test 1.0";
char g_szCoInitSez[] = "\
<FONT SIZE=3>\
Of all God's creatures there is only one that <BR>\
cannot be made the slave of the lash. That one is the cat. <BR>\
If man could be crossed with a cat it would improve man, <BR>\
but it would deteriorate the cat. <BR><PRE>\
- Mark CoInit (1835-1910), American author. <BR>\
</FONT>\
";
/*===================================================================
BOOL DllInit
Initialize the DLL
Returns:
TRUE on successful initialization
Side effects:
NONE
===================================================================*/
BOOL DllInit( void )
{
OutputDebugString( "CoInit DLL initialized\n" );
return TRUE;
}
/*===================================================================
void DllUnInit
UnInitialize the DLL
Returns:
NONE
Side effects:
NONE
===================================================================*/
void DllUnInit( void )
{
OutputDebugString( "CoInit DLL un-initialized\n" );
}
/*===================================================================
GetExtensionVersion
Mandatory server extension call which returns the version number of
the ISAPI spec that we were built with.
Returns:
TRUE on success
Side effects:
None.
===================================================================*/
BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pextver)
{
// Init the DLL
if ( !DllInit() )
{
return FALSE;
}
if (FAILED( CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) ))
{
return FALSE;
}
OutputDebugString( "CoInit DLL: CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) call succeeded\n" );
pextver->dwExtensionVersion =
MAKELONG(HSE_VERSION_MAJOR, HSE_VERSION_MINOR);
lstrcpy(pextver->lpszExtensionDesc, g_szExtensionDesc);
return TRUE;
}
/*===================================================================
SendHeaderToClient
Returns:
TRUE if success
Side effects:
None.
===================================================================*/
BOOL
SendHeaderToClient( IN EXTENSION_CONTROL_BLOCK * pECB, IN LPCSTR szMessage)
{
char * szStatus = "200 OK";
char szHeader[600];
//
// Note the HTTP header block is terminated by a blank '\r\n' pair,
// followed by the document body
//
wsprintf( szHeader,
"Content-Type: text/html"
"\r\n"
"\r\n" // end of header
"<head><title>Mark CoInit's DLL </title></head>\n"
"<body><h1>%s</h1>\n"
,
szMessage );
if ( !pECB->ServerSupportFunction( pECB->ConnID,
HSE_REQ_SEND_RESPONSE_HEADER,
szStatus,
NULL,
(LPDWORD) szHeader )
) {
return FALSE;
}
return TRUE;
} // SendHeaderToClient()
/*===================================================================
WriteSz
Writes a string to the browser.
Returns:
TRUE if success
Side effects:
None.
===================================================================*/
BOOL WriteSz ( EXTENSION_CONTROL_BLOCK * pECB, LPSTR sz )
{
DWORD cch = lstrlen( sz );
if ( !pECB->WriteClient( pECB->ConnID, sz, &cch, 0 ) )
{
return FALSE;
}
return TRUE;
}
/*===================================================================
HttpExtensionProc
Main entry point into the Isapi DLL.
Returns:
DWord indicating status of request.
HSE_STATUS_PENDING for normal return
(This indicates that we will process the request, but havent yet.)
Side effects:
None.
===================================================================*/
DWORD WINAPI HttpExtensionProc( EXTENSION_CONTROL_BLOCK * pECB )
{
DWORD dwPID;
DWORD dwRet = HSE_STATUS_ERROR;
char * szPath = NULL;
char szPID[ 10 ];
char szTemp[ 10 ];
HSE_URL_MAPEX_INFO urlmap;
if ( !SendHeaderToClient( pECB, "" ) ) {
goto LExit;
}
if ( !WriteSz( pECB, "<HTML>" ) )
goto LExit;
if ( !WriteSz( pECB, "<BR> Hello, from your pal CoInit.dll!" ) )
goto LExit;
if (FAILED( CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) ))
{
goto LExit;
}
OutputDebugString( "CoInit DLL: CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) call succeeded\n" );
dwRet = HSE_STATUS_SUCCESS;
LExit:
delete szPath;
return dwRet;
}
/*===================================================================
DllMain
Main entry point into the DLL. Called by system on DLL load
and unload.
Returns:
TRUE on success
Side effects:
None.
===================================================================*/
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
return TRUE;
}
/*===================================================================
DllCanUnloadNow
Tells OLE if we can unload now.
I dont believe this is ever called.
Returns:
S_OK
Side effects:
None.
===================================================================*/
STDAPI DllCanUnloadNow()
{
return(S_OK);
}
/*===================================================================
TerminateExtension
IIS is supposed to call this entry point to unload ISAPI DLLs.
Returns:
NONE
Side effects:
Uninitializes the Denali ISAPI DLL if asked to.
===================================================================*/
BOOL WINAPI TerminateExtension( DWORD dwFlag )
{
CoUninitialize();
OutputDebugString( "CoInit DLL: called CoUninitialize()\n" );
return TRUE;
}