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
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
Comment