CのメインAPI共通の問題と解決策

Essbase APIを使用すると、Essbase管理サーバーおよびMaxLが使用する関数の多くに無制限にアクセスできます。

この項は、最も一般的な障害を特定して解決するためのクイック・リファレンスです。

問題

解決策

メモリーの割当て時または解放時に、プログラムで保護違反が発生しています。

Cプログラムでは、次の点を確認します:

  • EssFree()関数を使用してAPIから戻されたメモリーが解放されていることを確認します。

  • APIに渡すポインタの宣言された間接レベルを確認します。

  • Bounds Checker(TM)またはPurify(TM)などのメモリー・チェッカを使用して、影響のあるモジュールを判別します。

Essbaseが使用しないメモリーにアクセスするときにエラーが発生していても、Essbaseメモリー管理スキームとユーザーのスキームの間に、干渉がある場合があります。自身のカスタム・メモリー管理関数を定義することを検討できます。

API関数を呼び出すと、ユーザーのプログラムはEssbaseエラーを生成します。

ほとんどのEssbaseエラー・メッセージは説明を必要としません。問題がどこにあるかはかなり明白なはずです。ただし、次に注意すべきよくあるエラーをいくつか示します(%nは、コンテキストに特有の文字列と置換されるメッセージ引数を示します):

  • 「NULLの引数(%1)がESSAPI関数%2に渡されました」。このメッセージは、API関数%2に渡された1つ以上の引数がNULLだったことを示します。%1は、最初のNULL引数の数(1から始まる)を示します。

  • 「ESSAPI関数%1の呼出しシーケンスが無効です」。このメッセージは、別の関数呼出しが必要なときに、API関数(%1)への呼出しを行ったことを示します。たとえば、EssReport()などレポート関数を実行した場合は、NULL文字列が戻されるまでEssGetString()を繰り返し呼び出します。または、EssCalc()などの計算関数を実行した場合、戻される値が計算が完了したことを示すまで、EssGetProcessState()を呼び出すことにより、繰り返し計算状態を確認します。

  • 「ESSAPI関数%sではローカル演算はできません」。ローカルのコンテキスト・ハンドルを、それを許可しない関数へ渡しました。ログイン・コンテキスト・ハンドルをそのかわりに使用します。

  • 「メッセージ・データベース%sを開けません」。メッセージ・データベースが、プログラムが動作しているマシン上でアクセスできません。Essbaseが予期する場所にメッセージ・データベースがあることを確認してください。Essbaseは、最初にEssInit()に渡された初期化構造体のMessagePathフィールドを調べます。次に、ARBORMSGPATH環境変数によって指定されたディレクトリ名およびファイル名を調べ、最後に、$ESSBASEPATH\BINディレクトリを調べます。ここで、$ESSBASEPATHは環境変数です。メッセージ・データベースがこれらのディレクトリのいずれでも利用できない場合、Essbaseは実行時にエラー・メッセージを戻します。どの設定をEssbaseが使用するか確認し、その後、指定された場所にメッセージ・データベースがあることを確認します。詳細は、Essbaseと使用中の製品との統合に関する説明を参照してください。

プログラムが確実にAPI関数からEssbaseエラーの戻りコードを受け取っていてもメッセージが表示されないか、または「メッセージ・データベース内のメッセージ#%1に対するメッセージはありません」というメッセージが生成されます。

内部APIエラーにはメッセージを表示できないものがありますが、これは通常、メッセージが発生した際にユーザーのコンテキスト情報が使用できないためです。この場合には、関数から戻ったエラー・コードのノートを作成し、messages.txtのエラー・メッセージのリストを参照して、対応するメッセージ・テキストを見つけます。エラー定数自体はesserror.hに含まれています。

APIで定義された構造体のフィールドへアクセスした結果、このフィールドの値が誤っているか、数バイトずれているように見えます。

お使いのコンパイラが、構造体のバイト境界が揃っていることをデフォルトで確認するかどうか確認します。その問題がまだ発生する場合は、APIヘッダー・ファイルの最新バージョンでコンパイルしていて、最新のAPI DLLとリンクしていることを確認します。