Document Properties


(It gets information about custom properties) Dim oPropName As Object = typeDocProperties.InvokeMember("Item", Reflection.BindingFlags.Default Or Reflection.BindingFlags.GetProperty, Nothing, objDocumentProperties, New Object() {sPropertyName})
Dim oPropNameType As Type = oPropName.GetType
Dim val As String = oPropNameType.InvokeMember("Value", Reflection.BindingFlags.Default Or Reflection.BindingFlags.GetProperty, Nothing, oPropName, New Object() {}).ToString Return val


a strange error upgraded to Win 7 Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Core.DocumentProperties'.
This operation failed because the QueryInterface call on the COM component for the interface with IID '{2DF8D04D-5BFA-101B-BDE5-00AA0044DE52}' failed due to the following error:
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).



It looks like that the method doesn't work in Win 7 anymore BUT just in some specific condition (It seems it has problem when a document is being opened, otherwise it's to be working fine)


I changed the code to use 'normal' approach and it seems to be working fine.



Dim properties As Microsoft.Office.Core.DocumentProperties
properties = CType(objDocument.CustomDocumentProperties, Office.DocumentProperties)


Dim prop = properties.Cast(Of Office.DocumentProperty)().FirstOrDefault(Function(x) x.Name.ToLower.Equals(sPropertyName.ToLower))
If prop Is Nothing Then Return String.Empty Return prop.Value



    Public Class CustomDocProperties 

' Note: Object type is used instead of Office.DocumentProperties to avoid a type conversion error
        Private CustomDocProps As Object

' DocProperty code using Object
        Private ReadOnly Property DocProperty(ByVal Name As String) As Object
            <DebuggerStepThrough()> _
            Get
                Try
' Note: This is significantly faster than looping through the properties
                    Return CustomDocProps(Name.ToString)
                Catch ex As Exception
                    Return Nothing
                End Try
            End Get
        End Property

        Property Value(ByVal Name As EraCustomPropertyName) As Object
            Get
                Dim docProp As Object = DocProperty(Name)
                If docProp IsNot Nothing Then
                    Return docProp.Value
                Else
                    Return Nothing
                End If
            End Get
            Set(ByVal value As Object)
                Dim docProp As Object = DocProperty(Name)
                If docProp IsNot Nothing Then
                    docProp.Value = value ' set value
                Else
                    Add(Name, value) ' add new prop and set value
                End If
            End Set
        End Property

        Private Function Add(ByVal Name As String, ByVal Value As Object) As Object
            If TypeOf Value Is Integer OrElse TypeOf Value Is Double Then
' Numeric
                Return CustomDocProps.Add(Name.ToString, False, Core.MsoDocProperties.msoPropertyTypeNumber, Value)
            Else
' String
                Return CustomDocProps.Add(Name.ToString, False, Core.MsoDocProperties.msoPropertyTypeString, Value)
            End If
        End Function

        Sub Delete(Name As String)
            Dim docProp As Object = DocProperty(Name)
            If docProp IsNot Nothing Then
                docProp.delete()
            End If
        End Sub

        Public Sub New(ByVal WordDoc As Word.Document, Optional ByVal TemplateProperty As Boolean = False)
            If TemplateProperty Then
                CustomDocProps = WordDoc.AttachedTemplate.CustomDocumentProperties
            Else
                CustomDocProps = WordDoc.CustomDocumentProperties
            End If
        End Sub

    End Class



© 2024 Better Solutions Limited. All Rights Reserved. © 2024 Better Solutions Limited TopPrev