windows-nt/Source/XPSP1/NT/com/winole/server/srvrmain.c
2020-09-26 16:20:57 +08:00

351 lines
10 KiB
C

/****************************** Module Header ******************************\
* Module Name: Srvrmain.c Server Main module
*
* Purpose: Includes server intialization and termination code.
*
* Created: Oct 1990.
*
* Copyright (c) 1990 - 1992 Microsoft Corporation
*
* History:
* Raor (../10/1990) Designed, coded
* curts created portable version for WIN16/32
*
\***************************************************************************/
#include "windows.h"
#include "ole.h"
#include "dde.h"
#include "cmacs.h"
#include "srvr.h"
#ifndef WF_WLO
#define WF_WLO 0x8000
#endif
// ordinal number of new Win31 API IsTask
#define ORD_IsTask 320
// ordinal number of new Win31 API SetMetaFileBitsBetter
#define ORD_SetMetaFileBitsBetter 196
#ifdef FIREWALLS
short ole_flags;
char szDebugBuffer[80];
void SetOleFlags(void);
#endif
// public vars.
// atomes used in the systems
ATOM aStdExit; // "StdExit"
ATOM aStdCreate; // "StdNewDicument"
ATOM aStdOpen; // "StdOpenDocument"
ATOM aStdEdit; // "StdOpenDocument"
ATOM aStdCreateFromTemplate; // "StdNewFromTemplate"
ATOM aStdClose; // "StdCloseDocument"
ATOM aStdShowItem; // "StdShowItem"
ATOM aStdDoVerbItem; // "StddoVerbItem"
ATOM aSysTopic; // "System"
ATOM aOLE; // "OLE"
ATOM aStdDocName; // "StdDocumentName"
ATOM cfBinary; // "Binary format"
ATOM cfNative; // "NativeFormat"
ATOM cfLink; // "ObjectLink"
ATOM cfOwnerLink; // "Ownerlink"
ATOM aChange; // "Change"
ATOM aSave; // "Save"
ATOM aClose; // "Close"
ATOM aProtocols; // "Protocols"
ATOM aTopics; // "Topics"
ATOM aFormats; // "Formats"
ATOM aStatus; // "Status"
ATOM aEditItems; // "Edit items
ATOM aTrue; // "True"
ATOM aFalse; // "False"
// !!! free the proc instances.
FARPROC lpSendRenameMsg; // Call back enum props for rename
FARPROC lpSendDataMsg; // Call back enum props for data
FARPROC lpFindItemWnd; // Callback in enum props of
FARPROC lpItemCallBack; // CallBack for object
FARPROC lpTerminateClients; // Callback in Doc enum properties
FARPROC lpTerminateDocClients; // Callback in Doc enum properties
FARPROC lpDeleteClientInfo; // proc for deleteing each item client
FARPROC lpEnumForTerminate; // proc for terminating clients not in rename list
FARPROC lpfnSetMetaFileBitsBetter = NULL;
FARPROC lpfnIsTask = NULL;
HANDLE hdllInst;
VOID FAR PASCAL WEP(int);
#ifdef WIN16
BOOL bProtMode;
BOOL bWLO = FALSE;
BOOL bWin30 = FALSE;
#pragma alloc_text(WEP_TEXT, WEP)
//DLL entry:
int FAR PASCAL LibMain (
HANDLE hInst,
WORD wDataSeg,
WORD cbHeapSize,
LPSTR lpszCmdLine
#endif
#ifdef WIN32 //WIN32
BOOL LibMain(
HANDLE hInst,
ULONG Reason,
PCONTEXT Context
#endif
){
WNDCLASS wc;
Puts("LibMain");
#ifdef WIN32
UNREFERENCED_PARAMETER(Context);
if (Reason == DLL_PROCESS_DETACH)
{
WEP(0);
return TRUE;
}
else if (Reason != DLL_PROCESS_ATTACH)
return TRUE;
#endif
#ifdef FIREWALLS
SetOleFlags();
#endif
hdllInst = hInst;
#ifdef WIN16
bProtMode = (BOOL) (GetWinFlags() & WF_PMODE & 0x0000FFFF);
bWLO = (BOOL) (GetWinFlags() & WF_WLO);
bWin30 = (!bWLO && ((WORD) GetVersion()) <= 0x0003);
#endif
// !!! Put all this stuff thru soemkind of table so that we can
// save code.
// register all the atoms.
aStdExit = GlobalAddAtom ((LPSTR)"StdExit");
aStdCreate = GlobalAddAtom ((LPSTR)"StdNewDocument");
aStdOpen = GlobalAddAtom ((LPSTR)"StdOpenDocument");
aStdEdit = GlobalAddAtom ((LPSTR)"StdEditDocument");
aStdCreateFromTemplate = GlobalAddAtom ((LPSTR)"StdNewfromTemplate");
aStdClose = GlobalAddAtom ((LPSTR)"StdCloseDocument");
aStdShowItem = GlobalAddAtom ((LPSTR)"StdShowItem");
aStdDoVerbItem = GlobalAddAtom ((LPSTR)"StdDoVerbItem");
aSysTopic = GlobalAddAtom ((LPSTR)"System");
aOLE = GlobalAddAtom ((LPSTR)"OLEsystem");
aStdDocName = GlobalAddAtom ((LPSTR)"StdDocumentName");
aProtocols = GlobalAddAtom ((LPSTR)"Protocols");
aTopics = GlobalAddAtom ((LPSTR)"Topics");
aFormats = GlobalAddAtom ((LPSTR)"Formats");
aStatus = GlobalAddAtom ((LPSTR)"Status");
aEditItems = GlobalAddAtom ((LPSTR)"EditEnvItems");
aTrue = GlobalAddAtom ((LPSTR)"True");
aFalse = GlobalAddAtom ((LPSTR)"False");
aChange = GlobalAddAtom ((LPSTR)"Change");
aSave = GlobalAddAtom ((LPSTR)"Save");
aClose = GlobalAddAtom ((LPSTR)"Close");
// create the proc instances for the required entry pts.
lpSendRenameMsg = (FARPROC)MakeProcInstance (SendRenameMsg, hdllInst);
lpSendDataMsg = (FARPROC)MakeProcInstance (SendDataMsg, hdllInst);
lpFindItemWnd = (FARPROC)MakeProcInstance (FindItemWnd, hdllInst);
lpItemCallBack = (FARPROC)MakeProcInstance (ItemCallBack, hdllInst);
lpTerminateClients = (FARPROC)MakeProcInstance (TerminateClients, hdllInst);
lpTerminateDocClients = (FARPROC)MakeProcInstance (TerminateDocClients, hdllInst);
lpDeleteClientInfo = (FARPROC)MakeProcInstance (DeleteClientInfo, hdllInst);
lpEnumForTerminate = (FARPROC)MakeProcInstance (EnumForTerminate , hdllInst);
// register the clipboard formats
cfNative = (OLECLIPFORMAT)RegisterClipboardFormat("Native");
cfBinary = (OLECLIPFORMAT)RegisterClipboardFormat("Binary");
cfLink = (OLECLIPFORMAT)RegisterClipboardFormat("ObjectLink");
cfOwnerLink = (OLECLIPFORMAT)RegisterClipboardFormat("OwnerLink");
wc.style = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(LONG_PTR) + //Ask for extra space for storing the
//ptr to srvr/doc/iteminfo.
sizeof (WORD) + // for LE chars
sizeof (UINT_PTR); // for keeping the hDLLInst.
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground= NULL;
wc.lpszMenuName = NULL;
// Srvr window class
wc.lpfnWndProc = SrvrWndProc;
wc.lpszClassName= SRVR_CLASS;
if (!RegisterClass(&wc))
return 0;
// document window class
wc.lpfnWndProc = DocWndProc;
wc.lpszClassName = DOC_CLASS;
if (!RegisterClass(&wc))
return 0;
// Item (object) window class
wc.lpfnWndProc = ItemWndProc;
wc.lpszClassName = ITEM_CLASS;
wc.cbWndExtra = sizeof(LONG_PTR); // for items do not need extra stuff.
if (!RegisterClass(&wc))
return 0;
#ifdef WIN16
if (!bWin30) {
HANDLE hModule;
if (hModule = GetModuleHandle ("GDI"))
lpfnSetMetaFileBitsBetter
= GetProcAddress (hModule,
(LPSTR) MAKELONG(ORD_SetMetaFileBitsBetter, 0));
if (hModule = GetModuleHandle ("KERNEL"))
lpfnIsTask
= GetProcAddress (hModule, (LPSTR) MAKELONG(ORD_IsTask, 0));
}
if (cbHeapSize != 0)
UnlockData(0);
#endif
return 1;
}
VOID APIENTRY WEP (int nParameter)
{
Puts("LibExit");
#ifdef WIN16
if (nParameter == WEP_SYSTEM_EXIT)
DEBUG_OUT ("---L&E DLL EXIT on system exit---",0)
else {
if (nParameter == WEP_FREE_DLL)
DEBUG_OUT ("---L&E DLL EXIT---",0)
else
return;
}
#endif
#ifdef WIN32
UNREFERENCED_PARAMETER(nParameter);
DEBUG_OUT ("---L&E DLL EXIT---",0)
#endif
// free the global atoms.
if (aStdExit)
GlobalDeleteAtom (aStdExit);
if (aStdCreate)
GlobalDeleteAtom (aStdCreate);
if (aStdOpen)
GlobalDeleteAtom (aStdOpen);
if (aStdEdit)
GlobalDeleteAtom (aStdEdit);
if (aStdCreateFromTemplate)
GlobalDeleteAtom (aStdCreateFromTemplate);
if (aStdClose)
GlobalDeleteAtom (aStdClose);
if (aStdShowItem)
GlobalDeleteAtom (aStdShowItem);
if (aStdDoVerbItem)
GlobalDeleteAtom (aStdDoVerbItem);
if (aSysTopic)
GlobalDeleteAtom (aSysTopic);
if (aOLE)
GlobalDeleteAtom (aOLE);
if (aStdDocName)
GlobalDeleteAtom (aStdDocName);
if (aProtocols)
GlobalDeleteAtom (aProtocols);
if (aTopics)
GlobalDeleteAtom (aTopics);
if (aFormats)
GlobalDeleteAtom (aFormats);
if (aStatus)
GlobalDeleteAtom (aStatus);
if (aEditItems)
GlobalDeleteAtom (aEditItems);
if (aTrue)
GlobalDeleteAtom (aTrue);
if (aFalse)
GlobalDeleteAtom (aFalse);
if (aChange)
GlobalDeleteAtom (aChange);
if (aSave)
GlobalDeleteAtom (aSave);
if (aClose)
GlobalDeleteAtom (aClose);
// !!! for some reason these FreeprocInstances are crashing the system.
#if 0
FreeProcInstance (lpSendRenameMsg);
FreeProcInstance (lpSendDataMsg);
FreeProcInstance (lpFindItemWnd);
FreeProcInstance (lpItemCallBack);
FreeProcInstance (lpTerminateClients);
FreeProcInstance (lpTerminateDocClients);
FreeProcInstance (lpDeleteClientInfo);
FreeProcInstance (EnumForTerminate);
#endif
}
#ifdef FIREWALLS
void SetOleFlags()
{
char buffer[80];
if(GetProfileString ("OleDll",
"Puts","", (LPSTR)buffer, 80))
ole_flags = DEBUG_PUTS;
else
ole_flags = 0;
if(GetProfileString ("OleDll",
"DEBUG_OUT","", (LPSTR)buffer, 80))
ole_flags |= DEBUG_DEBUG_OUT;
}
#endif