207 lines
4 KiB
C++
207 lines
4 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows NT **/
|
||
|
/** Copyright(c) Microsoft Corp., 1994 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
olehack.cxx
|
||
|
|
||
|
This module contains the code that will allow single threaded ole apps
|
||
|
to run in the Gibraltar service.
|
||
|
|
||
|
|
||
|
FILE HISTORY:
|
||
|
Johnl 22-Sep-1994 Created
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include "w3p.hxx"
|
||
|
#include <objbase.h> // for CoInitialize/Uninitialize
|
||
|
|
||
|
HANDLE hOleHackEvent = NULL;
|
||
|
HANDLE hOleHackThread = NULL;
|
||
|
|
||
|
//
|
||
|
// Private constants.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Time to wait for the ole thread to exit
|
||
|
//
|
||
|
|
||
|
#define WAIT_FOR_OLE_THREAD (30 * 1000)
|
||
|
|
||
|
//
|
||
|
// Private prototypes
|
||
|
//
|
||
|
|
||
|
DWORD
|
||
|
OleHackThread(
|
||
|
PVOID pv
|
||
|
);
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
InitializeOleHack(
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Creates a main OLE thread so older OLE controls (including VB4) work
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
DWORD idThread;
|
||
|
|
||
|
//
|
||
|
// Create the exit event
|
||
|
//
|
||
|
|
||
|
hOleHackEvent = IIS_CREATE_EVENT(
|
||
|
"hOleHackEvent",
|
||
|
&hOleHackEvent,
|
||
|
TRUE,
|
||
|
FALSE
|
||
|
);
|
||
|
|
||
|
if ( !hOleHackEvent )
|
||
|
{
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"Unable to create OleHack event[err %d]\n", GetLastError()));
|
||
|
return GetLastError();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Create the main Ole thread
|
||
|
//
|
||
|
|
||
|
hOleHackThread = CreateThread( NULL,
|
||
|
0,
|
||
|
(LPTHREAD_START_ROUTINE) OleHackThread,
|
||
|
NULL,
|
||
|
0,
|
||
|
&idThread );
|
||
|
|
||
|
if ( !hOleHackThread )
|
||
|
{
|
||
|
DWORD err = GetLastError();
|
||
|
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"Unable to create OleHack thread[err %d]\n", err));
|
||
|
CloseHandle( hOleHackEvent );
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
return NO_ERROR;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
OleHackThread(
|
||
|
PVOID pv
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message loop thread for OLE controls
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
MSG msg;
|
||
|
DWORD ret;
|
||
|
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"[OleHackThread] entered, thread ID %x\n",
|
||
|
GetCurrentThreadId() ));
|
||
|
|
||
|
hr = CoInitialize( NULL );
|
||
|
|
||
|
if ( FAILED( hr ) )
|
||
|
{
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"[OleHackThread] CoInitialize failed with error %lx\n",
|
||
|
hr ));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
while ( TRUE )
|
||
|
{
|
||
|
ret = MsgWaitForMultipleObjects( 1,
|
||
|
&hOleHackEvent,
|
||
|
FALSE,
|
||
|
INFINITE,
|
||
|
QS_ALLINPUT );
|
||
|
|
||
|
if ( ret == WAIT_OBJECT_0 )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
while ( PeekMessage( &msg,
|
||
|
NULL,
|
||
|
0,
|
||
|
0,
|
||
|
PM_REMOVE ))
|
||
|
{
|
||
|
DispatchMessage( &msg );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"[OleHackThread] loop exited, calling CoUnitialize\n" ));
|
||
|
|
||
|
CoUninitialize();
|
||
|
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"[OleHackThread] Exiting thread\n" ));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
TerminateOleHack(
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Terminates the ole thread
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//
|
||
|
// Make sure we've been initialized
|
||
|
//
|
||
|
|
||
|
if ( !hOleHackEvent )
|
||
|
return;
|
||
|
|
||
|
//
|
||
|
// Signal the thread then wait for it to exit
|
||
|
//
|
||
|
|
||
|
DBG_REQUIRE( SetEvent( hOleHackEvent ));
|
||
|
|
||
|
if ( WAIT_TIMEOUT == WaitForSingleObject( hOleHackThread,
|
||
|
WAIT_FOR_OLE_THREAD ))
|
||
|
{
|
||
|
DBGPRINTF(( DBG_CONTEXT,
|
||
|
"[OleHackTerminate] Warning - WaitForSingleObject timed out\n" ));
|
||
|
}
|
||
|
|
||
|
DBG_REQUIRE( CloseHandle( hOleHackEvent ) );
|
||
|
DBG_REQUIRE( CloseHandle( hOleHackThread ));
|
||
|
}
|
||
|
|