Announcement

Collapse
No announcement yet.

Fehler bei FtpDeleteFile, aber LastDllError=0

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehler bei FtpDeleteFile, aber LastDllError=0

    Hi,

    Ich habe ein Problem mit der Funktion FtpDeleteFile aus der WinInet.dll

    Regelmäßig erhalte ich von der Funktion einen Fehler zurück, wenn ich dann aber für die Protokollierung Err.LastDllError abfrage, erhalte ich dort eine 0, was ja bedeutet, dass es eigentlich geklappt hat.

    [highlight=vbNet]
    Module modFTP
    [...]
    Public Function DeleteFTPFile(ByVal FileName As String) As Boolean
    Dim Result As Integer

    Result = FtpDeleteFile(hConnection, FileName)

    If Result = 0 Then
    ShowError("Fehler beim Löschen der Datei '" & FileName & "'.")
    clsLog.LogLine("Fehler beim Löschen der Datei '" & FileName & "' . Fehlercode: " & Err.LastDllError)
    End If

    Return Not (Result = 0)
    End Function
    [...]
    End Module

    Module modMain
    [...]
    Public Sub ShowError(ByVal s As String)
    If session.SILENT Then
    Return
    ElseIf session.TASK Then
    clsLog.LogLine(s)
    Else
    MsgBox(s, MsgBoxStyle.Exclamation, "Fehler")
    End If
    End Sub
    [...]
    End Module

    Public Class clsLog
    Private Const ForAppending As Integer = 8
    Private Const ForWriting As Integer = 2
    Private Const ForReading As Integer = 1
    Private f As Object
    Private writer As Object
    Private mIsOpen As Boolean

    Public ReadOnly Property IsOpen() As Boolean
    Get
    Return mIsOpen
    End Get
    End Property

    Public Sub New()
    f = Nothing
    writer = Nothing
    mIsOpen = False
    End Sub

    Public Function OpenLogFile(ByVal pFilename As String) As Boolean
    Try
    Dim fso As Object = CreateObject("Scripting.FileSystemObject")
    If IO.File.Exists(pFilename) Then
    f = fso.GetFile(pFilename)
    writer = f.OpenAsTextStream(ForAppending)
    Else
    writer = fso.CreateTextFile(pFilename)
    End If

    mIsOpen = True
    Catch e As Exception
    'Me.WriteLine(e.Message)
    If session.Benutzer.IstAdministrator() Then
    ShowError("Fehler beim Öffnen der Protokolldatei:" & e.Message)
    End If
    mIsOpen = False
    'writer.close()
    End Try

    Return mIsOpen
    End Function

    Public Function CloseLogFile() As Boolean
    If writer IsNot Nothing Then writer.Close()
    mIsOpen = False

    Return True
    End Function

    Public Sub WriteLine(ByVal pText As String, Optional ByVal pWithTimeStamp As Boolean = True)
    Dim line As String = session.Benutzer.Partner.PrintVornameNachname & vbTab
    If writer Is Nothing Then Return ' falls Open schiefgelaufen ist

    If pWithTimeStamp Then
    line += Date.Now.ToString()
    line += vbTab
    End If

    line += pText

    writer.WriteLine(line)
    End Sub

    Public Shared Sub LogLine(ByVal pText As String, Optional ByVal pWithTimeStamp As Boolean = True)
    If Not session.IniLogging Then Return
    Dim logInstance As New clsLog()
    If Not logInstance.OpenLogFile(session.IniLogFile) Then Return 'Logging fehlgeschlagen
    logInstance.WriteLine(pText, pWithTimeStamp)
    logInstance.CloseLogFile()
    logInstance = Nothing
    End Sub

    End Class
    [/highlight]

    Ich habe mal die zwischendrin aufgerufenen Funktionen mit aufgeführt, falls die LastDllError auch setzen könnten. session.TASK und session.SILENT sind Boolean-Properties der globalen Instanz session, die frei konfigurierbare Verzeichnispfade, aktuelle Rückmeldungstati usw. verwaltet.

    Ich denke aber die clsLog ist da eher uninteressant in dem Zusammenhang, weil der Parameter Err.LastDllError ja zuerst ausgewertet wird, bevor die Funktion aufgerufen wird.

    Warum der ursprüngliche Programmierer der ftp-Funktionen das Ergebnis von FtpDeleteFile als Integer auswertet, obwohl nach API-Beschreibung eigentlich ein Boolean zurückkommen sollte, weiß ich übrigens auch nicht. Unter der Annahme, dass er sich schon was dabei gedacht hat und dass die Funktion in anderen Programmen auch genauso verwendet wird, habe ich das mal so gelassen. Aber True und False ist ja eh nur die Unterscheidung <>0 oder =0

    Übrigens, wenn ein vernünftiger Fehlercode zurückkommt, erhalte ich den Code 6 (invalid handle), da nehme ich aber an, dass damit der handle auf die Internet-Verbindung gemeint ist einfach nur die Verbindung zwischendrin zusammengebrochen ist oder beendet wurde. Da muss ich aber selbst vorher nochmal im Code suchen (nicht dass ich die in einer vorherigen Funktion selbst beende ), ich erwähne es nur, falls diese Ursache auch die Abfrage von LastDllError beeinflussen könnte...

    Schon mal danke im Voraus und schönes Wochenende
    Martin Dietz

  • #2
    Invalid Handle lässt darauf schliessen, dass sich das ConnectionHandle in einem ungültigen Zustand befindet.

    Bau mal ein Try/Catch um den Aufruf von FTPDeleteFile() und prüfe mit dem Debugger zur Laufzeit den Zustand des Handles...

    so mal als spontaner Einfall...

    Gruss
    Reto

    Comment


    • #3
      Ja, das hatte ich ja gefunden (ich hatte nachdem ich SAP gesagt hatte, wo die Dateien zu finden sind, die Verbindung geschlossen, und damit war sie später, wenn SAP gemeldet hat, dass sie eingehängt sind, nicht mehr verfügbar, um die Dateteien zu löschen), und das war auch nicht das Problem bei der Frage. Es ging darum, dass die DLL einen Fehler zurückgibt, aber nicht sagen kann welcher.

      Trotzdem Danke für die Antwort.

      Grüße
      Martin Dietz

      Comment

      Working...
      X