Toon posts:

[vb.net] Outlook Application sluit niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Devvers,

Ik ben bezig met een tooltje wat outlook om de paar minuten controleerd op nieuwe taken. Dit werkt op zich prima alleen sluit de Outlook Instance zich niet af. Ik gebruik onderstaande code.

Ik heb al Ge'googled' en Ge'got' en het enige wat ik kan vinden wat in de buurt komt is
ooutlook.quit of ooutlook.session.logoff
Dit helpt echter allemaal niet en ben al een paar uur aan het stoeien.

Wie weet de oplossing ?

Alvast bedankt

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Private Sub check_tasks()

        lv_tasks.Clear()
        lv_tasks.Columns.Add("Taakomschrijving", 150, HorizontalAlignment.Left)
        lv_tasks.Columns.Add("Percentage", 150, HorizontalAlignment.Left)


        Dim oOutlook As Outlook.Application
        Dim oNs As Outlook.NameSpace
        Dim oFldr As Outlook.MAPIFolder
        Dim oMessage As Outlook.TaskItem


        oOutlook = New Outlook.Application
        oNs = oOutlook.GetNamespace("MAPI")
        oFldr = oNs.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks)
        aantal_totaal = 0

        For Each oMessage In oFldr.Items

            If oMessage.Complete = False Then

                aantal_totaal = aantal_totaal + 1

                If aantal_start < aantal_totaal Then
                    BalloonShown("Nieuwe Taak voor " & (System.Environment.UserName) & "", "Je hebt nieuwe taken")

                End If

                Dim task As ListViewItem = New ListViewItem
                task.Tag = oMessage.EntryID
                task.Text = oMessage.Subject
                task.SubItems.Add(oMessage.PercentComplete)
                lv_tasks.Items.Add(task)

            End If

        Next

        oMessage = Nothing
        oFldr = Nothing
        oNs = Nothing
        oOutlook = Nothing


    End Sub

Verwijderd

Topicstarter
Heeft echt niemand hier ervaring mee ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
Roep eens de dispose method aan van dat outlook object voor je 'm op null zet (als die een Dispose method heeft natuurlijk).

https://fgheysels.github.io/


Verwijderd

Het zetten van Nothing heeft geen invloed op het goed sluiten van de applicatie. Nothing geeft aan de garbage collector in .NET aan dat het object niet meer gebruikt wordt, echter is het de vraag wanneer het opgeruimt gaat worden.

Kijk hier eens en kijk of dit lukt:
http://www.experts-exchan...ual_Basic/Q_21237954.html

Komt hier op neer:
oOutlook.Session.Logoff
oOutlook.Quit
oOutlook = Nothing

Verwijderd

Topicstarter
@ Whoami - Het outlook object heeft geen dispose method. Wel een quit maar ook dat werkt niet.

@ Tony L - Mag helaas ook niet werken. Zelfs niet in een nieuwe schoon project zonder al te veel extra code

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
Verwijderd schreef op zondag 25 september 2005 @ 09:35:
Het zetten van Nothing heeft geen invloed op het goed sluiten van de applicatie. Nothing geeft aan de garbage collector in .NET aan dat het object niet meer gebruikt wordt, echter is het de vraag wanneer het opgeruimt gaat worden.
Je kan natuurlijk zelf de garbage collector oproepen (GC.Collect()). Dat is echter wel niet echt 'best practice'.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik vind het zo typisch. Je opent een instance van outlook. Later sluit je die instance van outlook. Maar hij sluit niet en hij geeft geen foutmelding of wat dan ook.
Alsof hij blijft hangen op het 1 of ander.
Had wel ergens gelezen dat je de sessie uit moest loggen maar die word ook netjes uitgelogd.

Wat ook apart is is dat als ik die sub bv 36 keer aanroep dat Outlook maar 1x in de processlist staat. Het lijkt dus wel alsof hij hem netjes afsluit maar toch in de processlist blijft staan.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
Heb je al eens geprobeert om de garbage collector aan te roepen, nadat je je instance op null gezet hebt ?

https://fgheysels.github.io/


Verwijderd

Ik denk dat je te maken hebt met het gebruikelijke Office-gedrag.
Je hebt te maken met COM-objecten aangestuurd vanuit dotNet.
Probeer het eens met deze url:
http://support.microsoft....scid=kb;EN-US;Q317109#kb3
ik gok dat het voor outlook net zo werkt

Verwijderd

