Akshay Jangir
Akshay Jangir

Reputation: 96

::CoResumeClassObect() fails on Windows Server 2012 R2 with HRESULT : 0x800706c6(The array bounds are invalid)

I have a COM Server , and I want to use it as a service. My application has a installer component which creates a user (CN_Service) in local system and install this COM server as a service using below command:

Connect.exe /service /noreinstall /user:CN_Service /password:somePassword /depends:lanmanworkstation

I have another component, which is responsible for starting this installed service. In its winmain(), I am using below code to register the COM server class objects (in SUSPENDED mode), it successfully registers the objects and returns HRESULT as S_OK which is as expected.

int CAppModule::WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /* lpCmdLine */, int nShowCmd)
{
    ::AfxSetResourceHandle(hInstance);
    _strServiceName.LoadString(IDS_SRVL_SERVICENAME);
    _strDisplayName.LoadString(IDS_SRVL_DISPLAYNAME);

    VERIFY(gNTEventLog.SetSource(_strDisplayName));

    // Copy parameters
    m_hInstance = hInstance;
    m_nCmdShow  = nShowCmd;
    _strCmdLine = ::GetCommandLine();

    _qappmodel->InitCOMSupport();   //::CoInitializeEx(NULL, COINIT_MULTITHREADED);

    // Process command line options
    bool bContinue = true;

    int nExitCode = 0;
    if (ProcessCommandLine(_strCmdLine, &bContinue) && bContinue)
    {
        if (_patlmodule != NULL)
        {
        //_patlmodule is an interface pointer and private member of CAppModule 
            HRESULT hr = _patlmodule->RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
            if (FAILED(hr))
            {
                ASSERT_NOT_REACHED();
                gNTEventLog.LogHR(_T("Failed to register the class objects"), hr);
                return 2;
            }
        }

        nExitCode = InternalWinMain();

        if (_patlmodule != NULL)
        {
            _patlmodule->RevokeClassObjects();
        }
    }

    _qappmodel->UninitCOMSupport();

    // When we get here, the service has been stopped
    return nExitCode;
}

But when I try to resume the registered class objects using ::CoResumeClassObjects(), it throws an error ‘Failed to resume class objects’ with HRESULT value:

800706c6 (The array bounds are invalid)

I am using below code to resume the class objects:

BOOL CAppModule::InitInstance()
{   
    // Increment usage count
    if (_patlmodule != NULL)
    {
        _patlmodule->Lock();
        HRESULT hr = ::CoResumeClassObjects();  //Fails here
        if (FAILED(hr))
        {
            ASSERT_NOT_REACHED();
            if (hr == CO_E_WRONG_SERVER_IDENTITY)
            {
                gNTEventLog.LogHR(_T("Failed to resume class objects (registered as a service?)"), hr);
            }
            else
            {

                gNTEventLog.LogHR(_T("Failed to resume class objects"), hr);
            }
            return FALSE;
        }

    }

    return TRUE;
}

Problem Statement: The important thing is that, I want to run this code on Windows Server 2012 R2 machine, where the method ::CoResumeClassObjects() fails. This same piece of code runs fine on Windows Server 2008 machine.

Please suggest me whether server2012 box has anything to do with ::CoResumeClassObjects() method.

Also I am creating a separate local user(which is an app requirement) for registering the exe as service in code and responsible for starting/stopping service. Can It be a problem on win server 2012 ?

Any help would be appreciated…

Upvotes: 1

Views: 644

Answers (0)

Related Questions