C++ API では、CComAPIHandler クラスと ConvertObject 関数で、C++ API と Softimage オブジェクト モデル間の変換の管理を支援します。2 つの違いは、ConvertObject()は実装の Automation(ActiveX)オブジェクトを提供するのに対し、CComAPIHandler はオブジェクト モデルの C++ API ラッパーである点です。
CComAPIHandler クラスは、Automation オブジェクトのメンバへのアクセスを可能にします。CComAPIHandler::Call(メソッドの場合)、および CComAPIHandler::GetProperty と CComAPIHandler::PutProperty(プロパティの場合)を使用します。たとえば以下のようになります。
// 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 );