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

267 lines
5.7 KiB
C++

// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
#include <windows.h>
#include <stdlib.h>
#include "CUnknown.h"
#include "CFactory.h"
#include "MD.h"
//#include "Resource.h"
///////////////////////////////////////////////////////////
//
// Outproc.cpp
// - the component server
//
HWND g_hWndListBox = NULL;
BOOL InitWindow(int nCmdShow);
extern "C" LONG APIENTRY MainWndProc(
HWND hWnd,
UINT message,
UINT wParam,
LONG lParam);
extern "C" int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// Controls whether UI is shown or not
BOOL bUI = TRUE ;
// If TRUE, don't loop.
BOOL bExit = FALSE ;
// Initialize the COM Library.
HRESULT hr = CoInitializeEx(
0,
COINIT_MULTITHREADED);
if(FAILED(hr))
{
return 0;
}
/*
hr = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_DYNAMIC_CLOAKING,
0);
*/
hr = CoInitializeSecurity(
(PVOID)&CLSID_MDHComp,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
EOAC_APPID,
NULL);
if (FAILED(hr))
{
CoUninitialize();
return 0;
}
// Get Thread ID.
CFactory::s_dwThreadID = ::GetCurrentThreadId() ;
CFactory::s_hModule = hInstance ;
// Read the command line.
char szTokens[] = "-/" ;
char* szToken = strtok(lpCmdLine, szTokens) ;
while (szToken != NULL)
{
if (_stricmp(szToken, "UnregServer") == 0)
{
CFactory::UnregisterAll() ;
// We are done, so exit.
bExit = TRUE ;
bUI = FALSE ;
//MessageBox(NULL,L"PSH un-registration successful",L"MDH", MB_OK);
}
else if (_stricmp(szToken, "RegServer") == 0)
{
CFactory::RegisterAll() ;
// We are done, so exit.
bExit = TRUE ;
bUI = FALSE ;
//MessageBox(NULL,L"PSH registration successful",L"MDH", MB_OK);
}
else if (_stricmp(szToken, "Embedding") == 0)
{
// Don't display a window if we are embedded.
bUI = FALSE ;
break ;
}
szToken = strtok(NULL, szTokens) ;
}
// If the user started us, then show UI.
if (bUI)
{
if (!InitWindow(nCmdShow))
{
// Exit since we can't show UI.
bExit = TRUE ;
}
else
{
::InterlockedIncrement(&CFactory::s_cServerLocks) ;
}
}
if (!bExit)
{
// Register all of the class factories.
CFactory::StartFactories() ;
// Wait for shutdown.
MSG msg ;
while (::GetMessage(&msg, 0, 0, 0))
{
::DispatchMessage(&msg) ;
}
// Unregister the class factories.
CFactory::StopFactories() ;
}
// Uninitialize the COM Library.
CoUninitialize() ;
return 0 ;
}
//
// Initialize window
//
BOOL InitWindow(int nCmdShow)
{
// Fill in window class structure with parameters
// that describe the main window.
WNDCLASS wcListview ;
wcListview.style = 0 ;
wcListview.lpfnWndProc = (WNDPROC)MainWndProc ;
wcListview.cbClsExtra = 0 ;
wcListview.cbWndExtra = 0 ;
wcListview.hInstance = CFactory::s_hModule ;
wcListview.hIcon = ::LoadIcon(CFactory::s_hModule,
MAKEINTRESOURCE(IDC_ICON)) ;
wcListview.hCursor = ::LoadCursor(NULL, IDC_ARROW) ;
wcListview.hbrBackground = static_cast<HBRUSH>(::GetStockObject(WHITE_BRUSH));
wcListview.lpszMenuName = NULL ;
wcListview.lpszClassName = L"MyServerWinClass" ;
BOOL bResult = ::RegisterClass(&wcListview) ;
if (!bResult)
{
return bResult ;
}
HWND hWndMain ;
hWndMain = ::CreateWindow(
L"MyServerWinClass",
L"Component Server",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
CFactory::s_hModule,
NULL) ;
// If window could not be created, return "failure".
if (!hWndMain)
{
return FALSE ;
}
// Make the window visible; update its client area;
// and return "success".
::ShowWindow(hWndMain, nCmdShow) ;
::UpdateWindow(hWndMain) ;
return TRUE ;
}
//
// Main window procedure
//
extern "C" LONG APIENTRY MainWndProc(
HWND hWnd, // window handle
UINT message, // type of message
UINT wParam, // additional information
LONG lParam) // additional information
{
//DWORD dwStyle ;
switch (message)
{
case WM_CREATE:
{
// Get size of main window
CREATESTRUCT* pcs = (CREATESTRUCT*) lParam ;
// Create a listbox for output.
g_hWndListBox = ::CreateWindow(
L"LISTBOX",
NULL,
WS_CHILD | WS_VISIBLE | LBS_USETABSTOPS
| WS_VSCROLL | LBS_NOINTEGRALHEIGHT,
0, 0, pcs->cx, pcs->cy,
hWnd,
NULL,
CFactory::s_hModule,
NULL) ;
if (g_hWndListBox == NULL)
{
// Listbox not created.
//::MessageBox(NULL,
// "Listbox not created!",
// NULL,
// MB_OK) ;
return -1 ;
}
}
break ;
case WM_SIZE:
::MoveWindow(g_hWndListBox, 0, 0,
LOWORD(lParam), HIWORD(lParam), TRUE) ;
break;
case WM_DESTROY: // message: window being destroyed
if (CFactory::CanUnloadNow() == S_OK)
{
// Only post the quit message, if there is
// no one using the program.
::PostQuitMessage(0) ;
}
break ;
case WM_CLOSE:
// Decrement the lock count.
::InterlockedDecrement(&CFactory::s_cServerLocks) ;
// The list box is going away.
g_hWndListBox = NULL ;
//Fall through LRESULT
default:
return ((LONG)DefWindowProc(hWnd, message, wParam, lParam)) ;
}
return 0 ;
}