275 lines
6.1 KiB
C++
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;
|
|
|
|
}
|
|
|