285 lines
7.1 KiB
C++
285 lines
7.1 KiB
C++
|
/**************************************************************************************************
|
|||
|
|
|||
|
FILENAME: DataIoClient.cpp
|
|||
|
|
|||
|
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
#define INC_OLE2
|
|||
|
|
|||
|
#include "stdafx.h"
|
|||
|
|
|||
|
#ifndef SNAPIN
|
|||
|
#include <windows.h>
|
|||
|
#endif
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
#include "DataIo.h"
|
|||
|
#include "DataIoCl.h"
|
|||
|
#include "Message.h"
|
|||
|
#include "ErrMacro.h"
|
|||
|
|
|||
|
MULTI_QI mq;
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
|
|||
|
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
|
|||
|
|
|||
|
ROUTINE DESCRIPTION:
|
|||
|
This module inititalizes the DCOM DataIo Client communications.
|
|||
|
|
|||
|
INPUT:
|
|||
|
None.
|
|||
|
|
|||
|
RETURN:
|
|||
|
TRUE - Success.
|
|||
|
FALSE - Failure to initilize.
|
|||
|
*/
|
|||
|
|
|||
|
BOOL
|
|||
|
InitializeDataIoClient(
|
|||
|
IN REFCLSID rclsid,
|
|||
|
IN PTCHAR pMachine,
|
|||
|
IN OUT LPDATAOBJECT* ppstm
|
|||
|
)
|
|||
|
{
|
|||
|
// Check if we already have a pointer to this DCOM server.
|
|||
|
if(*ppstm != NULL) {
|
|||
|
Message(TEXT("InitializeDataIoClient - called with non-NULL pointer"), -1, NULL);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
HRESULT hr;
|
|||
|
// TCHAR wsz [200];
|
|||
|
COSERVERINFO sServerInfo;
|
|||
|
|
|||
|
ZeroMemory(&sServerInfo, sizeof(sServerInfo));
|
|||
|
/*
|
|||
|
if(pMachine != NULL) {
|
|||
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pMachine, -1, wsz, 200);
|
|||
|
sServerInfo.pwszName = wsz;
|
|||
|
}
|
|||
|
*/
|
|||
|
// Initialize the Multi QueryInterface structure.
|
|||
|
mq.pIID = &IID_IDataObject;
|
|||
|
mq.pItf = NULL;
|
|||
|
mq.hr = S_OK;
|
|||
|
|
|||
|
// Create a remote instance of the object on the argv[1] machine
|
|||
|
hr = CoCreateInstanceEx(rclsid,
|
|||
|
NULL,
|
|||
|
CLSCTX_SERVER,
|
|||
|
&sServerInfo,
|
|||
|
1,
|
|||
|
&mq);
|
|||
|
|
|||
|
// Message(TEXT("InitializeDataIoClient - CoCreateInstanceEx"), hr, NULL);
|
|||
|
|
|||
|
// Check for failure.
|
|||
|
if (FAILED(hr)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// Return the pointer to the server.
|
|||
|
*ppstm = (IDataObject*)mq.pItf;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
/**************************************************************************************************
|
|||
|
|
|||
|
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
|
|||
|
|
|||
|
ROUTINE DESCRIPTION:
|
|||
|
|
|||
|
|
|||
|
INPUT:
|
|||
|
|
|||
|
|
|||
|
RETURN:
|
|||
|
TRUE - Success.
|
|||
|
FALSE - Failure.
|
|||
|
|
|||
|
typedef struct {
|
|||
|
WORD dwID; // ESI data structre ID always = 0x4553 'ES'
|
|||
|
WORD dwType; // Type of data structure
|
|||
|
WORD dwVersion; // Version number
|
|||
|
WORD dwCompatibilty;// Compatibilty number
|
|||
|
ULONG ulDataSize; // Data size
|
|||
|
WPARAM wparam; // LOWORD(wparam) = Command
|
|||
|
TCHAR cData; // Void pointer to the data - NULL = no data
|
|||
|
} DATA_IO, *PDATA_IO;
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
BOOL
|
|||
|
DataIoClientSetData(
|
|||
|
IN WPARAM wparam,
|
|||
|
IN PTCHAR pData,
|
|||
|
IN DWORD dwDataSize,
|
|||
|
IN LPDATAOBJECT pstm
|
|||
|
)
|
|||
|
{
|
|||
|
// Check for DCOM pointer to the server.
|
|||
|
if(pstm == NULL) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
HRESULT hr;
|
|||
|
HANDLE hData;
|
|||
|
DATA_IO* pDataIo;
|
|||
|
|
|||
|
// Allocate and lock enough memory for the ESI data structure and the data being sent.
|
|||
|
hData = GlobalAlloc(GHND,dwDataSize + sizeof(DATA_IO));
|
|||
|
EF_ASSERT(hData);
|
|||
|
pDataIo = (DATA_IO*)GlobalLock(hData);
|
|||
|
EF_ASSERT(pDataIo);
|
|||
|
|
|||
|
// Fill in the ESI data structure.
|
|||
|
pDataIo->dwID = ESI_DATA_STRUCTURE; // ESI data structre ID always = 0x4553 'ES'
|
|||
|
pDataIo->dwType = FR_COMMAND_BUFFER; // Type of data structure
|
|||
|
pDataIo->dwVersion = FR_COMMAND_BUFFER_ONE; // Version number
|
|||
|
pDataIo->dwCompatibilty = FR_COMMAND_BUFFER_ONE; // Compatibilty number
|
|||
|
pDataIo->ulDataSize = dwDataSize; // Data size
|
|||
|
pDataIo->wparam = wparam; // LOWORD(wparam) = Command
|
|||
|
|
|||
|
// Copy the memory into the buffer, unlock it and
|
|||
|
// put the handle into the STGMEDIUM data structure.
|
|||
|
CopyMemory((PTCHAR)&pDataIo->cData, pData, dwDataSize);
|
|||
|
GlobalUnlock(hData);
|
|||
|
|
|||
|
FORMATETC formatetc;
|
|||
|
STGMEDIUM medium;
|
|||
|
|
|||
|
// Set up FORMATETC with CF_TEXT and global memory.
|
|||
|
formatetc.cfFormat = CF_TEXT;
|
|||
|
formatetc.ptd = NULL;
|
|||
|
formatetc.dwAspect = DVASPECT_CONTENT;
|
|||
|
formatetc.lindex = -1;
|
|||
|
formatetc.tymed = TYMED_HGLOBAL;
|
|||
|
|
|||
|
// Set up STGMEDIUM with global memory and NULL for pUnkForRelease.
|
|||
|
// SetData msut then be responsible for freeing the memory.
|
|||
|
medium.tymed = TYMED_HGLOBAL;
|
|||
|
medium.pUnkForRelease = NULL;
|
|||
|
medium.hGlobal = hData;
|
|||
|
|
|||
|
// Send it all to SetData, telling it that it is responsible for freeing the memory.
|
|||
|
hr = pstm->SetData(&formatetc, &medium, TRUE);
|
|||
|
|
|||
|
// Message(TEXT("DataIoClientSetData - IDataObject::SetData"), hr, NULL);
|
|||
|
|
|||
|
// Check for failure.
|
|||
|
if (FAILED(hr)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
/*****************************************************************************************************************
|
|||
|
|
|||
|
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
|
|||
|
|
|||
|
ROUTINE DESCRIPTION:
|
|||
|
|
|||
|
GLOBALS:
|
|||
|
FORMATETC - has been initialized in InitializeDataIoClient.
|
|||
|
|
|||
|
INPUT:
|
|||
|
None.
|
|||
|
|
|||
|
RETURN:
|
|||
|
HGLOBAL - handle to the memory containing the data.
|
|||
|
HGLOBAL - NULL = failure.
|
|||
|
*/
|
|||
|
|
|||
|
HGLOBAL
|
|||
|
DataIoClientGetData(
|
|||
|
IN LPDATAOBJECT pstm
|
|||
|
)
|
|||
|
{
|
|||
|
// Check for DCOM pointer to the server.
|
|||
|
if(pstm == NULL) {
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
FORMATETC formatetc;
|
|||
|
STGMEDIUM medium;
|
|||
|
HRESULT hr;
|
|||
|
|
|||
|
// Zero the STGMEDIUM structure.
|
|||
|
ZeroMemory((void*)&medium, sizeof(STGMEDIUM));
|
|||
|
|
|||
|
// Set up FORMATETC with CF_TEXT and global memory.
|
|||
|
formatetc.cfFormat = CF_TEXT;
|
|||
|
formatetc.ptd = NULL;
|
|||
|
formatetc.dwAspect = DVASPECT_CONTENT;
|
|||
|
formatetc.lindex = -1;
|
|||
|
formatetc.tymed = TYMED_HGLOBAL;
|
|||
|
|
|||
|
// Get the data from the object.
|
|||
|
hr = pstm->GetData(&formatetc, &medium);
|
|||
|
|
|||
|
// Message(TEXT("DataIoClientGetData - IDataObject::GetData"), hr, NULL);
|
|||
|
|
|||
|
// Check for failure.
|
|||
|
if (FAILED(hr)) {
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
DWORD dwSize;
|
|||
|
HGLOBAL hDataIn;
|
|||
|
PTCHAR pDataSource;
|
|||
|
PTCHAR pDataIn;
|
|||
|
|
|||
|
// Allocate and lock enough memory for the data we received.
|
|||
|
dwSize = (DWORD)GlobalSize(medium.hGlobal);
|
|||
|
hDataIn = GlobalAlloc(GHND, dwSize);
|
|||
|
EF_ASSERT(hDataIn);
|
|||
|
pDataIn = (PTCHAR)GlobalLock(hDataIn);
|
|||
|
EF_ASSERT(hDataIn);
|
|||
|
|
|||
|
// Get a pointer and lock the source data.
|
|||
|
pDataSource = (PTCHAR)GlobalLock(medium.hGlobal);
|
|||
|
|
|||
|
// Copy the memory into the local buffer.
|
|||
|
CopyMemory(pDataIn, pDataSource, dwSize);
|
|||
|
|
|||
|
// Unlock the memory.
|
|||
|
GlobalUnlock(hDataIn);
|
|||
|
GlobalUnlock(medium.hGlobal);
|
|||
|
|
|||
|
// Free the source memory.
|
|||
|
ReleaseStgMedium(&medium);
|
|||
|
|
|||
|
// Return the handle to the memory.
|
|||
|
return hDataIn;
|
|||
|
}
|
|||
|
/*****************************************************************************************************************
|
|||
|
|
|||
|
COPYRIGHT<EFBFBD> 2001 Microsoft Corporation and Executive Software International, Inc.
|
|||
|
|
|||
|
ROUTINE DESCRIPTION:
|
|||
|
Exit routine for DataIo
|
|||
|
|
|||
|
GLOBAL VARIABLES:
|
|||
|
|
|||
|
INPUT:
|
|||
|
None;
|
|||
|
|
|||
|
RETURN:
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
BOOL
|
|||
|
ExitDataIoClient(
|
|||
|
IN LPDATAOBJECT* ppstm
|
|||
|
)
|
|||
|
{
|
|||
|
// Release the object.
|
|||
|
if(*ppstm != NULL) {
|
|||
|
|
|||
|
LPDATAOBJECT pstm = *ppstm;
|
|||
|
|
|||
|
pstm->Release();
|
|||
|
*ppstm = NULL;
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|