Zugriff auf die David API mit einem VB.NET Windows Dienst

  • Guten Morgen,


    ich habe ein kleines Problem mit der David API.
    Ich versuche Emails aus einem David Ordner lokal zu speichern um diese dann in einem Dokumentenmanagementsystem abzulegen.


    Nun zu meinem Problem ich verwende diese Funktion:


    Code
    Private Declare Function DVEmlFromMailItem Lib "DvApi32" (ByVal oMailItem As DvApi32.MailItem, ByVal strFileName As String) As Long...Dim David_Item As MailItem...If DVEmlFromMailItem(David_Item, David_FileName) <> 0 Then...My.Computer.FileSystem.CopyFile(David_FileName, destination, True)...end


    Wenn ich den Code in einem normalen VB.Net Programm ausführe funktioniert das auch wunderbar.
    Nur ich möchte das ganze als Dienst laufen lassen und da bekomme ich beim Aufruf dieser Funktion:
    DVEmlFromMailItem
    nichts zurück und die David_Filename Variable wird nicht gefüllt.
    In meinem Dienst ist die David_Item Variable richtig gefüllt und die Anmeldung hat auch Funktioniert.


    Wenn ich mit dem Dienst nersuche ein Fax lokal zu speichern funktioniert das, aber da verwende ich eine andere Funktion:


    Code
    source = David_Item.Image
        	My.Computer.FileSystem.CopyFile(source, destination, True)


    Hat jemand eine Idee warum das mit den Mails nicht klappt?

  • Moin!


    Unter welchem Benutzer läuft der Dienst?
    Hatte auch mal diese Probleme, zwar nicht mit Tobit, aber allgemein mit Diensten, dass Variablen nicht gefüllt wurden, weil es Benutzerumgebungsvariablen waren.
    Musste dann mein Dienst als "Benutzer" laufen lassen.

  • Moin,
    ich lasse den Dienst als Domänen Admin laufen, sonst startet der erst gar nicht...


    Ich hatte auch schon so einen ähnlichen Verdacht,
    da die DVEmlFromMailItem Funktion die .eml Dateien in dem Benutzer Temp Pfad speichert.
    Hatte dann aber die Systemvariablen für den Tempfad auf C:\Temp umgestellt...hat aber leider nichts gebracht.
    Ich bin echt am verzweifeln...

  • Moin!


    Also meines Wissens nach liegt der Temp-Ordner in %TEMP%\$$dv$$ oder so....
    Wie fragst Du den Temp-Ordner ab? Stell mal alles wieder auf Standard.


    Test mal so...

    Zitat

    Public strUserProfile As String = GetFolderPath(Environment.SpecialFolder.Userprofile)


    und dann müsste "strUserProfile\appdata\local\temp\$$dv$$" der richtige Pfad sein!
    Du musst den Dienst unter dem Benutzer laufen lassen, dessen $$dv$$ Du abfragen möchtest... Also nicht als "lokales Systemkonto" oder sooo...

  • Achso, ich habe das zum Testen immer so gemacht, dass ich zum testen jeden möglichen Scheiss (Pfade, Variablen, Haltepunkte) in das Ereignisprotokoll geschrieben habe...

  • Moin,
    ich frage den Temp Ordner nicht ab.
    Ich rufe in meinem Dienst die API Funktion

    Code
    DVEmlFromMailItem(David_Item, David_FileName)


    auf.


    In der Variablen "David_Item" befinden sich die Informationen über die Email.
    Bei dem Aufruf der Funktion DVEmlFromMailItem schreibt mir die API normalerweise in meine Variable David_FileName
    den Pfad zur .eml Datei, die ich dann exportieren will.
    ( Dieser Pfad ist dann der lokale Temp Pfad + $$dv$$ + .eml Datei )


    Blöderweise klappt das nicht wenn ich das in einem Dienst aufrufe...

  • Moin,
    ich habe jetzt das beispiel Projekt aus der API Beschreibung genommen und einen Windows Dienst daraus gemacht.
    Nun habe ich mal eine Fehlermeldung raus bekommen...
    Und zwar beim Aufruf der Funktion :


    Code
    DVEmlFromMailItem(oMailItem, Filename)


    Bekomme ich diese Meldung :


    Code
    System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.


    Hat jemand eine Idee was das heißen könnte?


    Und was heißt das eigentlich wenn die Funktion "0" zurückgibt bzw wofür steht der Rückgabewert??

  • Mal ne doofe Frage, wie sieht denn

    Zitat

    David_FileName


    gefüllt aus, wenn du es in einem "normalen" VB.Net Programm ausführst?
    Bekommste da einen UNC Pfad oder einen Pfad mit Laufwerksangabe?
    Wenn du einen Pfad mit einem z.B. gemappten Laufwerk Q:\ bekommst, kannst du lange suchen. Denn IMO steht deinem Dienst-Programm nicht so ohne weiteres ein gemapptes Laufwerk zur Verfügung.

    Einmal editiert, zuletzt von stsm ()

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!