Click here to Skip to main content
15,897,094 members
Articles / Desktop Programming / WTL

Passing C++ classes across DCOM

Rate me:
Please Sign up or sign in to vote.
4.64/5 (10 votes)
15 Nov 20012 min read 214.6K   2.5K   42  
Two classes that provide richer interfaces and easier semantics to pass classes via COM/DCOM
#include <comdef.h>
#pragma once

/////////////////////////////////////////////////////////////////////////////
// CSafeArray class

typedef const SAFEARRAY* LPCSAFEARRAY;
typedef const VARIANT* LPCVARIANT;

class CComSafeArray : public tagVARIANT
{
//Constructors
public:
	CComSafeArray();
	CComSafeArray(const SAFEARRAY& saSrc, VARTYPE vtSrc);
	CComSafeArray(LPCSAFEARRAY pSrc, VARTYPE vtSrc);
	CComSafeArray(const CComSafeArray& saSrc);
	CComSafeArray(const VARIANT& varSrc);
	CComSafeArray(LPCVARIANT pSrc);
//	CComSafeArray(const _variant_t& varSrc);

// Operations
public:
	void Clear();
	void Attach(VARIANT& varSrc);
	VARIANT Detach();

	CComSafeArray& operator=(const CComSafeArray& saSrc);
	CComSafeArray& operator=(const VARIANT& varSrc);
	CComSafeArray& operator=(LPCVARIANT pSrc);
	CComSafeArray& operator=(const _variant_t& varSrc);

	BOOL operator==(const SAFEARRAY& saSrc) const;
	BOOL operator==(LPCSAFEARRAY pSrc) const;
	BOOL operator==(const CComSafeArray& saSrc) const;
	BOOL operator==(const VARIANT& varSrc) const;
	BOOL operator==(LPCVARIANT pSrc) const;
	BOOL operator==(const _variant_t& varSrc) const;

	operator LPVARIANT();
	operator LPCVARIANT() const;

	// One dim array helpers
	void CreateOneDim(VARTYPE vtSrc, DWORD dwElements,
		const void* pvSrcData = NULL, long nLBound = 0);
	DWORD GetOneDimSize();
	void ResizeOneDim(DWORD dwElements);

	// Multi dim array helpers
	void Create(VARTYPE vtSrc, DWORD dwDims, DWORD* rgElements);

	// SafeArray wrapper classes
	void Create(VARTYPE vtSrc, DWORD dwDims, SAFEARRAYBOUND* rgsabounds);
	void AccessData(void** ppvData);
	void UnaccessData();
	void AllocData();
	void AllocDescriptor(DWORD dwDims);
	void Copy(LPSAFEARRAY* ppsa);
	void GetLBound(DWORD dwDim, long* pLBound);
	void GetUBound(DWORD dwDim, long* pUBound);
	void GetElement(long* rgIndices, void* pvData);
	void PtrOfIndex(long* rgIndices, void** ppvData);
	void PutElement(long lIndex, void* pvData);
	void PutElement(long* rgIndices, void* pvData);
	void Redim(SAFEARRAYBOUND* psaboundNew);
	void Lock();
	void Unlock();
	DWORD GetDim();
	DWORD GetElemSize();
	void Destroy();
	void DestroyData();
	void DestroyDescriptor();

//Implementation
public:
	DWORD GetSize(DWORD nDim);
	~CComSafeArray();

	// Cache info to make element access (operator []) faster
	DWORD m_dwElementSize;
	DWORD m_dwDims;

private:

};

/////////////////////////////////////////////////////////////////////////////
// Helper for initializing CComSafeArray
void ATLSafeArrayInit(CComSafeArray* psa);

BOOL ATLCompareSafeArrays(SAFEARRAY* parray1, SAFEARRAY* parray2);

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior)
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions