/****************************** 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