質問

それは良いアイデアのためのC API機能の配分のパスワードを入力して、ユーザーの指定は出力バッファ?例えば:

BOOL GetString(
    PWSTR *String
    );
...
PWSTR string;
GetString(&string);
Free(string);

vs

BOOL GetString(
    PWSTR Buffer,
    ULONG BufferSize,
    PULONG RequiredBufferSize
    );
...
// A lot more code than in the first case

具体的には、私はなんだろうな、Win32APIを主に使用の場合(例えば GetWindowText, LookupAccountSid).場合を行う機能のAPIを知っていて大きな出力は、そのユーザーか当ててみてください出力の大きさはどれくらいですか?いての情報はその場で使うことにします。

また:のLookupAccountSidの例では特に悪いです。社内で使用さLSA APIは、割り当て、出力して、呼び出し側に返します。その後LookupAccountSidを取得しますユーザーに割り当てをバッファと推測の正しいバッファサイズであることができるのか、その出力を返すからLSA!なぜですか?

役に立ちましたか?

解決

のWin32 APIは、事前に割り当てることが呼び出すコードにバッファを提供する方法の選択肢を与えることを望んでいるので、バッファーをしません。彼らは、スタックとヒープベースのバッファの多様性を提供することができます。そこバッファの最大サイズは事前に知られているいくつかの場所があり、開発者は、スタックベースのバッファを使用してのシンプルさを求めています。

パスはMAX_PATHを超えないように、

ファイル・システムは、最良の例です。そうではなく、自由な+割り当てます。開発者は、単に、スタックベースのバッファを宣言します。

CのAPIを有することの利点は、メモリは、それが呼び出しパターンを簡素化することである割り当てます。 Win32のパターンの欠点は、ほとんどの時間は、あなたが二回APIを呼び出してしまうということです。最初の時間は、バッファのサイズ、適切なサイズのバッファと、第2の時間を決定します。 APIとの唯一のコールが必要とされているバッファに割り当てられます。

欠点しかしあなたは、発信者からの割り当ての選択肢を奪うということです。また、あなたは彼らが適切に(例えば窓がいくつかの異なる場所から割り当てることができます)APIを解放するためにあなたの選択を伝える必要があります。

他のヒント

第二のアプローチはよう

  • これにより、呼び出し側の管理の寿命についてのメモリ割当て
  • これにより、呼び出し側を再割り当てられたメモリ異なるという同じデータパターン
  • これにより、呼び出し側は何かを考え,議論することで バッファの提供などスタックやヒープ.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top