windows-nt/Source/XPSP1/NT/drivers/wdm/input/opos/oposserv/main.cpp
2020-09-26 16:20:57 +08:00

153 lines
3.3 KiB
C++

/*
* MAIN.CPP
*
*
*
*
*
*
*/
#include <windows.h>
#include <hidclass.h>
#include <hidsdi.h>
#include <ole2.h>
#include <ole2ver.h>
#include "..\inc\opos.h"
#include "oposserv.h"
COPOSService *g_oposService = NULL;
DWORD g_classObjId = 0;
/*
************************************************************
* DllMain
************************************************************
*
*
*/
STDAPI_(BOOL) DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved)
{
static BOOLEAN serverInitialized = FALSE;
BOOLEAN result;
switch (dwReason){
case DLL_PROCESS_ATTACH:
Report("DllMain: DLL_PROCESS_ATTACH", dwReason); // BUGBUG REMOVE
ASSERT(!serverInitialized);
result = serverInitialized = InitServer();
ASSERT(result);
break;
case DLL_PROCESS_DETACH:
Report("DllMain: DLL_PROCESS_DETACH", dwReason); // BUGBUG REMOVE
ASSERT(serverInitialized);
ShutdownServer();
serverInitialized = FALSE;
result = TRUE;
break;
case DLL_THREAD_ATTACH:
Report("DllMain: DLL_THREAD_ATTACH", dwReason); // BUGBUG REMOVE
result = TRUE;
break;
case DLL_THREAD_DETACH:
Report("DllMain: DLL_THREAD_DETACH", dwReason); // BUGBUG REMOVE
result = TRUE;
break;
default:
Report("DllMain", dwReason); // BUGBUG REMOVE
result = TRUE;
break;
}
return result;
}
/*
************************************************************
* InitServer
************************************************************
*
* Register the server GUID with the OLE library,
* making it possible for POS control objects
* to open server instances.
*
*/
BOOLEAN InitServer()
{
BOOLEAN result = FALSE;
HRESULT hres;
hres = OleInitialize(NULL);
if ((hres == S_OK) || (hres == S_FALSE)){
Report("Ole is initialized", (DWORD)hres);
g_oposService = new COPOSService;
if (g_oposService){
hres = CoRegisterClassObject(
GUID_HID_OPOS_SERVER,
(IUnknown *)g_oposService,
CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE , // BUGBUG ? REGCLS_SINGLEUSE,
&g_classObjId);
if ((hres == S_OK) || (hres == CO_E_OBJISREG)){
Report("Registered Server", (DWORD)hres);
result = TRUE;
}
else {
Report("CoRegisterClassObject failed", (DWORD)hres);
}
if (!result){
delete g_oposService;
}
}
else {
Report("Couldn't create COPOSService instance", 0);
}
}
else {
Report("OleInitialize failed", (DWORD)hres);
}
return result;
}
/*
************************************************************
* ShutdownServer
************************************************************
*
*
*/
void ShutdownServer()
{
Report("ShutdownServer", 0);
CoRevokeClassObject(g_classObjId);
if (g_oposService){
delete g_oposService;
g_oposService = NULL;
}
OleUninitialize();
}