351 lines
10 KiB
C
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
|