1

COM Server があり、それをサービスとして使用したいと考えています。私のアプリケーションには、ローカル システムでユーザー (CN_Service) を作成し、以下のコマンドを使用してこの COM サーバーをサービスとしてインストールするインストーラー コンポーネントがあります。

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

このインストール済みサービスの開始を担当する別のコンポーネントがあります。winmain() で、以下のコードを使用して COM サーバー クラス オブジェクトを登録しています (SUSPENDED モードで)。オブジェクトが正常に登録され、HRESULT が S_OK として返されますが、これは予想どおりです。

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;
}

しかし、::CoResumeClassObjects() を使用して登録済みのクラス オブジェクトを再開しようとすると、HRESULT 値で「クラス オブジェクトを再開できませんでした」というエラーがスローされます。

800706c6 (配列境界が無効です)

以下のコードを使用して、クラス オブジェクトを再開しています。

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;
}

問題の説明:重要なことは、メソッド ::CoResumeClassObjects()が失敗する Windows Server 2012 R2 マシンでこのコードを実行したいということです。 この同じコードは、Windows Server 2008 マシンで正常に動作します。

server2012 ボックスが ::CoResumeClassObjects() メソッドと関係があるかどうかを教えてください。

また、exeをコード内のサービスとして登録し、サービスの開始/停止を担当する別のローカルユーザー(アプリの要件)を作成しています。win server 2012で問題になることはありますか?

助けていただければ幸いです…</p>

4

0 に答える 0