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 FunctionDas 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: