windows-nt/Source/XPSP1/NT/base/fs/utils/dfrg/dataiocl.cpp
2020-09-26 16:20:57 +08:00

285 lines
7.1 KiB
C++

/**************************************************************************************************
FILENAME: DataIoClient.cpp
COPYRIGHT© 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© 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© 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© 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© 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;
}