int __cdecl main(int argc, char* argv[]) { LogMessage("main: started"); // // this event be signalled when it's time to exit // g_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (NULL == g_hExitEvent) { LogError("main: Failed to create exit event"); return 1; } // // we want to handle ctrl+c and ctrl+break events so we can cleanup on exit // proceed even in case of failure // SetConsoleCtrlHandler( (PHANDLER_ROUTINE)CtrlHandler, TRUE); // // initialize COM // HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if ( FAILED(hr)) { LogError("main: Failed to CoInitialize"); CloseHandle(g_hExitEvent); g_hExitEvent = NULL; return 1; } // // start worker thread for tapi message processing // hr = g_WorkerThread.Initialize(); if (FAILED(hr)) { LogError("main: Failed to initialize worker thread"); CoUninitialize(); CloseHandle(g_hExitEvent); g_hExitEvent = NULL; return 1; } // // initialize critical section used to serialize access to global // current call // // note: InitializeCriticalSection can raise STATUS_NO_MEMORY exception // InitializeCriticalSection(&g_CurrentCallCritSection); // // create and initialize tapi object, register the callback object // and start listening // hr = InitializeTAPI(); if (FAILED(hr)) { g_WorkerThread.Shutdown(); CloseHandle(g_hExitEvent); g_hExitEvent = NULL; DeleteCriticalSection(&g_CurrentCallCritSection); CoUninitialize(); return 1; } // // wait until ctrl+break handler or CS_DISCONNECT handler signal exit event // LogMessage("main: waiting for exit event"); DWORD nWaitResult = WaitForSingleObject(g_hExitEvent, INFINITE); LogMessage("main: exit event signaled"); // // disconnect and release call, if it exists // DisconnectAndReleaseCall(); // // cleanup tapi // ShutdownTapi(); // // stop the worker thread // g_WorkerThread.Shutdown(); // // no longer need the critical section // DeleteCriticalSection(&g_CurrentCallCritSection); // // release com // CoUninitialize(); // // no longer need the event // CloseHandle(g_hExitEvent); g_hExitEvent = NULL; // // exiting... we no longer want to handle ctrl+c and ctrl+break // SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, FALSE); // // was the event signaled, or wait failed? // if (WAIT_OBJECT_0 != nWaitResult) { LogError("main: Failed to wait for exit event"); return 1; } LogMessage("main: exiting"); return 0; }
/********************************************************** * COperator::~COperator * *-----------------------* * Description: * Destructor for the COperator class. * Cleans up SAPI and TAPI objects. ***********************************************************/ COperator::~COperator() { ShutdownSapi(); ShutdownTapi(); } /* COperator::~COperator */