whoami schreef op zondag 25 september 2005 @ 10:58:
Heb je al eens geprobeert om de garbage collector aan te roepen, nadat je je instance op null gezet hebt ?
Ik zou eerst eens uitzoeken waarom outlook open blijft staan. Er is zeker weten een reden voor. Ik vind dat je in principe de Garabage.Collect() nooit hoeft aan te roepen. Er is altijd wel een mooiere manier om je instanties keurig af te sluiten. Misschien dat je hem 1x van de 100 nodig hebt. Ik denk dat er nog objecten open staan die naar outlook verwijzen. Als je zaken opent zorg er ook voor dat je ze weer goed afsluit.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
Daar heb je gelijk in.
Ik heb net eens even wat code doorgenomen van een project waar ik nog aan meegewerkt heb, en daar gebruikten we ook die Marshal.ReleaseComObject om de office instances vrij te geven.

https://fgheysels.github.io/


Verwijderd

Topicstarter
helaas :(

Via het Marshal.ReleaseComObject krijg ik de foutmelding (nadat ik de exeption opvang) de melding : De objectverwijzing is niet op een exemplaar van een object ingesteld.

[ Voor 91% gewijzigd door Verwijderd op 25-09-2005 19:50 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op zondag 25 september 2005 @ 19:36:
helaas :(

Via het Marshal.ReleaseComObject krijg ik de foutmelding (nadat ik de exeption opvang) de melding : De objectverwijzing is niet op een exemplaar van een object ingesteld.
Waarschijnlijk omdat je je outlook refference eerst op Nothing zet. Dan kan je hem natuurlijk ook niet meer verwijderen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Maar ik zet niet eerst de reference op nothing. Was het maar waar dan was het opgelost

Verwijderd

Topicstarter
Nieuw testproject gestart met alleen de volgende code :
Werkt ook niet. Zie ik nou echt iets over het hoofd ?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub NAR(ByVal o As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
        Catch
        Finally
            o = Nothing
        End Try

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ool As Outlook.Application
        ool = New Outlook.Application
        ool.Quit()
        NAR(ool)
        ool = Nothing
    End Sub

[ Voor 47% gewijzigd door Verwijderd op 25-09-2005 20:43 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
Dit werkt gewoon bij mij hoor:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
private Microsoft.Office.Interop.Outlook.Application app;

private void button2_Click(object sender, System.EventArgs e)
{
    app = new Microsoft.Office.Interop.Outlook.ApplicationClass();          
}

private void button3_Click(object sender, System.EventArgs e)
{
    app.Quit();

    System.Runtime.InteropServices.Marshal.ReleaseComObject (app);
}


Als ik op button 2 click, wordt er een outlook instance gestart (die zie ik in m'n process list verschijnen).
Klik op button 3, dan verdwijnt die weer, en krijg ik geen exceptie.

Wat 'werkt' er niet bij de laatste code die je gepost hebt ? Krijg je een exceptie ? Blijft het OUTLOOK.exe process bestaan ?
Ben je wel zeker dat alle references naar het outlook object weg zijn ? Dit kan je checken door de return-code van de ReleaseComObject method op te vragen. Als die 0 returned, dan zijn er geen references meer naar dat object.

[ Voor 14% gewijzigd door whoami op 25-09-2005 21:49 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Geen exception maar outlook.exe process blijft bestaan. en ben niet helemaal bekend met het releasecomobject maar heb het zo gedaan :

code:
1
MessageBox.Show(System.Runtime.InteropServices.Marshal.ReleaseComObject(app))


en die geeft -1 terug

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

In de code van bromaster, moet je hem dan niet ByRef ipv ByVal meegeven?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
ook even gecheckt en ook dit geeft geen sjoege. process outlook.exe blijft gewoon vrolijk doordraaien

  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
Heb je invoegtoepassingen draaien in Outlook? Of ActiveSync oid?

Verwijderd

Topicstarter
Ik had inderdaad spambayes draaien. Deze heb ik ondertussen uitgeschakeld en het probleem draait. Activesync had ik al uitgeschakeld

Verwijderd

Houd er trouwens rekening mee dat elke outlook versie weer anders is (ook met aanroepen en dergelijke). Ik weet niet welke versie jij hebt maar ik zou expliciet zoeken op problemen met het afsluiten met jouw versie. Misschien dat dat wat oplevert. Echter met latebinding zou er geen problemen moeten zijn voorzover ik heb begrepen. Probeer anders een latebinding te gebruiken om te kijken of dit misschien iets oplevert.
Pagina: 1