バイナリ互換インターフェースの使用によるC/C++ OMLライブラリの記述

このインターフェースを使用する利点は、オブジェクトのサイズが変化しないことにあります。つまり、このインターフェース(2017.2以降)に対応していれば、Composeのどのバージョンでも、コンパイルしたコードを使用できます。ヘッダーファイルに記述されたバージョンに限定されることがありません。また、Composeの実行可能ファイルで使用したツールとは異なるツールでもコンパイルが可能です。

このインターフェースを使用するどのようなライブラリも、次の2つの部分で構成されています:
  • Composeで呼び出す初期化関数。この関数は、ライブラリの関数がComposeにどのように登録されるかを定義します。
  • その関数自体。
初期化セクションには必ず次の署名があります。
int InitToolbox(OMLInterface* eval)

この関数は、その名前がコンパイラーでマングルされないように、extern "C"として宣言する必要があります。また、DLLからエクスポートするものであることも必要です。

次の項で、OMLインターフェースクラスの各種メソッドについて説明しています。

この関数の本体は次の形式で記述します。
int InitToolbox(OMLInterface* eval)
{
	eval->RegisterFunction(“myfunc”, myfunc); 
  	// myfunc needs to be forward declared
	eval->RegisterFunction(“myfunc2”, myfunc2);
	// …
	return 0;
}
ライブラリの各関数には次の署名が必要です。
bool myfunc(OMLInterface* eval, const OMLCurrencyList* inputs, OMLCurrencyList* outputs)

OMLは型のない言語なので、コード作成者が入力ごとの適切なC++の型を判断し、それに従った処理を記述する必要があります。

OMLCurrencyListクラスとそのすべての従属クラスについても、以降に説明があります。

2つのスカラーを追加する簡単な例を次に示します。この関数に不適切な入力(誤った数値や誤った型)を指定すると、エラーがスローされて実行が停止します。
bool myfunc(OMLInterface* eval, const OMLCurrencyList* inputs, OMLCurrencyList* outputs)
{
	// check proper number of inputs
if (inputs->Size() != 2)
    eval->ThrowError(“Incorrect number of inputs”);
OMLCurrency* input1 = inputs->Get(0);
OMLCurrency* input2 = inputs->Get(1);

// check proper input types
if (input1->IsScalar() && input2->IsScalar())
{
double d1 = input1->GetScalar();
double d2 = input2->GetScalar();
outputs->AddScalar(d1+d2);
}
else
{
eval->ThrowError(“Invalid input type”);
}
	return true;
}