C++ API では、CComAPIHandler クラスおよび ConvertObject 関数を使用して、C++ API および Softimage オブジェクト モデル間で変換を管理することができます。 2 つの違いは、ConvertObject()は実装の Automation(ActiveX)オブジェクトを提供するのに対し、CComAPIHandler はオブジェクト モデルの C++ API ラッパーである点です。
CComAPIHandler クラスでは、CComAPIHandler::Call(メソッド用)、CComAPIHandler::GetProperty および CComAPIHandler::PutProperty(プロパティ用)を使用して Automation オブジェクトのメンバにアクセスすることができます。 たとえば以下のようになります。
// Use the object model version of the Model::AddActionSource() function ActionSource oSource( in_oSelItem ); CRef oModel = oSource.GetModel().GetRef(); // To define an Automation object in C++ code, use the CComAPIHandler class CValue retVal; CComAPIHandler comHandler( oModel.GetRef() ); // Now that you have an instance of the Model interface, you can use the // CComAPIHandler::Call member to execute the AddActionSource method comHandler.Call( L"AddActionSource", retVal, L"OO_" + oSource.GetName() );
この例は、CComAPIHandler を使用して DataRepository オブジェクトにアクセスする方法を示しています。
CRef oObj = Application().GetSelection().GetItem(0); CComAPIHandler ccomXSIUtils; ccomXSIUtils.CreateInstance( L"XSI.Utils"); CComAPIHandler dataRep(ccomXSIUtils.GetProperty( L"DataRepository" )) ; XSI::CStatus ret; CValue ioID; CValueArray inArgs; inArgs.Add(CValue(oObj)); inArgs.Add(2L); ret = dataRep.Call( L"GetIdentifier", ioID, inArgs); Application().LogMessage(L"Selected Object GUID is " + ioID.GetAsText(),siInfoMsg);
グローバル関数 ConvertObject()は、CRef オブジェクトを Softimage Automation オブジェクトに変換します(その逆の変換も行います)。 これにより、オブジェクト モデルと純粋な C++ をコード内で混在させることができます。
// Use the object model version of the Model::AddActionSource() function ActionSource oSource( in_oSelItem ); CRef oModel = oSource.GetModel().GetRef(); // Pass a CRef to ConvertObject and get an IDispatch* through a void* ptr ModelPtr oModelCOM = ( IDispatch* )ConvertObject( oModel ); // Now you can use the new pointer to get at the object model methods ActionSourcePtr oNewSourceCOM = oModelCOM->AddActionSource( "OO_" & oSource.GetName() ); // Convert the new ActiveX Source object back to C++ ActionSource oNewSource = ConvertObject( oNewSourceCOM );