9

Outlook 相互運用クラスを介して Outlook から予定を取得しようとしています。具体的には、定期的な予定です。相互運用ライブラリの v12 と v14 の両方を使用してみましたが、結果は同じでした。次のコードでは、常に同じ例外が発生します。

コード:

Dim pattern As Outlook.RecurrencePattern = appt.GetRecurrencePattern()
Dim recur As Microsoft.Office.Interop.Outlook.AppointmentItem = Nothing
recur = rp.GetOccurrence(Now())

例外:

このアイテムの繰り返しの 1 つを変更したため、このインスタンスはもう存在しません。開いているアイテムを閉じて、もう一度やり直してください。

注: GetOccurrence のパラメーターに異なる値を使用しました。コード/問題を単純化するために「now()」のみを使用しています。したがって、Now() の使用に問題があるとは思いません。DateTime.Parse("8/28/2012") または DateTime.Parse("8/28/2012 5:00pm") という名前の例外をスローしてみました。

ここからサンプルを見てきました: Question 1Question 2。どちらも同じ問題を抱えているようには見えません。オブジェクトを閉じる、解放する、無効にする (何もしない) というあらゆる順列を試しました。(例: Microsoft Office Interop - トリックとトラップ)。MSDN (例: MDSN ) から直接例をコピーして貼り付け、同じ結果が得られました。私は完全にアイデアがありません!

Windows Server 2008 R2 64 ビット OS で、Visual Studio 2010、.NET 4.0、Outlook 2007 を使用しています。

これは、常に例外をスローするより完全なコード例です。

    Public Sub TestOutlook()
    Dim oApp As Outlook.Application = Nothing
    Dim mapiNamespace As Outlook.[NameSpace] = Nothing
    Dim calFolder As Outlook.MAPIFolder = Nothing
    Dim calItems As Outlook.Items = Nothing

    oApp = New Outlook.Application()
    mapiNamespace = oApp.GetNamespace("MAPI")
    calFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
    calItems = calFolder.Items
    calItems.IncludeRecurrences = True

    For itemIndex As Integer = 1 To calItems.Count

        Dim item As Outlook.AppointmentItem = Nothing
        item = calFolder.Items.Item(itemIndex)

        If item.IsRecurring Then
            Dim rp As Outlook.RecurrencePattern = Nothing
            rp = item.GetRecurrencePattern()
            item.Close(Outlook.OlInspectorClose.olDiscard)
            CleanUpComObject(item)
            item = Nothing
            GC.Collect()

            Try
                rp.GetOccurrence(Now)
            Catch ex As System.Exception
                Debug.WriteLine("Ex with GetOccurrence: " & ex.Message)
            End Try

        End If
        If item IsNot Nothing Then item.Close(Outlook.OlInspectorClose.olDiscard)
        CleanUpComObject(item)
        item = Nothing
        GC.Collect()
    Next

    CleanUpComObject(calItems)
    CleanUpComObject(calFolder)
    CleanUpComObject(mapiNamespace)
    oApp.Quit()
    CleanUpComObject(oApp)
    GC.Collect()
End Sub

Private Sub CleanUpComObject(obj As Object)
    Try
        If obj IsNot Nothing AndAlso System.Runtime.InteropServices.Marshal.IsComObject(obj) Then
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj)
            obj = Nothing
        End If
    Catch ex As System.Exception
        Debug.WriteLine("Exception in Clean up: " & ex.Message)
    End Try
End Sub

ありがとう

4

2 に答える 2

11

過去数時間、まったく同じ問題に取り組んできましたが、最終的に解決策にたどり着きました。渡された DateTime 値が定期的な予定のインスタンスと一致しない限り、GetOccurrence() は常にそのエラーをスローするようです。

RecurrencePattern から時間を取得し、それを GetOccurence() に渡された DateTime 値に追加するバージョンのコードを次に示します。これにより、選択した日付に該当する予定のインスタンスが正しく検出されます。

Dim item As Outlook.AppointmentItem = Nothing 
item = calFolder.Items.Item(itemIndex) 

If item.IsRecurring Then 
    Dim rp As Outlook.RecurrencePattern = Nothing 
    rp = item.GetRecurrencePattern() 

    Dim dt2 as DateTime = DateTime.Parse("8/28/2012")
    dt2 = dt2.AddHours(item.Start.Hour)
    dt2 = dt2.AddMinutes(item.Start.Minute)
    dt2 = dt2.AddSeconds(item.Start.Second)

    item.Close(Outlook.OlInspectorClose.olDiscard) 
    CleanUpComObject(item) 
    item = Nothing 
    GC.Collect()  

    Try 
        rp.GetOccurrence(dt2)

    Catch ex1 As System.Runtime.InteropServices.COMException

// Do Nothing, let this error go.  No instance of the appointment falls on this date.

    Catch ex As System.Exception
        Debug.WriteLine("Ex with GetOccurrence: " & ex.Message) 
    End Try 

End If 

私は C# 開発者であるため、OP のコードと C# から変換された私のコードの融合であり、コンパイラを通過していないため、上記には構文エラーがある可能性があることに注意してください。

于 2012-09-26T14:17:09.720 に答える