title image


Smiley Funktion, die absoluten Pfad zurückgibt
Option Explicit' Die hier vorgestellte Deklaration weicht von dem Original in Win32Api.txt ab.' Dort steht:' ...' ByVal lpBuffer as String,' ...' Warum, wird im Code erläutert. Private Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" _( _ ByVal lpFileName As String, _ ByVal nBufferLength As Long, _ lpBuffer As Byte, _ lpFilePart As Long _) As Long Public Function AbsolutePath(VirtuellerPfad As String, AusgangsAdresse As String) As String Dim nBufferLength As Long Dim bBuffer() As Byte Dim lpFilePart As Long Dim sBuffer As String On Error GoTo Err_Function  'Größe des benötigten Buffers feststellen: nBufferLength = GetFullPathName(AusgangsAdresse, 0&, 0&, 0&) ' Wenn ein Fehler auftritt, wird als Ergebnis 0 zurückgegeben. ' Sonst gibt bBufferLength die Größe des benötigten Buffers an.  If nBufferLength Then ' bei Erfolg:  ' Buffer in passender Größe bereitstellen: ReDim bBuffer(nBufferLength + 1)  ' kompletten Pfad von AusgangsAdresse holen: nBufferLength = GetFullPathName(AusgangsAdresse, nBufferLength, bBuffer(0), lpFilePart)  If nBufferLength Then ' bei Erfolg: ' Jetzt kommt der Grund, warum ich in meinem Beispiel keinen String, ' sondern ein Byte-Array verwende: ' Laut WinAPI - Dokumentation enthält lpFilePart einen Zeiger, der auf den File-Anteil ' im C-String lpBuffer zeigt. ' Hätten wir hier einen String verwendet, hätte Visual Basic automatisch eine Kopie des ' Strings (im Unicode - Format) zurückgegeben, so daß wir mit diesem Zeiger nichts mehr hätten anfangen könnten. ' Dadurch, daß wir ein Byte-Array verwenden, haben wir diese Hilfe, die uns hier nur stört, ' ausgeschaltet. ' Die undokumentierte Funktion VarPtr gibt uns in VB den Wert des Zeigers von bBuffer(0) zurück, ' er zeigt also auf das erste Zeichen. ' Wir müssen jedoch aus dem Rückgabewert ' AusgangsAdresse="http://www.test.com/1dir/2dir/index.html" ' Nur den PFAD extrahieren: "http://www.test.com/1dir/2dir/" ' Dazu ermitteln wir die Länge der Pfadangabe aus der Differenz der Zeiger ' auf den Dateianteil und dem kompletten Pfad-String und weisen nur diesen Teil ' mit der Left$() - Funktion unserem Buffer zu. ' Da wir den "Service" von VB nicht nutzen, müssen wir den String selber nach Unicode konvertieren sBuffer = Left$(StrConv(bBuffer, vbUnicode), (lpFilePart - VarPtr(bBuffer(0))))  ' An diesen Buffer fügen wir dann den Wert ' virtuellePfad="../../dir/zz.html" ' hinzu, so daß sich ergibt: ' sBuffer = "http://www.test.com/1dir/2dir/../../dir/zz.html" sBuffer = sBuffer & VirtuellerPfad  ' mit diesem neuen Buffer machen wir nun das gleiche Spiel noch einmal: nBufferLength = GetFullPathName(sBuffer, 0&, 0&, 0&) If nBufferLength Then ' Bei Erfolg: ReDim bBuffer(nBufferLength + 1) nBufferLength = GetFullPathName(sBuffer, nBufferLength, bBuffer(0), lpFilePart) If nBufferLength Then ' Bei Erfolg: ' Wir müssen hier nichts mehr abschneiden und können den gesamten Rückgabewert ' als Funktionsergebnis verwenden. AbsolutePath = Left$(StrConv(bBuffer, vbUnicode), nBufferLength) Else AbsolutePath = "# FEHLER: virtuellerPfad """ & sBuffer & """ ungültig #" End If Else AbsolutePath = "# FEHLER: virtuellerPfad """ & sBuffer & """ ungültig #" End If Else AbsolutePath = "# FEHLER: Ausgangsadresse """ & AusgangsAdresse & """ ungültig #" End If Else AbsolutePath = "# FEHLER: Ausgangsadresse """ & AusgangsAdresse & """ ungültig #" End If Exit_Function: Exit Function Err_Function:On Error Resume Next AbsolutePath = "# FEHLER #"End FunctionAnmerkungen: Ich habe in diesem Beispiel im Fehlerfall dem Rückgabewert einen String zugewiesen, was in VB nicht üblich ist.Besser wäre es, mitErr.Raise einen entsprechenden Laufzeitfehler zu signalisieren.Viel Erfolg!Thomas Prötzschcu
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: