Das Problem:
Die Lösung:
Der Lösungsweg:
Declare Function Declare32 Lib "call32.dll" (ByVal Func As String, ByVal Library As String, ByVal Args As String) As Long Declare Sub FreeCall32IDs Lib "call32.dll" ()Die call32.dll sollte z.B. zusammen mit vb.exe in einem Verzeichnis oder in den System-Verzeichnissen %windir%\system bzw. %windir%\system32 stehen.
, ByVal lngdAdditionalAufrufId As Long erweitert.
Declare Function GetFileAttributesA Lib "kernel32.dll" (ByVal lpFileName As String) As LongDiese Funktion ist wie folgt anzupassen (Aufruf gegen call32.dll, Parameter-Erweiterung):
Declare Function GetFileAttributesA Lib "call32.dll" Alias "Call32" (ByVal lpFileName As String, ByVal lngdAdditionalAufrufId As Long) As Long
lngAufrufId = Declare32 ("GetFileAttributesA", "kernel32", "p")
Hier wird die API-Prozedur GetFileAttributesA aufgerufen, die in der Bibliothek kernel32 zu finden ist
und es erfolgt die Parametertypen-Ankündigung p, die besagt, daß es sich um einen Pointer-Typ handelt.
lngReturnValue = GetFileAttributesA (sDateiname, lngAufrufId)
FreeCall32IDs
Innerhalb einer solchen Routine können die Rückgabewerte der angesprochenen API-Funktionen nach Bedarf verarbeitet werden.
Zu beachten:
Ein Beispiel:
Declare Function Declare32 Lib "call32.dll" (ByVal Func As String, ByVal Library As String, ByVal Args As String) As Long Declare Sub FreeCall32IDs Lib "call32.dll" () Declare Function GetFileAttributesA Lib "call32.dll" Alias "Call32" (ByVal lpFileName As String, ByVal lngdAdditionalAufrufId As Long) As Long
Und hier die Funktion Exists_File32(), die auf eine wiederum gekapselte Funktion GetFileAttributesA_Call32() zurückgreift:
Function Exists_File32 (sFile As String) As Integer
On Error GoTo err_Exists_File32
' **** Beherrscht dank call32 lange Pfad- wie auch Dateinamen. ****
Dim iRet As Integer
If GetFileAttributesA_Call32 (sFile) > 0 Then
iRet = True
End If
Exists_File32 = iRet
Exit Function
err_Exists_File32:
Fehler "Exists_File32"
Exit Function
End Function
Das stützt sich leicht mißbrauchend auf die 32-Bit-API-Funktion GetFileAttributes:
Function GetFileAttributesA_Call32 (sFile As String) As Long
On Error GoTo err_GetFileAttributesA_Call32
Dim lngAufrufId As Long
lngAufrufId = Declare32("GetFileAttributesA", "kernel32", "p")
' **** Alle erforderlichen sowie die call32-Aufruf-Id als zusätzlichen Parameter ****
GetFileAttributesA_Call32 = GetFileAttributesA(sFile, lngAufrufId)
exit_GetFileAttributesA_Call32:
FreeCall32IDs ' DLL-Aufruf-Speicher aufräumen
Exit Function
err_GetFileAttributesA_Call32:
Fehler "GetFileAttributesA_Call32"
If Err = 53 Then ' evtl. entspricht das aktuelle Arbeitsverzeichnis
Beep ' nicht dem Anwendungs-Verzeichnis, z.B. bei manuellem Start.
MsgBox "Bitte starten Sie die Anwendung auf die dafür vorgesehene Weise.", 64, "GetFileAttributesA_Call32"
Exit Function
End If
Resume exit_GetFileAttributesA_Call32
End Function
Der Download: