文書化されたnull BSTRの使用場所
-
06-07-2019 - |
質問
null BSTR(null WCHAR *ポインター)を空の文字列として扱い、それに応じてBSTRを操作するすべてのコードを設計することは、少なくとも一般的な方法です。 この質問への回答a>同じことを言ってください。
このプラクティスはどこに文書化されていますか?この規則を説明する公式文書はありますか?
解決
まあ、その質問に対する受け入れられた答えで与えられたリンクは、エリック・リッパートによる記事へのリンクです、エリックのBSTRセマンティクス完全ガイド。公式文書ではないことは間違いなく ですが、LippertはCOMのよく知られた権威です(特にスクリプトの分野)。
ただし、公式ドキュメントには次のように記載されています:
データ要素のないBSTRは、空のBSTRまたはNULL BSTRです。空のBSTRは、存在するが長さがゼロのデータ値を示します。 NULL BSTRは、存在しないデータ値を示します。
したがって、公式にはどちらもデータ要素を持たない BSTR
ですが、セマンティクスがわずかに異なります(ただし、アプリケーションでこれら2つのケースを異なる方法で処理する必要があると言うことはできません)。この場合、私は確かにそれらを同じように扱うというLippertのアドバイスに従います。私にとって、実際の実装がどのように機能するかについての彼の実世界での経験は、公式のBSTRドキュメントの1文よりも重要です。
他のヒント
Michael Burrは、受け入れられるべき答えだと思います。 BSTR
のページがMSDNにはこのプラクティスが記載されていません。
さらに、MSDNドキュメントのこれらのページからこの動作を推測できます。
-
SysFreeString
ページは、bstr
がnull
の場合、関数は単に戻ります。 -
SysStringLen
ページは、bstr
パラメータにnull
を渡すと、文字列の長さに対してゼロが返されます。 -
SysStringByteLen
ページは、同じ動作。null
は長さゼロを意味します。
ただし、ドキュメントは完全ではありません:
-
SysReAllocString
には言及されていません* pbstr
がnull
の場合はどうなります。 -
SysReAllocStringLen
は言及していません* pbstr
がnull
の場合はどうなります。
null BSTRを空の文字列として処理することは一般的な慣行ですが、Microsoftの技術文書には、実際にはこれら2つの間に 違いがあると記載されています。
[MS-DTYP]と[MS-OAUT]の両方を参照するドキュメントの場合、指定 ワイヤ表現コンテキストのBSTRは、 転送されたBSTRタイプへの参照。 メモリ表現コンテキストは、 提示されたBSTRタイプ([MS-DTYP]セクション2.2.5)。を反映 提示されたBSTR、NULL BSTR、または送信されたNULLに使用される用語 BSTRは、NULLで提示されたBSTRのワイヤ表現として定義されます。 そして、空のBSTR、または空の送信されたBSTRは、ワイヤとして定義されます 長さゼロのBSTRの表現。 これを保存する ワイヤー表現の区別により、クライアントとサーバーは NULL表示のBSTRとゼロ長の表示を区別する BSTR、したがって、おそらく異なる、アプリケーション固有の関連付け これら2つの値のセマンティクス。
https://msdn.microsoft.com/en-us/library /cc237580.aspx
したがって、両方が等しいかどうかを処理するかどうかは実装次第です。