変換 DLL の作成

変換関数は、ネイティブ Win32 DLL でなければなりません (.NET アセンブリではありません)。Microsoft Visual Studio で作成するには、Win32 プロジェクトを作成し、アプリケーションの種類として DLL を選択する必要があります。

64 ビット OS 上では、Silk Performer は 64 ビット プロセスを使って、キャプチャ ファイルを分析して、スクリプトを生成します。つまり、32 ビット版(スクリプトの再生用)と 64 ビット版(スクリプトの生成用)の 2 種類の変換 DLL を作成する必要があります。64 ビット版 DLL は、<32 ビット版 DLL の名前>_x64.dll という名前で、32 ビット版 DLL と同じディレクトリに配置する必要があります。

何らかの理由で 64 ビット版 DLL を作成できない場合は、つぎのレジストリ キーを 1 に設定して、スクリプトの生成に 32 ビット プロセスを使うことを Silk Performer に強制することができます:HKEY_LOCAL_MACHINE\SOFTWARE\Silk\SilkPerformer\<version>\Force32BitCaptureAnalyzer
重要: 32 ビットのスクリプト生成プログラムでは、キャプチャ ファイルのサイズが大きい場合に問題が発生する可能性があります。

Silk Performer は、独自のカスタム変換 DLL を作成するためのガイドラインとなる Microsoft Visual Studio のサンプル プロジェクトをヘッダーと .cpp ファイルと共に提供します。このサンプルは、<パブリック ユーザー ドキュメント>\Silk Performer <バージョン>\SampleApps\SampleConversion にあります。

プロジェクトを作成した後、いくつかの変更する必要のあるプロジェクト設定があります。
  • [文字セット] オプションを [マルチ バイト文字セットを使用する] (MBCS) に設定する必要があります。これは、文字列を MBCS 文字列として変換して渡す必要があるために必要となります。
  • C ランタイム DLL への依存性を除去するため、C ランタイムの静的なバージョンを使用することを推奨します。この依存性は、C ランタイム DLL (使用したバージョンの) がエージェントまたはコントローラ マシンにインストールされていない場合に問題を起こします。静的 C ランタイム ライブラリを使用するには、[C++ | コード生成] にある [ランタイム ライブラリ] 設定を変更します。
    • リリース構成の場合: [マルチスレッド (/MT)]
    • デバッグ構成の場合: [マルチスレッド デバッグ (/MTd)]

推奨

記録ルールで変換 DLL を参照する場合、DLL を Silk Performer 記録ルール ディレクトリ、または、プロジェクト ディレクトリにコピーする必要があります。変換 DLL を Microsoft Visual Studio で開発する際には、ポスト ビルド ステップで DLL をこれらのディレクトリ (記録ルールまたはプロジェクト) にコピーするか、または記録ルールにリリース構成の出力ディレクトリ パスを変更します。

変換関数のエクスポート

次のシグネチャを持つ変換関数をエクスポートする必要があります。

extern "C"
{
  __declspec( dllexport )
  long MyConversionFunction(
  LPCSTR sOriginalValue,
  LPSTR sConvertedValue,
  unsigned long* psConvertedValueLen,
  void* pReserved);
}

C++ リンケージ (extern "C") を使用する目的は、エクスポートした関数の C++ 名前マングルをオフにするためです。C++ リンケージを使用した場合、引数の型のようなほかの情報は関数のエクスポートした名前に加えられます。純粋関数の名前をエクスポートした関数名として使用します (上記の例では MyConversionFunction)。

関数の引数は次のとおりです。
sOriginalValue 変換される MBCS 文字列の値。
sConvertedValue 変換した値を MBCS 文字列として受け取る文字列バッファ。
psConvertedValueLen 文字列バッファ sConvertedValue の長さを含む変数へのポインタ変数の値は、変換が成功した場合sConvertedValue に書き出されるバイト数に設定されます。この変数の値は、文字列バッファ sConvertedValue のサイズが小さすぎる場合、変換した値に必要なバイト数に設定する必要があります。
pReserved 今後に利用するために予約。
戻り値
  • ERROR_SUCCESS (0): 変換が成功したかどうかを返します。psConvertedValueLen には、sConvertedValue に書き出されたバイト数が含まれます。
  • ERROR_INSUFFICIENT_BUFFER (122): sConvertedValue のサイズ (*psConvertedVale) が、変換した値と比較して小さすぎるため変換が失敗した場合に返されます。*psConvertedValueLen には、変換した値を格納するために必要な倍と数が含まれいます。この関数は、*psConvetedValueLen に増やした sConvertedValue のサイズで再び呼び出されます。
  • 変換が失敗したことを示す任意のその他の値を返します。