[DllImport("ole32.dll")]
static extern int PropStgNameToFmtId([MarshalAs(UnmanagedType.LPWStr)]
string oszName, out FMTID pfmtid);
<DllImport("ole32.dll", preservesig:=False)> _
Friend Shared Function PropStgNameToFmtId( _
<MarshalAs(UnmanagedType.LPWStr)> ByVal oszName As String, _
<Out()> ByRef FMTID As Guid) As Integer
End Function
None.
None.
To generate a FormatIdentifier from a custom PropertyStorage name use the following in VB.Net:
Dim characters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
Dim name As New StringBuilder(propertyStorageName)
Dim bits As BitArray
Dim i As Integer
Dim j As Integer
Dim index As Integer
Dim idBytes() As Byte
Dim idBits As BitArray
idBits = New BitArray(130) '26 * 5 - 26 Characters @ 5bits each
For i = 0 To name.Length - 1
'Get the index of the current character and convert it to
'a BitArray with a length of five (MaxValue = 31 hence the
'character restriction
index = characters.IndexOf(Char.ToUpper(name.Chars(i)))
bits = New BitArray(New Byte() _
{CByte(index)})
For j = 0 To 4
idBits(j + (5 * i)) = bits(j)
Next
Next
'A new Guid requires an array of exactly 16 bytes
'Split the first 128 bits of the array into 8 bit chunks
For i = 0 To 15
ReDim Preserve idBytes(i)
bits = New BitArray(8)
For j = 0 To 7
bits(j) = idBits(j + (8 * i))
Next
idBytes(i) = CByte(BitsToInteger(bits))
Next
Dim fmtId As New Guid(idBytes)
Guids generated with this will return the name using the FmtIdToPropStgName Function. The name returned will be filled to 26 chars with the letter 'a' due to the fixed size of a Guid and the fact that we're passing all zeros in the BitArray after the name finishes to reach this size.
The following helper function is also required:
Friend Function BitsToInteger(ByVal bits As BitArray) As Integer
Dim int As Integer = 0
Dim i As Integer
For i = 0 To bits.Count - 1
If bits(i) Then
int += 2 ^ i
End If
Next
Return int
End Function
Please add some!
Do you know one? Please contribute it!