2011-01-20 8 views
1

私は現在Cヘッダをdelphiに翻訳しています。 C言語のvsnprintfを置き換えることができる関数はありますか?それとも共通のDLLに存在していますか?vsnprintfはDelphiで同等ですか?

int vsnprintf(char *str, size_t size, const char *format, va_list ap);

答えて

2

デルファイには最も近い同値関数が存在し、それはFormatStrです。プロトタイプは:

function Format (Const Formatting : string; Const Data : array of const) : string;
function Format (Const Formatting : string; Const Data : array of const; FormatSettings : TFormatSettings) : string;

それは形式に、値のリストをフォーマット制御文字列を受け取り、フォーマットされた文字列を返します。

0

vsnprintf() Cコンパイラのランタイムライブラリの実装に実装されています。 DLLには存在しません。デルファイには同義語はありません。あなたが翻訳しているものは、Delphiの独自の機能を使用するために書き直さなければなりません。あなたが翻訳しているものを示してください。

+0

"DLLには存在しません"。さて、動的にリンクされているCランタイムのDLLには存在します。特に、Windowsシステムコンポーネントであるmsvcrt.dllにあります。 –

2

あなたの質問はほとんどあなたがCランタイム関数を取得するためにはmsvcrt.dllをリンクすることができますDelphi "array of const" to "varargs"

0

で答えています。これはWindowsコンポーネントであり、Visual Studioランタイムの一部ではありません。従ってそれは存在することに依拠することができる。

ヒープ割り当てを行う関数を使用する場合は注意が必要です。それを行う必要がある場合は、同じメモリマネージャでそのメモリを解放する必要があります。 1つのトリックはmsvcrt.dllのmallocを使ってDelphiのメモリマネージャを置き換えることです。

私はこれがあなたの現在の問題を解決する最善の方法ではないと言っています。長期的には、DelphiがWindows以外のプラットフォームをサポートしている場合、移植可能なネイティブのDelphiソリューションを使用する方がよい場合があります。

0

Windowsはwvnsprintfを提供します。これはAPI関数であり、Cランタイム関数ではありません。ドキュメントでは、代わりに"safe" string functionsのいずれかを使用することを強くお勧めします(StringCbVPrintfなど)。 wvsnprintfは結果のヌル終了を保証しません。

+0

Delphiは 'va_list'型を直接サポートしていません。これは、 'vsnprintf'形式の関数が通常のポインタ演算を使用してパラメータを処理できるように、スタックベースのパラメータへのアクセスを提供するC型です。 DLLからそのような関数を消費するためだけに、 'varargs'パラメータを受け入れるDelphiで関数を実装することはできません。したがって、' va_list'ベースの関数を呼び出すときに、手動で 'va_list'ポインタを設定するための変数スタックはありません... –

+0

... 'stdcall'規約と固定パラメータリストを使用する通常の関数を実装し、目的のパラメータへのポインタを取得し、それを' vsnprintf'スタイルの関数に渡すのが最も良い方法です。 –

+0

@Remy、 'va_list'型は単純に値へのポインタです。 'va_list'構造体を作成するためにDelphiでvarargs関数を実装する必要はありません。すべての値が同じタイプの場合は、配列を使用できます。それ以外の場合は、レコードを定義します。次に、関数に最初の要素へのポインタを渡します。 –

関連する問題