.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 2000-2004 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $SQL$Project Distributed Database System$VPA09MC$
.tt 2 $$$
.TT 3 $BurkhardD$SHARED MEMORY HANDLING$2001-05-10$
***********************************************************
.nf

.nf


    ========== licence begin  GPL
    Copyright (c) 2000-2004 SAP AG

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end

.fo


.fo
Module  :
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
Define  :
#ifndef DEBUG
#line 20 "vpa09mc"
#endif
#include <windows.h>
#include <stdio.h>
#include <process.h>

#define PA09_CLASSNAME "LiveCache INTERFACE TRACE"

typedef struct {
  DWORD cbSize;
  UCHAR szComponent[MAX_PATH];
  DWORD cbVersion[4];
} pa09Component;

LPVOID pa09CreateSharedData(LPSTR szMapName, DWORD cbSize);

BOOL pa09RegisterTF(pa09Component *pComponent, HANDLE hModule);
BOOL pa09UnregisterTF(HANDLE hModule);

.CM *-END-* define --------------------------------------
Use     :
.CM *-END-* use -----------------------------------------
Synonym :
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : BurkhardD
.sp
.cp 3
Created : 02-04-1998
.sp
.cp 3
Version : 1998-02-04
.sp
.cp 3
Release :  7.3    Date : 2001-05-10
.sp
Specification:
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.CM -lll-
Code    :
#ifndef DEBUG
#line 68 "vpa09mc"
#endif

HANDLE pa09CreateMap(LPSTR szMapName, DWORD cbSize);
LPVOID pa09MapView(HANDLE hMap, DWORD cbSize);

LRESULT FAR PASCAL pa09WndProc(HWND hw,UINT iMsg,WPARAM uP1,LONG lP2);

static pa09Component pa09DefComponent = { sizeof(pa09Component),
                                          "UNKNOWN", 0, 0, 0, 0};

HWND pa09hWnd = 0;


HANDLE pa09CreateMap(LPSTR szMapName, DWORD cbSize)
{
   HANDLE MapHandle;

   MapHandle= CreateFileMapping((HANDLE) INVALID_HANDLE_VALUE,
                                NULL,
                                PAGE_READWRITE,
                                0,
                                cbSize,
                                szMapName);

   return(MapHandle);
} /* pa09CreateMap */


LPVOID pa09MapView(HANDLE hMap, DWORD cbSize)
{
   LPVOID MappedPointer;

   MappedPointer= MapViewOfFile(hMap,
                                FILE_MAP_WRITE | FILE_MAP_READ,
                                0, 0, cbSize);
   
   return(MappedPointer);
} /* pa09MapView */


LPVOID pa09CreateSharedData(LPSTR szMapName, DWORD cbSize)
{
  HANDLE hMap;
  LPVOID pShrMem;
  
  hMap = pa09CreateMap(szMapName, cbSize);
  if (hMap) {
    pShrMem = pa09MapView(hMap, cbSize);
  };
  
  return(pShrMem);
} /* pa09CreateSharedData */


BOOL pa09RegisterTF(pa09Component* pComponent, HANDLE hModule)
{
  WNDCLASS wc;
  char szBuf[MAX_PATH];      
  char szMapFileName[MAX_PATH];
  wc.style=CS_VREDRAW | CS_HREDRAW; 
  wc.lpfnWndProc=(WNDPROC) pa09WndProc;
  wc.cbClsExtra=0; 
  wc.cbWndExtra=0;
  wc.hInstance=hModule; 
  wc.hIcon=NULL; 
  wc.hCursor=NULL;
  wc.hbrBackground=(HBRUSH)(COLOR_BACKGROUND);
  wc.lpszMenuName=0;
  wc.lpszClassName=PA09_CLASSNAME; 

  if (!RegisterClass(&wc)) {
    DWORD cbError = GetLastError();
  }

  GetModuleFileName(NULL, szBuf, sizeof(szBuf));      
  pa09hWnd = CreateWindow(PA09_CLASSNAME, szBuf, WS_OVERLAPPEDWINDOW, 
			  CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 
			  HWND_DESKTOP, 0, hModule, NULL);

  if (pa09hWnd) {
    DWORD cbLen;
    LPVOID pShrMem;
    sprintf(szMapFileName, PA09_CLASSNAME"%ld", getpid());

    pComponent = (pComponent) ? pComponent : &pa09DefComponent;
    
    cbLen = (pComponent->cbSize > 0) ?
        pComponent->cbSize : sizeof(pComponent->cbSize);
  
    pShrMem = pa09CreateSharedData(szMapFileName, cbLen);
    if (pShrMem) {
      memcpy(pShrMem, pComponent, cbLen);
    }
  }
  return(TRUE);
} /* pa09RegisterTF */


BOOL pa09UnregisterTF(HANDLE hModule)
{
  if (pa09hWnd) {
    DestroyWindow(pa09hWnd);
    pa09hWnd = 0;
  }
  UnregisterClass(PA09_CLASSNAME, hModule);

  return (TRUE);
} /* pa09UnregisterTF */


LRESULT FAR PASCAL pa09WndProc(HWND hw,UINT iMsg,WPARAM uP1,LONG lP2)
{
   return(DefWindowProc(hw,iMsg,uP1,lP2));
} /* pa09WndProc */

.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
