196 lines
4.6 KiB
C
196 lines
4.6 KiB
C
/***************************************************************************/
|
|
/** Microsoft Windows **/
|
|
/** Copyright(c) Microsoft Corp., 1991,1992 **/
|
|
/***************************************************************************/
|
|
// ts=4
|
|
|
|
// DDE.C - ClipBook viewer DDEML callback function
|
|
// 4-92 clausgi created
|
|
|
|
|
|
#include "windows.h"
|
|
#include "clipbook.h"
|
|
#include "common.h"
|
|
|
|
// internal forwards
|
|
|
|
static HWND GetConvHwnd ( HCONV hConv );
|
|
|
|
// ddeml callback routine
|
|
|
|
HDDEDATA EXPENTRY DdeCallback(
|
|
WORD wType,
|
|
WORD wFmt,
|
|
HCONV hConv,
|
|
HSZ hszTopic,
|
|
HSZ hszItem,
|
|
HDDEDATA hData,
|
|
DWORD lData1,
|
|
DWORD lData2)
|
|
{
|
|
HWND hwndTmp;
|
|
CONVINFO ConvInfo;
|
|
PDATAREQ pDataReq;
|
|
|
|
switch (wType)
|
|
{
|
|
case XTYP_ADVDATA:
|
|
if ( hwndTmp = GetConvHwnd ( hConv ) )
|
|
{
|
|
InitListBox ( hwndTmp, hData );
|
|
}
|
|
return FALSE;
|
|
break;
|
|
|
|
case XTYP_DISCONNECT:
|
|
ConvInfo.cb = sizeof(CONVINFO);
|
|
if ( DdeQueryConvInfo ( hConv, (DWORD)QID_SYNC, &ConvInfo ) == 0 )
|
|
{
|
|
PERROR(TEXT("DdeQueryConvInfo for %lx failed: %x\n\r"),
|
|
(DWORD)hConv, DdeGetLastError(idInst));
|
|
break;
|
|
}
|
|
if ( pDataReq = (PDATAREQ)ConvInfo.hUser )
|
|
{
|
|
PINFO(TEXT("Freeing data req on %lx at disconnect time\n\r"), hConv );
|
|
ProcessDataReq ( 0, pDataReq );
|
|
DeleteDataReq ( pDataReq );
|
|
DdeSetUserHandle ( hConv, (DWORD)QID_SYNC, 0L );
|
|
}
|
|
else
|
|
{
|
|
PINFO(TEXT("Disconnect received on %lx - no datareq\n\r"), hConv );
|
|
}
|
|
break;
|
|
|
|
case XTYP_XACT_COMPLETE:
|
|
ConvInfo.cb = sizeof(CONVINFO);
|
|
if ( DdeQueryConvInfo ( hConv, (DWORD)QID_SYNC, &ConvInfo ) == 0 )
|
|
{
|
|
PERROR(TEXT("DdeQueryConvInfo for %lx failed: %x\n\r"),
|
|
(DWORD)hConv, DdeGetLastError(idInst));
|
|
break;
|
|
}
|
|
|
|
PINFO(TEXT("dde callback: got %lx data from conv handle %lx\n\r"),
|
|
ConvInfo.hUser, (DWORD)hConv );
|
|
|
|
pDataReq = (PDATAREQ)ConvInfo.hUser;
|
|
|
|
ProcessDataReq ( hData, pDataReq );
|
|
DeleteDataReq ( pDataReq );
|
|
if ( pDataReq->fDisconnect )
|
|
{
|
|
DdeDisconnect ( hConv );
|
|
}
|
|
DdeSetUserHandle ( hConv, (DWORD)QID_SYNC, 0L );
|
|
break;
|
|
|
|
case XTYP_REGISTER:
|
|
case XTYP_UNREGISTER:
|
|
case XTYP_ADVREQ:
|
|
case XTYP_REQUEST:
|
|
case XTYP_ADVSTART:
|
|
case XTYP_CONNECT_CONFIRM:
|
|
case XTYP_CONNECT:
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// this function retrieves the window handle associated with
|
|
// a conversation handle - the hande is put there by
|
|
// using DdeSetUserHandle at DdeConnect time
|
|
|
|
static HWND GetConvHwnd ( HCONV hConv )
|
|
{
|
|
CONVINFO ConvInfo;
|
|
PDATAREQ pDataReq;
|
|
|
|
ConvInfo.cb = sizeof(CONVINFO);
|
|
if ( DdeQueryConvInfo ( hConv, (DWORD)QID_SYNC, &ConvInfo ) == 0 )
|
|
{
|
|
PERROR(TEXT("DdeQueryConvInfo for %lx failed: %x\n\r"),
|
|
(DWORD)hConv, DdeGetLastError(idInst));
|
|
}
|
|
|
|
pDataReq = (PDATAREQ)ConvInfo.hUser;
|
|
|
|
PINFO(TEXT("GetConvHwnd: got %p as conv handle\r\n"), pDataReq);
|
|
|
|
if ( !IsWindow ( pDataReq->hwndMDI ) )
|
|
{
|
|
PERROR(TEXT("Invalid window %lx in conv Uhandle: %lx!\n\r"),
|
|
(DWORD)pDataReq->hwndMDI, (DWORD)hConv );
|
|
return NULL;
|
|
}
|
|
return pDataReq->hwndMDI;
|
|
}
|
|
|
|
//
|
|
// Purpose: Get the version of Clipsrv connected to the given MDI
|
|
// child.
|
|
//
|
|
// Parameters:
|
|
// hwndChild - The child window.
|
|
//
|
|
// Returns:
|
|
// A version number with the Clipsrv OS version in the hiword, and
|
|
// the Clipsrv version in the loword.
|
|
//
|
|
// Hiword values:
|
|
// 0 - Win 3.x
|
|
// 1 - NT 1.x
|
|
//
|
|
// Loword values:
|
|
// 0 - WFW 1.0 Clipsrv
|
|
// 1 - NT 1.0 Clipsrv, adds [version] and [security] executes
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
DWORD GetClipsrvVersion(
|
|
HWND hwndChild)
|
|
{
|
|
MDIINFO *pMDI;
|
|
HDDEDATA hdde;
|
|
DWORD dwRet;
|
|
char *lpszDDE;
|
|
|
|
dwRet = 0;
|
|
pMDI = GETMDIINFO(hwndChild);
|
|
|
|
if (pMDI && !(pMDI->flags & F_CLPBRD))
|
|
{
|
|
hdde = MySyncXact(SZCMD_VERSION, lstrlen(SZCMD_VERSION) + 1,
|
|
pMDI->hExeConv, 0L, CF_TEXT, XTYP_EXECUTE,
|
|
SHORT_SYNC_TIMEOUT, NULL);
|
|
|
|
if (hdde)
|
|
{
|
|
lpszDDE = (char *)DdeAccessData(hdde, &dwRet);
|
|
|
|
if (lpszDDE)
|
|
{
|
|
dwRet = MAKELONG(lpszDDE[0] - '0', lpszDDE[2] - '0');
|
|
}
|
|
else
|
|
{
|
|
dwRet = 0L;
|
|
}
|
|
|
|
DdeUnaccessData(hdde);
|
|
DdeFreeDataHandle(hdde);
|
|
}
|
|
else
|
|
{
|
|
PINFO(TEXT("Clipsrv didn't like version execute\r\n"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PERROR(TEXT("No Clipsrv for clipboard!\r\n"));
|
|
}
|
|
|
|
return dwRet;
|
|
}
|