#define INC_OLE2
#include <stdio.h>
#include <windows.h>
#include <initguid.h>
#include <tchar.h>
void Message(LPTSTR szPrefix, HRESULT hr) {
	LPTSTR   szMessage;
if (hr == S_OK) {
	_fputts(szPrefix, stdout);
	return;
	}
if (HRESULT_FACILITY(hr) == FACILITY_WINDOWS)
	hr = HRESULT_CODE(hr);
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
		NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR)&szMessage, 0, NULL);
_tprintf(TEXT("%s: %s(%lx)\n"), szPrefix, szMessage, hr);
LocalFree(szMessage);
}
void main(int argc, char *argv[], char *envp[]) {
	WCHAR awcProgId[]=L"SequentialStream.Application";
	WCHAR SendMessage1[]=L"First message from client\n";
	WCHAR SendMessage2[]=L"Message two from client\n";
	WCHAR ReceiveMessage[80];
	ISequentialStream *pObj = NULL;
	ULONG cbWritten;
	CLSID clsid;
	HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)) {
	Message(TEXT("CoInitializeEx\n"), hr);
	exit(hr);
	}
hr = CLSIDFromProgID(awcProgId, &clsid);
Message(TEXT("Creating Instance...\n"), S_OK);
hr = CoCreateInstance(clsid, NULL, CLSCTX_SERVER,
					  IID_ISequentialStream, (LPVOID *)&pObj);
if (FAILED(hr)) {
	Message(TEXT("CoCreateInstance\n"), hr);
	CoUninitialize();
	return;
	}
hr = pObj->Write(SendMessage1, (wcslen(SendMessage1)+1)<<1, &cbWritten);
if (FAILED(hr))
	Message(TEXT("Write\n"), hr);
hr = pObj->Write(SendMessage2, (wcslen(SendMessage2)+1)<<1, &cbWritten);
if (FAILED(hr))
	Message(TEXT("Write\n"), hr);
hr = pObj->Read(ReceiveMessage, sizeof(ReceiveMessage), &cbWritten);
if (FAILED(hr))
	Message(TEXT("Read\n"), hr);
else
	_putws(ReceiveMessage);
pObj->Release();
CoUninitialize();
Message(TEXT("Done\n"), S_OK);
MessageBox(NULL, TEXT("Done"), TEXT("Sequential Stream Client"),
		   MB_OK|MB_ICONINFORMATION);
}