Skip to content

Commit c6f0c63

Browse files
authored
Merge pull request #728 from microsoft/fix717
Add BSTR.Length property
2 parents 2cceaa6 + 83b3dfb commit c6f0c63

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

src/Microsoft.Windows.CsWin32/Generator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4157,6 +4157,7 @@ private StructDeclarationSyntax DeclareTypeDefStruct(TypeDefinition typeDef, Typ
41574157
{
41584158
case "BSTR":
41594159
members = members.AddRange(this.CreateAdditionalTypeDefBSTRMembers());
4160+
members = members.AddRange(this.ExtractMembersFromTemplate(name.Identifier.ValueText));
41604161
break;
41614162
case "PWSTR":
41624163
members = members.AddRange(this.CreateAdditionalTypeDefPWSTRMembers());
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
internal partial struct BSTR
2+
{
3+
/// <summary>
4+
/// Gets the length of the BSTR in characters.
5+
/// </summary>
6+
internal unsafe int Length => this.Value is null ? 0 : checked((int)(*(((uint*)this.Value) - 1) / sizeof(char)));
7+
}

test/GenerationSandbox.Tests/BasicTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,29 @@ public void BSTR_ToString_Null()
8080
Assert.Null(bstr.ToString());
8181
}
8282

83+
[Theory]
84+
[InlineData("")]
85+
[InlineData("h")]
86+
[InlineData("hello")]
87+
public void BSTR_Length(string value)
88+
{
89+
BSTR bstr = (BSTR)Marshal.StringToBSTR(value);
90+
try
91+
{
92+
Assert.Equal(value.Length, bstr.Length);
93+
}
94+
finally
95+
{
96+
Marshal.FreeBSTR(bstr);
97+
}
98+
}
99+
100+
[Fact]
101+
public void BSTR_Length_Null()
102+
{
103+
Assert.Equal(0, default(BSTR).Length);
104+
}
105+
83106
[Fact]
84107
public unsafe void BSTR_ImplicitConversionTo_ReadOnlySpan()
85108
{

0 commit comments

Comments
 (0)