SOL9 2.0 Class: WbemObjectStubSink

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * WbemObjectStubSink.h 
 * Copyright (c) 2012 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */



#pragma once

#define _WIN32_DCOM

#include <sol\Object.h>
#include <wbemidl.h>

namespace SOL {
/**
 * Simple wrapper class to create a stubSink object of IWbemObjectSink
 * from a sink object of IWbemObjectSink, by using IUnsecuredApartment interface.
 */
class WbemObjectStubSink :public Object {

private:
    IWbemObjectSink* pSink;

private:
    // Use an unsecured apartment for security
    IUnsecuredApartment* apartment;
private:
    IUnknown* stubUnknown;

private:
    IWbemObjectSink* stubSink;

public:
    /**
     * Constructor
     */
    WbemObjectStubSink(IWbemObjectSink* pSink)
        :apartment(NULL),
        stubUnknown(NULL),
        stubSink(NULL)
    {
        HRESULT hr;
        if (FAILED(hr = CoCreateInstance(CLSID_UnsecuredApartment, NULL, 
            CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, 
            (void**)&apartment))) {
            throw Exception(E_FAIL, "%s: %s", "E_FAIL",__FUNCTION__);
        }
        if (FAILED(hr = apartment->CreateObjectStub(pSink, &stubUnknown))) {
            apartment->Release();
            apartment = NULL;
            throw Exception(E_FAIL, "%s: %s", "E_FAIL",__FUNCTION__);
        }
        if (FAILED(hr = stubUnknown->QueryInterface(IID_IWbemObjectSink,
            (void **)&stubSink))) {
            apartment->Release();
            apartment = NULL;
            stubUnknown->Release();
            stubUnknown = NULL;

            throw Exception(E_FAIL, "%s: %s", "E_FAIL",__FUNCTION__);
        }
    }

public:
    /**
     * Destructor
     */
    ~WbemObjectStubSink()
    {
        if (apartment) {
            apartment->Release();
            apartment = NULL;
        }
        
        if (stubUnknown) {
            stubUnknown->Release();
            stubUnknown = NULL;
        }
        if (stubSink) {
            stubSink->Release();
            stubSink = NULL;
        }
    }

public:
    IWbemObjectSink* getStubSink() {
        return stubSink;
    }
};

}

Last modified: 1 Apr 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.