Seite 1 von 1

Purebasic 3.94, FTP Fehler auslesen

Verfasst: 06.02.2008 10:01
von manibaerchen
Hallo Zusammen,

ich habe ein Programm mit Purebasic 3.94 geschrieben, da
dies schon sehr oft im Einsatz ist, ist ein Umstieg auf 4 derzeit nicht
möglich.
Aber hier meine Frage, das Program arbeitet mit FTP
also z.B: FtpSetCurrentDirectory_ etc und
ich bekomme bei z.b. dieser Funktion teilweise "FALSE" zurück.
D.h. es geht nicht.
Gibt es eine Möglichkeit den realen Fehler, den man hier bekommt
irgendwie auszulesen ?????

Danke

Mani

Re: Purebasic 3.94, FTP Fehler auslesen

Verfasst: 06.02.2008 10:08
von Kiffi
manibaerchen hat geschrieben:D.h. es geht nicht.
da wäre ich mir nicht so sicher. Viele API-Funktionen liefern eine 0 zurück,
wenn alles geklappt hat. Hierfür gibt's auch eine Konstante: #S_OK

Grüße ... Kiffi

Verfasst: 06.02.2008 17:45
von Shardik
API-Fragen lassen sich am besten klären, indem man in Google den Namen der API-Funktion (FtpSetCurrentDirectory) eingibt und in der Fundliste dann den entsprechenden Microsoft-Link anklickt: :roll:
MSDN hat geschrieben:ReturnValue
Returns TRUE if successful, or FALSE otherwise. To get a specific error message, call GetLastError. If the error message indicates that the FTP server denied the request to change a directory, use InternetGetLastResponseInfo to determine why.
Und mit dieser Prozedur ermittle ich in meinem FTP-Programm die Windows API-Fehlermeldung:

Code: Alles auswählen

Procedure.S GetWinAPIErrorMsg()
  ErrorCode.L
  ErrorMsg.S
  ErrorMsgBuffer.S
  ErrorMsgLength.L
  ModuleHandle.L

  ErrorCode = GetLastError_()

  If ErrorCode = 0
    ProcedureReturn #CR$ + #CR$ + "Der Windows-Aufruf GetLastError() lieferte keinen Fehlercode!"
  EndIf

  If ErrorCode = #ERROR_INTERNET_EXTENDED_ERROR
    InternetGetLastResponseInfo_(@ErrorCode, 0, @ErrorMsgLength)

    ; ----- Achtung! ErrorCode wurde durch InternetGetLastResponseInfo() auf
    ;       Null gesetzt und muß wieder restauriert werden!

    ErrorCode = #ERROR_INTERNET_EXTENDED_ERROR

    If ErrorMsgLength= 0
      ProcedureReturn #CR$ + #CR$ + "Die Ermittlung der Puffergröße beim Windows-Aufruf InternetGetLastResponseInfo() ist gescheitert!"
    EndIf

    ErrorMsgBuffer = Space(ErrorMsgLength + 1)
  Else
    ErrorMsgBuffer = Space(255)
    ErrorMsgLength = Len(ErrorMsgBuffer) - 1
  EndIf

  If ErrorCode = #ERROR_INTERNET_EXTENDED_ERROR Or ErrorCode = #ERROR_INVALID_WINDOW_HANDLE
    If InternetGetLastResponseInfo_(@ErrorCode, @ErrorMsgBuffer, @ErrorMsgLength) = #False
      ProcedureReturn #CR$ + #CR$ + "Die Abfrage der Fehlerbeschreibung beim Windows-Aufruf InternetGetLastResponseInfo() ist gescheitert!"
    Else
      If ErrorMsgLength > 0
        ErrorMsg = "FTP-Log:" + #CR$ + Left(ErrorMsgBuffer, ErrorMsgLength)
      Else
        ProcedureReturn #CR$ + #CR$ + "Der Windows-Aufruf InternetGetLastResponseInfo() gab keinen Fehlertext zurück!"
      EndIf
    EndIf  
  ElseIf ErrorCode >= 12000 And ErrorCode <= 12174
    ModuleHandle = GetModuleHandle_("WinInet.DLL")

    If ModuleHandle = 0
      ProcedureReturn #CR$ + #CR$ + "Der Windows-Aufruf GetModuleHandle() für die Windows-Bibliothek WinInet.DLL ist fehlgeschlagen!"
    EndIf

    ErrorMsgLength = FormatMessage_(#FORMAT_MESSAGE_FROM_HMODULE, ModuleHandle, ErrorCode, GetUserDefaultLangID_(), @ErrorMsgBuffer, @Len(ErrorMsgBuffer), 0)
  Else
    ErrorMsgLength = FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM | #FORMAT_MESSAGE_IGNORE_INSERTS | #FORMAT_MESSAGE_MAX_WIDTH_MASK, 0, ErrorCode, GetUserDefaultLangID_(), @ErrorMsgBuffer, @Len(ErrorMsgBuffer), 0)
  EndIf

  If ErrorMsgLength = 0
    ErrorMsg = "Windows-Fehlernummer von GetLastError(): " + Str(ErrorCode) + #CR$ + "Die Textumsetzung der Fehlermeldung mit FormatMessage() ist gescheitert!"
  Else
    If Left(ErrorMsg, 8) <> "FTP-Log:"
      ErrorMsg = "Windows-Fehlernummer von GetLastError(): " + Str(ErrorCode) + #CR$ + "Windows-Fehlermeldung: " + Left(ErrorMsgBuffer, ErrorMsgLength)
    EndIf
  EndIf

  ProcedureReturn #CR$ + #CR$ + ErrorMsg
EndProcedure