#ifndef __COGETSERVERPID_H__
#define __COGETSERVERPID_H__
#include <atlbase.h>
HRESULT CoGetServerPID(IUnknown* punk, DWORD* pdwPID)
{
HRESULT hr;
if(pdwPID == NULL) return E_POINTER;
if(punk == NULL) return E_INVALIDARG;
typedef struct tagOBJREFHDR
{
DWORD signature;
BYTE padding[48];
USHORT pid;
} OBJREFHDR;
CComPtr<IUnknown> spProxyManager;
hr = punk->QueryInterface(IID_IProxyManager, (void**)&spProxyManager);
if(FAILED(hr))
{
return hr;
}
CComPtr<IStream> spMarshalStream;
hr = ::CreateStreamOnHGlobal(NULL, TRUE, &spMarshalStream);
if(FAILED(hr)) return hr;
hr = ::CoMarshalInterface(spMarshalStream, IID_IUnknown, punk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
if(FAILED(hr)) return hr;
HGLOBAL hg = NULL;
hr = ::GetHGlobalFromStream(spMarshalStream, &hg);
if(SUCCEEDED(hr))
{
hr = RPC_E_INVALID_OBJREF;
OBJREFHDR *pObjRefHdr = (OBJREFHDR*)GlobalLock(hg);
if(pObjRefHdr != NULL)
{
if(pObjRefHdr->signature == 0x574f454d)
{
*pdwPID = pObjRefHdr->pid;
hr = S_OK;
}
GlobalUnlock(hg);
}
}
LARGE_INTEGER li = {0};
spMarshalStream->Seek(li, SEEK_SET, NULL);
CoReleaseMarshalData(spMarshalStream);
return hr;
}
#endif