1373 lines
31 KiB
C
1373 lines
31 KiB
C
|
||
#include <windows.h>
|
||
#include <port1632.h>
|
||
#include <ddeml.h>
|
||
#include <string.h>
|
||
#include "wrapper.h"
|
||
#include "ddestrs.h"
|
||
|
||
extern BOOL UpdateCount(HWND,INT,INT);
|
||
BOOL Balance(INT);
|
||
|
||
/*
|
||
* Service routines
|
||
*/
|
||
|
||
/*************************** Private Function ******************************\
|
||
|
||
GetHINSTANCE
|
||
|
||
\***************************************************************************/
|
||
|
||
HINSTANCE GetHINSTANCE( HWND hwnd ) {
|
||
HINSTANCE hInstance;
|
||
|
||
#ifdef WIN32
|
||
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
|
||
#else
|
||
hInstance=(HINSTANCE)GetWindowWord(hwnd,GWW_HINSTANCE);
|
||
#endif
|
||
|
||
return hInstance;
|
||
|
||
}
|
||
|
||
//*****************************************************************************
|
||
//************************** DispWndProc **************************
|
||
//*****************************************************************************
|
||
|
||
LONG FAR PASCAL DispWndProc( HWND hwnd , UINT msg, WPARAM wp, LONG lp) {
|
||
|
||
return DefWindowProc(hwnd,msg,wp,lp);
|
||
|
||
}
|
||
|
||
/*************************** Private Function ******************************\
|
||
*
|
||
* CreateDisplayWindow
|
||
*
|
||
\***************************************************************************/
|
||
|
||
HWND CreateDisplayWindow( HWND hwndParent, int nPosIndex ) {
|
||
WNDCLASS wc,wcc;
|
||
LPWNDCLASS lpWndClass=&wc;
|
||
HWND hwnd;
|
||
RECT r;
|
||
int stpy,stpx,cy;
|
||
char sz[100];
|
||
LPSTR lpstr=&sz[0];
|
||
|
||
#ifdef WIN32
|
||
LPCTSTR lpsz;
|
||
#else
|
||
LPSTR lpsz;
|
||
#endif
|
||
|
||
char szname[100];
|
||
|
||
strcpy(&szname[0],"Display Window");
|
||
|
||
wc.style = 0;
|
||
wc.lpfnWndProc = DispWndProc;
|
||
wc.cbClsExtra = 0;
|
||
wc.cbWndExtra = 0;
|
||
wc.hInstance = GetHINSTANCE(hwndParent);
|
||
wc.hIcon = LoadIcon(NULL,IDI_EXCLAMATION );
|
||
wc.hCursor = LoadCursor(NULL,IDC_ARROW );
|
||
wc.lpszMenuName = NULL;
|
||
wc.lpszClassName = "Display Window";
|
||
wc.hbrBackground = CreateSolidBrush(RGB(0,255,255));
|
||
|
||
lpsz=(LPSTR)wc.lpszClassName;
|
||
|
||
if(!GetClassInfo(wc.hInstance,lpsz,&wcc)) {
|
||
RegisterClass(lpWndClass);
|
||
}
|
||
|
||
GetClientRect(hwndParent,&r);
|
||
|
||
stpx =r.right-r.left;
|
||
stpy =((r.bottom-r.top)/3);
|
||
|
||
switch(nPosIndex) {
|
||
case 1: cy=r.bottom-(3*cyText);
|
||
break;
|
||
case 2: cy=r.bottom-(6*cyText);
|
||
break;
|
||
case 3: cy=r.bottom-(9*cyText);
|
||
break;
|
||
case 4: cy=r.bottom-(12*cyText);
|
||
break;
|
||
case 5: cy=r.bottom-(15*cyText);
|
||
break;
|
||
default: cy=r.bottom-(18*cyText);
|
||
break;
|
||
}
|
||
|
||
if (!IsWindow(hwndParent)) DOut((HWND)NULL,"DdeStrs.exe -- ERR:Bad parent hwnd=%u!\r\n",0,(LONG)hwndParent);
|
||
|
||
hwnd = CreateWindowEx(WS_EX_DLGMODALFRAME,
|
||
"Display Window",
|
||
&szname[0],
|
||
WS_CHILD|WS_VISIBLE|WS_CAPTION|WS_DISABLED,
|
||
0,
|
||
cy,
|
||
stpx,
|
||
3*cyText,
|
||
hwndParent,
|
||
NULL,
|
||
lpWndClass->hInstance,
|
||
NULL );
|
||
|
||
if ( !IsWindow(hwnd) )
|
||
{
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:Display window not created\r\n");
|
||
UnregisterClass("Display Window",wc.hInstance);
|
||
}
|
||
|
||
return hwnd;
|
||
|
||
}
|
||
|
||
BOOL PokeTestItem_Text(
|
||
HDDEDATA hData)
|
||
{
|
||
LPBYTE lpData;
|
||
HDC hdc;
|
||
HBRUSH hBrush;
|
||
PAINTSTRUCT ps;
|
||
RECT rc;
|
||
DWORD cbData;
|
||
HWND hwndDisplay;
|
||
|
||
Balance(OFFSET_CLIENT);
|
||
|
||
hwndDisplay=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwndDisplay,"Client - CF_TEXT");
|
||
|
||
lpData = (LPBYTE) DdeAccessData( hData, &cbData );
|
||
|
||
hdc = GetDC(hwndDisplay);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc ret from GetDC (client:CF_TEXT)!\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
return 0;
|
||
}
|
||
|
||
hBrush=CreateSolidBrush(WHITE);
|
||
if(!hBrush) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hBrush ret from CreateSolidBrush (client:CF_TEXT)!\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
EndPaint(hwndDisplay,&ps);
|
||
return 0;
|
||
}
|
||
|
||
GetClientRect(hwndDisplay,&rc);
|
||
|
||
FillRect(hdc,&rc,hBrush);
|
||
DeleteObject(hBrush);
|
||
|
||
DrawText(hdc, lpData, -1, &rc, DT_LEFT|DT_TOP);
|
||
ReleaseDC(hwndDisplay,hdc);
|
||
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
|
||
return(TRUE);
|
||
|
||
}
|
||
|
||
BOOL PokeTestItem_DIB(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
HDC hdc;
|
||
RECT r;
|
||
INT width,height;
|
||
LPBITMAPINFO lpbitinfo;
|
||
LPBYTE lpbits;
|
||
HANDLE hmem;
|
||
LPBYTE lpData;
|
||
DWORD cbData;
|
||
LPBYTE lp;
|
||
int iexRGB;
|
||
|
||
Balance(OFFSET_CLIENT);
|
||
|
||
lpData = (LPBYTE) DdeAccessData( hData, &cbData );
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Client - CF_DIB");
|
||
|
||
hdc = GetDC(hwnd);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
return 0;
|
||
}
|
||
|
||
GetClientRect(hwnd,&r);
|
||
width=r.right-r.left;
|
||
height=r.bottom-r.top;
|
||
|
||
#ifdef WIN32
|
||
memcpy(&hmem,lpData,sizeof(HANDLE));
|
||
#else
|
||
_fmemcpy(&hmem,lpData,sizeof(HANDLE));
|
||
#endif
|
||
|
||
if(!hmem) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:hmem recieved from server=NULL (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
ReleaseDC(hwnd,hdc);
|
||
return 0;
|
||
}
|
||
|
||
lp =(LPBYTE)GlobalLock(hmem);
|
||
lpbitinfo=(LPBITMAPINFO)lp;
|
||
|
||
// iexRGB is ((2^n)-1) where n=biBitCount and we are computing the
|
||
// number of RGBQUAD structures. Remember that part of the
|
||
// BITMAPINFO structure contains 1 RGBQUAD already.
|
||
|
||
iexRGB =((0x0001<<lpbitinfo->bmiHeader.biBitCount)-1)*sizeof(RGBQUAD);
|
||
lpbits=lp+(sizeof(BITMAPINFO)+iexRGB);
|
||
|
||
SetDIBitsToDevice(hdc,
|
||
0,
|
||
0,
|
||
(UINT)lpbitinfo->bmiHeader.biWidth,
|
||
(UINT)lpbitinfo->bmiHeader.biHeight,
|
||
0,
|
||
0,
|
||
0,
|
||
(UINT)(lpbitinfo->bmiHeader.biHeight),
|
||
lpbits,
|
||
lpbitinfo,
|
||
DIB_RGB_COLORS);
|
||
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
BOOL PokeTestItem_BITMAP(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
HDC hdc,hdcMem;
|
||
RECT r;
|
||
INT width,height;
|
||
HBITMAP hbmap;
|
||
HANDLE hobj;
|
||
LPBYTE lpData;
|
||
DWORD cbData;
|
||
|
||
Balance(OFFSET_CLIENT);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Client - CF_BITMAP");
|
||
|
||
lpData = (LPBYTE) DdeAccessData( hData, &cbData );
|
||
|
||
#ifdef WIN32
|
||
memcpy(&hbmap,lpData,sizeof(HBITMAP));
|
||
#else
|
||
_fmemcpy(&hbmap,lpData,sizeof(HBITMAP));
|
||
#endif
|
||
|
||
hdc = GetDC(hwnd);
|
||
hdcMem = CreateCompatibleDC(hdc);
|
||
|
||
if(!hdc||!hdcMem) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
if(hdc) ReleaseDC(hwndMain,hdc);
|
||
if(hdcMem) DeleteDC(hdcMem);
|
||
return 0;
|
||
}
|
||
|
||
if(!hbmap) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hbmap (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwndMain,hdc);
|
||
return 0;
|
||
}
|
||
|
||
GetClientRect(hwnd,&r);
|
||
width=r.right-r.left;
|
||
height=r.bottom-r.top;
|
||
|
||
hobj=SelectObject(hdcMem,hbmap);
|
||
if(!hobj) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:SelectObject failed (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwndMain,hdc);
|
||
return 0;
|
||
}
|
||
|
||
if(!BitBlt(hdc,0,0,width,height,hdcMem,0,0,SRCCOPY))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:BitBlt failed (client)\r\n");
|
||
|
||
hobj=SelectObject(hdcMem,hobj);
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
|
||
return(TRUE);
|
||
|
||
}
|
||
|
||
#ifdef WIN32
|
||
BOOL PokeTestItem_ENHMETA(
|
||
HDDEDATA hData)
|
||
{
|
||
LPBYTE lpData;
|
||
HWND hwnd;
|
||
HDC hdc;
|
||
HANDLE hemf;
|
||
DWORD cbData;
|
||
RECT r;
|
||
|
||
Balance(OFFSET_CLIENT);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Client - CF_ENHMETAFILE");
|
||
|
||
lpData = (LPBYTE) DdeAccessData( hData, &cbData );
|
||
|
||
hdc = GetDC(hwnd);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
return 0;
|
||
}
|
||
|
||
#ifdef WIN32
|
||
memcpy(&hemf,lpData,sizeof(HANDLE));
|
||
#else
|
||
_fmemcpy(&hemf,lpData,sizeof(HANDLE));
|
||
#endif
|
||
|
||
GetClientRect(hwnd,&r);
|
||
if(!PlayEnhMetaFile(hdc,hemf,&r))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:PlayMetaFile failed (client)\r\n");
|
||
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
|
||
return(TRUE);
|
||
|
||
}
|
||
#endif
|
||
|
||
BOOL PokeTestItem_METAPICT(
|
||
HDDEDATA hData)
|
||
{
|
||
LPBYTE lpData;
|
||
HWND hwnd;
|
||
HDC hdc;
|
||
HANDLE hmf;
|
||
LPMETAFILEPICT lpMfp;
|
||
HANDLE hmem;
|
||
DWORD cbData;
|
||
|
||
Balance(OFFSET_CLIENT);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Client - CF_METAFILEPICT");
|
||
|
||
lpData = (LPBYTE) DdeAccessData( hData, &cbData );
|
||
|
||
hdc = GetDC(hwnd);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
return 0;
|
||
}
|
||
|
||
#ifdef WIN32
|
||
memcpy(&hmem,lpData,sizeof(HANDLE));
|
||
#else
|
||
_fmemcpy(&hmem,lpData,sizeof(HANDLE));
|
||
#endif
|
||
|
||
lpMfp=(LPMETAFILEPICT)GlobalLock(hmem);
|
||
hmf=lpMfp->hMF;
|
||
|
||
if(!PlayMetaFile(hdc,hmf))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:PlayMetaFile failed (client)\r\n");
|
||
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
|
||
return(TRUE);
|
||
|
||
}
|
||
|
||
BOOL PokeTestItem_PALETTE(
|
||
HDDEDATA hData)
|
||
{
|
||
LPBYTE lpData;
|
||
HWND hwnd;
|
||
HPALETTE hpal;
|
||
HDC hdc;
|
||
RECT r;
|
||
HANDLE hobj;
|
||
HANDLE hbrush;
|
||
DWORD cbData;
|
||
|
||
Balance(OFFSET_CLIENT);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Client - CF_PALETTE");
|
||
|
||
lpData = (LPBYTE) DdeAccessData( hData, &cbData );
|
||
|
||
GetClientRect(hwnd,&r);
|
||
|
||
hdc=GetDC(hwnd);
|
||
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
return 0;
|
||
}
|
||
|
||
#ifdef WIN32
|
||
memcpy(&hpal,lpData,sizeof(HPALETTE));
|
||
#else
|
||
_fmemcpy(&hpal,lpData,sizeof(HPALETTE));
|
||
#endif
|
||
|
||
hobj=(HPALETTE)SelectPalette(hdc,hpal,FALSE);
|
||
|
||
if(!hobj) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hobj:SelectPalette failed (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
ReleaseDC(hwnd,hdc);
|
||
return 0;
|
||
}
|
||
|
||
RealizePalette(hdc);
|
||
|
||
hbrush=CreateSolidBrush(PALETTEINDEX(0));
|
||
if(!hbrush) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hbrush ret from CreatSolidBrush (client)\r\n");
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
SelectPalette(hdc,(HPALETTE)hobj,FALSE);
|
||
ReleaseDC(hwnd,hdc);
|
||
return 0;
|
||
}
|
||
|
||
FillRect(hdc,&r,hbrush);
|
||
DeleteObject(hbrush);
|
||
|
||
SelectPalette(hdc,(HPALETTE)hobj,FALSE);
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
DdeUnaccessData(hData); //JOHNSP:CHANGE
|
||
|
||
return(TRUE);
|
||
|
||
}
|
||
|
||
HDDEDATA RenderTestItem_Text(
|
||
HDDEDATA hData)
|
||
{
|
||
HDC hdc;
|
||
HBRUSH hBrush;
|
||
PAINTSTRUCT ps;
|
||
RECT rc;
|
||
HDDEDATA hddedata;
|
||
LONG l;
|
||
HDDEDATA FAR *hAppOwned;
|
||
HANDLE hmem;
|
||
HWND hwndDisplay;
|
||
|
||
Balance(OFFSET_SERVER);
|
||
|
||
hwndDisplay=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwndDisplay,"Server - CF_TEXT");
|
||
|
||
// if we are running app owned then we just reuse our
|
||
// last handle.
|
||
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HAPPOWNED);
|
||
hAppOwned=(HDDEDATA FAR *)GlobalLock(hmem);
|
||
|
||
if(hAppOwned[TXT]!=0L) {
|
||
hddedata=hAppOwned[TXT];
|
||
GlobalUnlock(hmem);
|
||
return hddedata;
|
||
}
|
||
|
||
hdc=GetDC(hwndDisplay);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc ret from GetDC! (server)\r\n");
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
hBrush=CreateSolidBrush(WHITE);
|
||
if(!hBrush) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hBrush ret from CreateSolidBrush! (server)\r\n");
|
||
EndPaint(hwndDisplay,&ps);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
GetClientRect(hwndDisplay,&rc);
|
||
FillRect(hdc,&rc,hBrush);
|
||
DeleteObject(hBrush);
|
||
|
||
DrawText(hdc, "Data:CF_TEXT format", -1, &rc, DT_LEFT|DT_TOP);
|
||
ReleaseDC(hwndDisplay,hdc);
|
||
|
||
hddedata=DdeAddData(hData, "Data:CF_TEXT format", 20, 0);
|
||
|
||
l=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(l&FLAG_APPOWNED) {
|
||
hAppOwned[TXT]=hddedata;
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
return hddedata;
|
||
}
|
||
|
||
HDDEDATA RenderTestItem_DIB(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
LONG length;
|
||
HDC hdc,hdcMem;
|
||
RECT r;
|
||
INT width,height,dibhdr;
|
||
HBITMAP hbmap;
|
||
HANDLE hobj;
|
||
LPBITMAPINFO lpbitinfo;
|
||
LPBITMAPINFOHEADER lpbithdr;
|
||
LPBYTE lpbits;
|
||
LPBYTE lpdata;
|
||
HDDEDATA hddedata;
|
||
INT ip,ibpp;
|
||
CHAR sz[100];
|
||
LONG l;
|
||
HDDEDATA FAR *hAppOwned;
|
||
HANDLE hmem,hm;
|
||
|
||
Balance(OFFSET_SERVER);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Server - CF_DIB");
|
||
|
||
// if we are running app owned then we just reuse our
|
||
// last handle.
|
||
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HAPPOWNED);
|
||
hAppOwned=(HDDEDATA FAR *)GlobalLock(hmem);
|
||
|
||
if(hAppOwned[DIB]!=0L) {
|
||
hddedata=hAppOwned[DIB];
|
||
GlobalUnlock(hmem);
|
||
return hddedata;
|
||
}
|
||
|
||
length = sizeof(HBITMAP);
|
||
|
||
hdc=GetDC(hwnd);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (server)\r\n");
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
ibpp=GetDeviceCaps(hdc,BITSPIXEL);
|
||
ip=GetDeviceCaps(hdc,PLANES);
|
||
|
||
hdcMem=CreateCompatibleDC(hdc);
|
||
|
||
if(!hdcMem) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc (server)\r\n");
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
GetClientRect(hwnd,&r);
|
||
width=r.right-r.left;
|
||
height=r.bottom-r.top;
|
||
|
||
hbmap=CreateCompatibleBitmap(hdcMem,width,height);
|
||
if(!hbmap) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hbmap-CreateCompatibleBitmap failed (server)\r\n");
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
hobj=SelectObject(hdcMem,hbmap);
|
||
if(!hobj) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), SelectObject failed\r\n");
|
||
DeleteObject(hbmap);
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
if(!PatBlt(hdcMem,r.left,r.top,width,height,WHITENESS))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), PatBlt failed\r\n");
|
||
|
||
// Deselect object (must be done according to docs)
|
||
|
||
hobj=SelectObject(hdcMem,hobj);
|
||
if(!hobj) DDEMLERROR("DdeStrs.Exe -- ERR (Server), SelectObject [call 2] failed\r\n");
|
||
|
||
|
||
// Set up for a monochrome bitmap.
|
||
|
||
dibhdr =sizeof(BITMAPINFO)+(sizeof(RGBQUAD));
|
||
|
||
|
||
// dib header plus area for raw bits
|
||
|
||
length =dibhdr+(((width*ibpp)+31)/32)*ip*height*4;
|
||
|
||
// Allocate memory for the DIB
|
||
|
||
hm=GlobalAlloc(GMEM_ZEROINIT|GMEM_DDESHARE,length);
|
||
if(!hm) {
|
||
DDEMLERROR("DdeStrs.Exe - RenderTestItem_DIB\r\n");
|
||
wsprintf(sz, "DdeStrs.Exe - GobalAlloc failed, allocation size = %d\r\n", length );
|
||
DDEMLERROR(&sz[0]);
|
||
|
||
DeleteObject(hbmap);
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
lpdata=(LPBYTE)GlobalLock(hm);
|
||
|
||
lpbitinfo=(LPBITMAPINFO)lpdata;
|
||
lpbithdr=&(lpbitinfo->bmiHeader);
|
||
|
||
lpbits=lpdata+dibhdr;
|
||
|
||
lpbitinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
|
||
lpbitinfo->bmiHeader.biWidth=width;
|
||
lpbitinfo->bmiHeader.biHeight=height;
|
||
lpbitinfo->bmiHeader.biPlanes=1;
|
||
lpbitinfo->bmiHeader.biBitCount=1;
|
||
|
||
// I allocated zero init memory so the other values should
|
||
// be 0 and will use the default.
|
||
|
||
if(!GetDIBits(hdcMem,
|
||
hbmap,
|
||
0,
|
||
height,
|
||
lpbits,
|
||
lpbitinfo,
|
||
DIB_RGB_COLORS))
|
||
{
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), GetDIBits failed\r\n");
|
||
}
|
||
|
||
SetDIBitsToDevice(hdc,
|
||
0,
|
||
0,
|
||
(UINT)lpbitinfo->bmiHeader.biWidth,
|
||
(UINT)lpbitinfo->bmiHeader.biHeight,
|
||
0,
|
||
0,
|
||
0,
|
||
(UINT)(lpbitinfo->bmiHeader.biHeight),
|
||
lpbits,
|
||
lpbitinfo,
|
||
DIB_RGB_COLORS);
|
||
|
||
hddedata=DdeAddData(hData, &hm, sizeof(HANDLE), 0);
|
||
|
||
GlobalUnlock(hm);
|
||
|
||
DeleteObject(hbmap);
|
||
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
l=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(l&FLAG_APPOWNED) {
|
||
hAppOwned[DIB]=hddedata;
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
return hddedata;
|
||
}
|
||
|
||
HDDEDATA RenderTestItem_BITMAP(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
LONG length;
|
||
HDC hdc,hdcMem;
|
||
RECT r;
|
||
INT width,height;
|
||
HBITMAP hbmap;
|
||
HANDLE hobj;
|
||
HDDEDATA hddedata;
|
||
DWORD d;
|
||
LPBYTE lpdata=(LPBYTE)&d;
|
||
LONG l;
|
||
HDDEDATA FAR *hAppOwned;
|
||
HANDLE hmem;
|
||
|
||
Balance(OFFSET_SERVER);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Server - CF_BITMAP");
|
||
|
||
// if we are running app owned then we just reuse our
|
||
// last handle.
|
||
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HAPPOWNED);
|
||
hAppOwned=(HDDEDATA FAR *)GlobalLock(hmem);
|
||
|
||
if(hAppOwned[BITMAP]!=0L) {
|
||
hddedata=hAppOwned[BITMAP];
|
||
GlobalUnlock(hmem);
|
||
return hddedata;
|
||
}
|
||
|
||
length = sizeof(HBITMAP);
|
||
|
||
hdc=GetDC(hwnd);
|
||
hdcMem=CreateCompatibleDC(hdc);
|
||
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), NULL hdc\r\n");
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
if(!hdcMem) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), NULL hdc\r\n");
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
GetClientRect(hwnd,&r);
|
||
width=r.right-r.left;
|
||
height=r.bottom-r.top;
|
||
|
||
hbmap=CreateCompatibleBitmap(hdcMem,width,height);
|
||
if(!hbmap) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), NULL hbmap\r\n");
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
hobj=SelectObject(hdcMem,hbmap);
|
||
|
||
if(!hobj) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), SelectObject failed\r\n");
|
||
DeleteObject(hbmap);
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
if(!PatBlt(hdcMem,r.left,r.top,width,height,WHITENESS))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), PatBlt failed\r\n");
|
||
|
||
if(!BitBlt(hdc,0,0,width,height,hdcMem,0,0,SRCCOPY))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), BitBlt failed\r\n");
|
||
|
||
#ifdef WIN32
|
||
memcpy(lpdata,&hbmap,(INT)length);
|
||
#else
|
||
_fmemcpy(lpdata,&hbmap,(INT)length);
|
||
#endif
|
||
|
||
hddedata=DdeAddData(hData, lpdata, length, 0);
|
||
|
||
// Object will be deleted by client! Not server.
|
||
|
||
SelectObject(hdcMem,hobj);
|
||
DeleteDC(hdcMem);
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
l=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(l&FLAG_APPOWNED) {
|
||
hAppOwned[BITMAP]=hddedata;
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
return hddedata;
|
||
}
|
||
|
||
#ifdef WIN32
|
||
HDDEDATA RenderTestItem_ENHMETA(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
HDDEDATA hddedata;
|
||
HDC hdc,hdcMem;
|
||
INT width,height,length;
|
||
RECT r;
|
||
HANDLE hemf;
|
||
DWORD d;
|
||
LPBYTE lpdata=(LPBYTE)&d;
|
||
LONG l;
|
||
HDDEDATA FAR *hAppOwned;
|
||
HANDLE hmem;
|
||
|
||
#ifdef WIN32
|
||
XFORM xp;
|
||
LPXFORM lpxform=&xp;
|
||
#endif
|
||
|
||
Balance(OFFSET_SERVER);
|
||
|
||
hwnd=GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Server - CF_ENHMETAFILE");
|
||
|
||
// if we are running app owned then we just reuse our
|
||
// last handle.
|
||
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HAPPOWNED);
|
||
hAppOwned=GlobalLock(hmem);
|
||
|
||
if(hAppOwned[ENHMETA]!=0L) {
|
||
hddedata=hAppOwned[ENHMETA];
|
||
GlobalUnlock(hmem);
|
||
return hddedata;
|
||
}
|
||
|
||
hdc=GetDC(hwnd); //JOHNSP:CHANGE - below few lines
|
||
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), NULL hdc\r\n");
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
hdcMem=CreateEnhMetaFile(hdc,NULL,NULL,NULL);
|
||
|
||
if(!hdcMem) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR (Server), NULL hdc\r\n");
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
length=sizeof(HANDLE);
|
||
|
||
GetClientRect(hwnd,&r);
|
||
width=r.right-r.left;
|
||
height=r.bottom-r.top;
|
||
|
||
if(!PatBlt(hdcMem,r.left,r.top,width,height,WHITENESS))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:PatBlt failed (server)\r\n");
|
||
|
||
hemf=CloseEnhMetaFile(hdcMem);
|
||
if(!hemf) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:CloseEnhMetaFile failed (server)\r\n");
|
||
ReleaseDC(hwnd,hdc);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
#ifdef WIN32
|
||
memcpy(lpdata,&hemf,length);
|
||
#else
|
||
_fmemcpy(lpdata,&hemf,length);
|
||
#endif
|
||
|
||
if(!PlayEnhMetaFile(hdc,hemf,&r))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:PlayEnhMetaFile failed (server)\r\n");
|
||
|
||
hddedata=DdeAddData(hData, lpdata, length, 0);
|
||
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
l=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(l&FLAG_APPOWNED) {
|
||
hAppOwned[ENHMETA]=hddedata;
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
return hddedata;
|
||
|
||
}
|
||
#endif
|
||
|
||
HDDEDATA RenderTestItem_METAPICT(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
HDDEDATA hddedata;
|
||
HDC hdc,hdcMem;
|
||
INT width,height,length;
|
||
RECT r;
|
||
HANDLE hmf;
|
||
LPMETAFILEPICT lpMfp;
|
||
DWORD d;
|
||
LPBYTE lpdata=(LPBYTE)&d;
|
||
CHAR sz[100];
|
||
LONG l;
|
||
HDDEDATA FAR *hAppOwned;
|
||
HANDLE hmem,hm;
|
||
|
||
Balance(OFFSET_SERVER);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Server - CF_METAFILEPICT");
|
||
|
||
// if we are running app owned then we just reuse our
|
||
// last handle.
|
||
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HAPPOWNED);
|
||
hAppOwned=(HDDEDATA FAR *)GlobalLock(hmem);
|
||
|
||
if(hAppOwned[METAPICT]!=0L) {
|
||
hddedata=hAppOwned[METAPICT];
|
||
GlobalUnlock(hmem);
|
||
return hddedata;
|
||
}
|
||
|
||
hdcMem=CreateMetaFile(NULL);
|
||
if(!hdcMem) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR: NULL hdc ret from CreateMetaFile, (Server)\r\n");
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
length=sizeof(HANDLE);
|
||
|
||
GetClientRect(hwnd,&r);
|
||
width=r.right-r.left;
|
||
height=r.bottom-r.top;
|
||
|
||
if(!PatBlt(hdcMem,r.left,r.top,width,height,WHITENESS))
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:PatBlt failed (server)\r\n");
|
||
|
||
hmf=CloseMetaFile(hdcMem);
|
||
if(!hmf) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hmf ret CloseMetaFile! (Server)\r\n");
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
hm=GlobalAlloc(GMEM_ZEROINIT|GMEM_DDESHARE,sizeof(METAFILEPICT));
|
||
if(!hm) {
|
||
DDEMLERROR("DdeStrs.Exe - RenderTestItem_METAPICT\r\n");
|
||
wsprintf(sz, "DdeStrs.Exe - GlobalAlloc failed, allocation size = %d\r\n", sizeof(METAFILEPICT) );
|
||
DDEMLERROR(&sz[0]);
|
||
DeleteMetaFile(hmf); //JOHNSP:CHANGE
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
lpMfp=(LPMETAFILEPICT)GlobalLock(hm);
|
||
|
||
lpMfp->mm = MM_TEXT;
|
||
lpMfp->xExt = width;
|
||
lpMfp->yExt = height;
|
||
lpMfp->hMF = hmf;
|
||
|
||
GlobalUnlock(hm);
|
||
|
||
#ifdef WIN32
|
||
memcpy(lpdata,&hm,length);
|
||
#else
|
||
_fmemcpy(lpdata,&hm,length);
|
||
#endif
|
||
|
||
hdc=GetDC(hwnd);
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:NULL hdc ret from GetDC, (Server)\r\n");
|
||
GlobalFree(hm); //JOHNSP:CHANGE
|
||
DeleteMetaFile(hmf); //JOHNSP:CHANGE
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
else {
|
||
hddedata=DdeAddData(hData, lpdata, length, 0); //JOHNSP:CHANGE
|
||
PlayMetaFile(hdc,hmf);
|
||
ReleaseDC(hwnd,hdc);
|
||
}
|
||
|
||
l=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(l&FLAG_APPOWNED) {
|
||
hAppOwned[METAPICT]=hddedata;
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
return hddedata;
|
||
|
||
}
|
||
|
||
HDDEDATA RenderTestItem_PALETTE(
|
||
HDDEDATA hData)
|
||
{
|
||
HWND hwnd;
|
||
HPALETTE hpal;
|
||
LPLOGPALETTE lppal;
|
||
HDDEDATA hddedata;
|
||
INT length;
|
||
DWORD d;
|
||
LPBYTE lpdata=(LPBYTE)&d;
|
||
CHAR sz[100];
|
||
LONG l;
|
||
HDDEDATA FAR *hAppOwned;
|
||
HANDLE hmem,hm;
|
||
|
||
HDC hdc;
|
||
HANDLE hobj;
|
||
HANDLE hbrush;
|
||
RECT r;
|
||
|
||
|
||
Balance(OFFSET_SERVER);
|
||
|
||
hwnd=(HWND)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HWNDDISPLAY);
|
||
SetWindowText(hwnd,"Server - CF_PALETTE");
|
||
|
||
// if we are running app owned then we just reuse our
|
||
// last handle.
|
||
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HAPPOWNED);
|
||
hAppOwned=(HDDEDATA FAR *)GlobalLock(hmem);
|
||
|
||
if(hAppOwned[PALETTE]!=0L) {
|
||
hddedata=hAppOwned[PALETTE];
|
||
GlobalUnlock(hmem);
|
||
return hddedata;
|
||
}
|
||
|
||
length=sizeof(LOGPALETTE)+sizeof(PALETTEENTRY);
|
||
|
||
lppal=(LPLOGPALETTE)GetMem(length,&hm);
|
||
|
||
if(!hm) {
|
||
DDEMLERROR("DdeStrs.Exe - RenderTestItem_PALETTE\r\n");
|
||
wsprintf(sz, "DdeStrs.Exe - GlobalAlloc failed, allocation size = %d\r\n", length );
|
||
DDEMLERROR(&sz[0]);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
lppal->palNumEntries=1;
|
||
lppal->palVersion=0x0300;
|
||
|
||
lppal->palPalEntry[0].peRed =(BYTE)255;
|
||
lppal->palPalEntry[0].peGreen=(BYTE)255;
|
||
lppal->palPalEntry[0].peBlue =(BYTE)255;
|
||
lppal->palPalEntry[0].peFlags=(BYTE)0;
|
||
|
||
hpal=CreatePalette(lppal);
|
||
if(!hpal) {
|
||
DDEMLERROR("DdeStrs.Exe - NULL hpal ret CreatePalette! (server)\r\n");
|
||
FreeMem(hm);
|
||
GlobalUnlock(hmem);
|
||
return 0;
|
||
}
|
||
|
||
FreeMem(hm);
|
||
|
||
#ifdef WIN32
|
||
memcpy(lpdata,&hpal,sizeof(HANDLE));
|
||
#else
|
||
_fmemcpy(lpdata,&hpal,sizeof(HANDLE));
|
||
#endif
|
||
|
||
hddedata=DdeAddData(hData, lpdata, sizeof(HPALETTE), 0);
|
||
|
||
// Show that palette works.
|
||
|
||
// NOTE: From here down if we get a failure we don't abort but
|
||
// return hddedata to pass to the client. More basically if
|
||
// an error is encountered below it only affects the display
|
||
// on the server side!
|
||
|
||
GetClientRect(hwnd,&r);
|
||
|
||
hdc=GetDC(hwnd);
|
||
|
||
if(!hdc) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:Null hdc (client)\r\n");
|
||
return hddedata;
|
||
}
|
||
|
||
hobj=(HPALETTE)SelectPalette(hdc,hpal,FALSE);
|
||
|
||
if(!hobj) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:Null hobj:SelectPalette failed (client)\r\n");
|
||
ReleaseDC(hwnd,hdc);
|
||
return hddedata;
|
||
}
|
||
|
||
RealizePalette(hdc);
|
||
|
||
hbrush=CreateSolidBrush(PALETTEINDEX(0));
|
||
if(!hbrush) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR:Null hbrush ret from CreatSolidBrush (client)\r\n");
|
||
SelectPalette(hdc,(HPALETTE)hobj,FALSE);
|
||
ReleaseDC(hwnd,hdc);
|
||
return hddedata;
|
||
}
|
||
|
||
FillRect(hdc,&r,hbrush);
|
||
DeleteObject(hbrush);
|
||
|
||
SelectPalette(hdc,(HPALETTE)hobj,FALSE);
|
||
ReleaseDC(hwnd,hdc);
|
||
|
||
// if we are running appowned, save first created handle
|
||
// away for futher use.
|
||
|
||
l=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(l&FLAG_APPOWNED) {
|
||
hAppOwned[PALETTE]=hddedata;
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
return hddedata;
|
||
|
||
}
|
||
|
||
BOOL Execute(
|
||
HDDEDATA hData)
|
||
{
|
||
LPSTR psz,psz2;
|
||
BOOL fRet = FALSE;
|
||
LONG cServerhConvs;
|
||
int i;
|
||
HANDLE hmem;
|
||
HCONV FAR *pServerhConvs;
|
||
|
||
psz = DdeAccessData(hData, NULL);
|
||
|
||
#ifdef WIN16
|
||
if (!_fstricmp(psz, szExecDie)) {
|
||
#else
|
||
if (!stricmp(psz, szExecDie)) {
|
||
#endif
|
||
psz2=(LPSTR)-1;
|
||
*psz; // GP Fault!
|
||
fRet = TRUE;
|
||
|
||
#ifdef WIN16
|
||
} else if (!_fstricmp(psz, szExecRefresh)) {
|
||
#else
|
||
} else if (!stricmp(psz, szExecRefresh)) {
|
||
#endif
|
||
|
||
if (!DdePostAdvise(GetThreadLong(GETCURRENTTHREADID(),OFFSET_IDINST), 0, 0)) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR DdePostAdvise failed\r\n");
|
||
}
|
||
fRet = TRUE;
|
||
|
||
#ifdef WIN16
|
||
} else if (!_fstricmp(psz, szExecDisconnect)) {
|
||
#else
|
||
} else if (!stricmp(psz, szExecDisconnect)) {
|
||
#endif
|
||
|
||
cServerhConvs=(INT)GetThreadLong(GETCURRENTTHREADID(),OFFSET_CSERVERCONVS);
|
||
hmem=(HANDLE)GetThreadLong(GETCURRENTTHREADID(),OFFSET_HSERVERCONVS);
|
||
pServerhConvs=(HCONV FAR *)GlobalLock(hmem);
|
||
|
||
for (i = 0; i < cServerhConvs; i++) {
|
||
if (!DdeDisconnect(pServerhConvs[i])) {
|
||
DDEMLERROR("DdeStrs.Exe -- ERR DdeDisconnect failed\r\n");
|
||
}
|
||
}
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
SetThreadLong(GETCURRENTTHREADID(),OFFSET_CSERVERCONVS,0L);
|
||
UpdateCount(hwndMain,OFFSET_SERVER_CONNECT,PNT);
|
||
fRet = TRUE;
|
||
}
|
||
DdeUnaccessData(hData);
|
||
return(fRet);
|
||
}
|
||
|
||
VOID PaintServer(
|
||
HWND hwnd,
|
||
PAINTSTRUCT *pps)
|
||
{
|
||
RECT rc;
|
||
static CHAR szT[40];
|
||
|
||
GetClientRect(hwnd, &rc);
|
||
|
||
if (fServer) {
|
||
rc.left += (rc.right - rc.left) >> 1; // server info is on right half
|
||
}
|
||
rc.bottom = rc.top + cyText;
|
||
|
||
wsprintf(szT, "%d server connections", GetThreadLong(GETCURRENTTHREADID(),OFFSET_CSERVERCONVS));
|
||
DrawText(pps->hdc, szT, -1, &rc, DT_RIGHT);
|
||
OffsetRect(&rc, 0, cyText);
|
||
|
||
wsprintf(szT, "%d server count", GetWindowLong(hwnd,OFFSET_SERVER));
|
||
DrawText(pps->hdc, szT, -1, &rc, DT_RIGHT);
|
||
OffsetRect(&rc, 0, cyText);
|
||
|
||
}
|
||
|
||
|
||
HDDEDATA FAR PASCAL CustomCallback(
|
||
UINT wType,
|
||
UINT wFmt,
|
||
HCONV hConv,
|
||
HSZ hsz1,
|
||
HSZ hsz2,
|
||
HDDEDATA hData,
|
||
DWORD dwData1,
|
||
DWORD dwData2)
|
||
{
|
||
LONG cServerhConvs,cClienthConvs;
|
||
int i;
|
||
HANDLE hmem;
|
||
HCONV FAR *pServerhConvs;
|
||
HCONV hC;
|
||
HCONVLIST hConvList=0;
|
||
DWORD dwid;
|
||
LONG lflags;
|
||
|
||
|
||
dwid=GETCURRENTTHREADID();
|
||
cServerhConvs=(INT)GetThreadLong(dwid,OFFSET_CSERVERCONVS);
|
||
|
||
switch (wType) {
|
||
case XTYP_CONNECT_CONFIRM:
|
||
|
||
hmem=(HANDLE)GetThreadLong(dwid,OFFSET_HSERVERCONVS);
|
||
pServerhConvs=(HCONV FAR *)GlobalLock(hmem);
|
||
|
||
pServerhConvs[cServerhConvs] = hConv;
|
||
cServerhConvs++;
|
||
SetThreadLong(dwid,OFFSET_CSERVERCONVS,cServerhConvs);
|
||
UpdateCount(hwndMain,OFFSET_SERVER_CONNECT,PNT);
|
||
if (cServerhConvs >= MAX_SERVER_HCONVS) {
|
||
LOGDDEMLERROR("DdeStrs.Exe -- ERR-Number of connections > MAX\r\n");
|
||
cServerhConvs--;
|
||
SetThreadLong(dwid,OFFSET_CSERVERCONVS,cServerhConvs);
|
||
UpdateCount(hwndMain,OFFSET_SERVER_CONNECT,PNT);
|
||
}
|
||
GlobalUnlock(hmem);
|
||
break;
|
||
|
||
case XTYP_DISCONNECT:
|
||
|
||
if(fServer)
|
||
{
|
||
|
||
hmem=(HANDLE)GetThreadLong(dwid,OFFSET_HSERVERCONVS);
|
||
pServerhConvs=(HCONV FAR *)GlobalLock(hmem);
|
||
|
||
for (i = 0; i < cServerhConvs; i++)
|
||
{
|
||
|
||
if (pServerhConvs[i] == hConv)
|
||
{
|
||
cServerhConvs--;
|
||
SetThreadLong(dwid,OFFSET_CSERVERCONVS,cServerhConvs);
|
||
UpdateCount(hwndMain,OFFSET_SERVER_CONNECT,PNT);
|
||
|
||
for (; i < cServerhConvs; i++)
|
||
{
|
||
pServerhConvs[i] = pServerhConvs[i+1];
|
||
} // for
|
||
|
||
break;
|
||
|
||
} // if pServerhConvs
|
||
|
||
} // for i
|
||
|
||
GlobalUnlock(hmem);
|
||
|
||
} // fServer
|
||
|
||
// If the server is shutting down the conversation then we need
|
||
// to change our client connection count. Remember that the
|
||
// current conversation is valid until we return from this callback
|
||
// so don't count the current conversation.
|
||
|
||
if(fClient)
|
||
{
|
||
|
||
// *** Count Client Connections ****
|
||
|
||
cClienthConvs = 0;
|
||
hConvList=GetThreadLong(dwid,OFFSET_HCONVLIST);
|
||
|
||
if (hConvList)
|
||
{
|
||
hC = 0;
|
||
while (hC = DdeQueryNextServer(hConvList, hC))
|
||
{
|
||
if (hC!=hConv) cClienthConvs++;
|
||
} // while
|
||
|
||
} // if hConvList
|
||
|
||
SetThreadLong(dwid,OFFSET_CCLIENTCONVS,cClienthConvs);
|
||
|
||
} // if fClient
|
||
|
||
InvalidateRect(hwndMain, NULL, TRUE);
|
||
|
||
break;
|
||
|
||
case XTYP_REGISTER:
|
||
case XTYP_UNREGISTER:
|
||
lflags=GetWindowLong(hwndMain,OFFSET_FLAGS);
|
||
if(fClient && (FLAG_STOP!=(lflags&FLAG_STOP)))
|
||
{
|
||
ReconnectList();
|
||
}
|
||
break;
|
||
}
|
||
|
||
return(0);
|
||
}
|
||
|
||
BOOL Balance( INT itype ) {
|
||
|
||
if(itype==OFFSET_SERVER) {
|
||
UpdateCount(hwndMain,OFFSET_SERVER,INC);
|
||
}
|
||
else {
|
||
UpdateCount(hwndMain,OFFSET_CLIENT,INC);
|
||
}
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|