#include "stdafx.h"
#import "Server.tlb" 
class COMHelper

{
public:
COMHelper()
{ ::CoInitialize(NULL);}
~COMHelper()
{ ::CoUninitialize();} 
HRESULT FindRunningInstance(LPOLESTR lpszItem, IUnknown** ppUnk)

{
HRESULT hr = S_OK;
IMonikerPtr pMoniker; 
hr = CreateItemMoniker(_T("!"), lpszItem, &pMoniker);
if(!SUCCEEDED(hr))
return hr; 
IRunningObjectTablePtr pROT;
GetRunningObjectTable(0, &pROT);
hr = pROT->GetObjectW(pMoniker, ppUnk);
return hr;
}
}; 
int _tmain(int argc, _TCHAR* argv[])

{
COMHelper comSystem; 
IUnknownPtr pUnk;
HRESULT hr = S_OK;
//look up the ROT table directly
hr = comSystem.FindRunningInstance(_T("{58C142C7-E599-4921-BF29-33DC0FCCBECA}"), &pUnk);
//alternative approach find running object in OLE way
//hr = ::GetActiveObject(__uuidof(Server::ProviderImp), NULL, &pUnk); 
//if no running instance found start a new one.
if(!SUCCEEDED(hr))

{
hr = CoCreateInstance(__uuidof(Server::ProviderImp), NULL, CLSCTX_LOCAL_SERVER,
__uuidof(Server::IProvider), (LPVOID*)&pUnk);
if(!SUCCEEDED(hr))
throw 0;
} 
//convert IUnknown to IProvider
Server::IProviderPtr pProvider;
hr = pUnk->QueryInterface(__uuidof(Server::IProvider), (LPVOID*)&pProvider);
if(!SUCCEEDED(hr))
throw 0; 
//call IProvider
pProvider->Test();
return 0;
}
