COM+アプリケーションプール値の構成
次の手順を使用して、COM+アプリケーションのCOM+アプリケーションプール値を構成できます。
メモ
ライブラリアプリケーションには、ホストプロセスのリサイクルとプールのプロパティがあります。
コンポーネントサービス管理ツール
COM+アプリケーションのCOM+アプリケーションプールを構成するには、次の手順に従います。
コンポーネントサービス管理ツールの詳細ウィンドウで、コピーするコンポーネントを右クリックし、[コピー]をクリックします。
[プール&リサイクル]タブの[アプリケーションプール]で、実行するアプリケーションのインスタンス数に応じて、[プールサイズ]の値を入力します。
[OK]をクリックします。
Visual Basic
Visual Basicの次の関数は、選択したCOM+サーバーアプリケーションのCOM+アプリケーションプール値(ConcurrentAppsプロパティで表されます)を設定する方法を示しています。 Visual Basicから使用するには、COM+管理タイプライブラリへの参照を追加します。
Function SetMyApplicationPooling( _
strApplicationName As String, _
lngPoolValue As Long _
) As Boolean ' Return False if any errors occur.
SetMyApplicationPooling = False ' Initialize the function.
On Error GoTo My_Error_Handler ' Initialize error handling.
Dim objCatalog As COMAdmin.COMAdminCatalog
Dim objAppCollection As COMAdmin.COMAdminCatalogCollection
Dim objApplication As COMAdmin.COMAdminCatalogObject
Set objCatalog = CreateObject("COMAdmin.COMAdminCatalog")
Set objAppCollection = objCatalog.GetCollection("Applications")
objAppCollection.Populate
For Each objApplication in objAppCollection
If objApplication.Name = strApplicationName Then
objApplication.Value("ConcurrentApps") = lngPoolValue
MsgBox strApplicationName & _
" pooling value set to " & lngPoolValue
Exit For
End If
Next
objAppCollection.SaveChanges
Set objApplication = Nothing
Set objAppCollection = Nothing
Set objCatalog = Nothing
SetMyApplicationPooling = True ' Successful end to procedure
Exit Function
My_Error_Handler: ' Replace with specific error handling.
MsgBox "Error # " & Err.Number & " (Hex: " & Hex(Err.Number) _
& ")" & vbNewLine & Err.Description
Set objApplication = Nothing
Set objAppCollection = Nothing
Set objCatalog = Nothing
End Function
この関数を使用するには、COM+サーバーアプリケーション名の文字列値と、目的のアプリケーションプール設定の整数値を指定します。 次のVisual Basicコードは、"MyApplication"という名前のアプリケーションのアプリケーションプール値を15に設定する方法を示しています。
Sub Main()
If Not SetMyApplicationPooling("MyApplication", 15) Then
MsgBox "SetMyApplicationPooling failed."
End If
End Sub
C/C++
C++の次の関数は、選択したCOM+サーバーアプリケーションのCOM+アプリケーションプール値 (ConcurrentAppsプロパティで表される) を設定する方法を示しています。 ErrorDescriptionメソッドについては、エラーコードの解釈に関する記事で説明しています。
#include <windows.h>
#include <stdio.h>
#import "C:\WINDOWS\system32\Com\ComAdmin.dll"
#include "ComAdmin.h"
#include "StrSafe.h" // For the StringCchLengthW function
BOOL SetMyApplicationPooling (OLECHAR* szMyApp, LONG lPool) {
IUnknown * pUnknown = NULL;
ICOMAdminCatalog * pCatalog = NULL;
ICatalogCollection * pAppColl = NULL;
ICatalogObject * pApplication = NULL;
HRESULT hr = S_OK;
BSTR bstrMyApp = NULL;
unsigned int uMaxLen = 255; // Maximum length of szMyApp
LCID lLan = 1024;// Use the default language for comparing strings.
try {
// Test the input pool value.
if ((lPool < 1) || (lPool > 1048576)) throw(E_INVALIDARG);
// Test the input szMyApp to make sure it's OK to use.
hr = StringCchLengthW(szMyApp, uMaxLen, NULL);
if (FAILED (hr)) throw(hr);
// Convert szMyApp to a BSTR.
bstrMyApp = SysAllocString(szMyApp);
// Create a COMAdminCatalog object and get its IUnknown.
hr = CoCreateInstance(CLSID_COMAdminCatalog, NULL,
CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
if (FAILED (hr)) throw(hr);
// Get the ICOMAdminCatalog interface.
hr = pUnknown->QueryInterface(IID_ICOMAdminCatalog,
(void**)&pCatalog);
if (FAILED (hr)) throw(hr);
// Get an interface to the Applications collection.
hr = pCatalog->GetCollection(L"Applications", (IDispatch**)&pAppColl);
if (FAILED (hr)) throw(hr);
// Populate all of the Applications collection.
hr = pAppColl->Populate();
if (FAILED (hr)) throw(hr);
// Get the number of applications in the collection.
LONG lCount = -1;
hr = pAppColl->get_Count(&lCount);
if (FAILED (hr)) throw(hr);
// Iterate through each application in the collection.
VARIANT varName;
VariantInit(&varName);
for (LONG lIdx = 0; lIdx < lCount; lIdx++) {
hr = pAppColl->get_Item(lIdx, (IDispatch**)&pApplication);
if (FAILED (hr)) throw(hr);
// Get the Name value of each application.
hr = pApplication->get_Name(&varName);
if (FAILED (hr)) throw(hr);
// Compare the application name to bstrMyApp.
hr = VarBstrCmp(varName.bstrVal, bstrMyApp, lLan, NULL);
if (FAILED (hr)) throw(hr);
if (VARCMP_EQ == hr) { // The strings are equal.
// Set the new pooling value.
VARIANT varPool;
VariantInit(&varPool);
varPool.vt = VT_I4; // Tell the VARIANT it's holding a LONG.
varPool.lVal = lPool;
hr = pApplication->put_Value(L"ConcurrentApps", varPool);
if (FAILED (hr)) throw(hr);
printf("%S pooling value set to %ld.\n", bstrMyApp, lPool);
break;
}
}
LONG lNum;
hr = pAppColl->SaveChanges(&lNum);
if (FAILED (hr)) throw(hr);
// Clean up.
SysFreeString(bstrMyApp);
pUnknown->Release();
pUnknown = NULL;
pApplication->Release();
pApplication = NULL;
pAppColl->Release();
pAppColl = NULL;
pCatalog->Release();
pCatalog = NULL;
return (TRUE);
} // Try
catch(HRESULT hr) { // Replace with specific error handling.
printf("Error # %#x: ", hr);
ErrorDescription(hr);
SysFreeString(bstrMyApp);
if (NULL != pUnknown) pUnknown>Release();
pUnknown = NULL;
if (NULL != pApplication) pApplication->Release();
pApplication = NULL;
if (NULL != pAppColl) pAppColl->Release();
pAppColl = NULL;
if (NULL != pCatalog) pCatalog->Release();
pCatalog = NULL;
return (FALSE);
}catch(...) {
printf("An unexpected exception occurred.\n");
throw;
}
} // SetMyApplicationPooling
この関数を使用するには、COM+サーバーアプリケーション名の文字列値と、目的のアプリケーションプール設定の整数値を指定します。 次のC++コードは、"MyApplication"という名前のアプリケーションのアプリケーションプール値を15に設定する方法を示しています。
#define _WIN32_DCOM // To use CoInitializeEx()
void main() {
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (FAILED (hr)) {
printf("CoInitializeEx failed: Error # %#x\n", hr);
exit(0); // Replace with specific error handling.
}
if (! SetMyApplicationPooling (L"MyApplication", 15))
printf("SetMyApplicationPooling failed.\n");
CoUninitialize();
}
関連トピック