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>