Autor | Thema: Findfirst über API | | Datum:26.07.02 16:24 
(mohrbringfried@web.de) | |
Hallo,
ich nutze in einem Programm FindFirst über API. Hierzu habe ich einen Bereich mit Struct definiert, in dem u.a. das Erstellungsdatum enthalten ist, aber leider bekomme ich dieses irgendwie nicht in eine nutzbare Form. Die Struktur sieht wie folgt aus :
Struct LPWIN32_FIND_DATA = dwFileAttributes&,ftCreationTime#(8), ftLastAccessTime#(8),ftLastWriteTime#(8), nFileSizeHigh&,nFileSizeLow&,dwReserved0&,\dwReserved1&,cFileName$(259),cAlternateFileName$(14) !
In glaube, ich muß die Daten erst noch umwandeln, aber wie ???
Ich muß noch dazu sagen, bei API-Programmierung stehe ich noch am Anfang. Der andere Teil des Progamms klappt wunderbar, aber der zweite Teil macht mir halt Kopfzerbrechen.
Ich bin also für alle Hinweise offen !
Bringfried
|
| | Datum:28.07.02 09:45 
(g.putschalka@utanet.at) | |
Hallo Bringfried,
(gibts den Namen wirklich?)
hier ist ein Beispiel für die API Aufrufe.
Da ich Profan 6.6 verwende konnte ich keine Strukturen über die Bereichsvariablen legen. Es sollte aber kein Problem sein diese zu definieren.
' Beispiel für FindFirstFile und FindNextFile. Für Profan 6.6
' Gerhard Putschalka 28.7.2002 g.putschalka@utanet.at (oder g.putschalka@web.de)
Declare Datei$,Ret&,Hndl&,Found$
Declare Ar1#,Ar2#
DEF FFind(2) ! "KERNEL32.DLL","FindFirstFileA"
DEF FNext(2) ! "KERNEL32.DLL","FindNextFileA"
DEF FClose(1) ! "KERNEL32.DLL","FindClose"
Dim Ar1#,256 ' muß lang genug sein um die Suchmaske (+1 Stelle) aufzunehmen
Dim Ar2#,256 ' die Länge 256 sollte genügen
' verschiedene Suchmasken
Datei$ = "C:\\Windows\\*.bmp"
'Datei$ = "C:\\Windows\\D*.*"
'Datei$ = "C:\\Windows\\D?e*.*"
Print "Suchbegriff:",Datei$
Print
' setze den Suchbegriff in die Bereichsvariable für FindFirst
String Ar1#,0 = Datei$
' suche erste Datei (nicht gefunden: Handle ist 0)
Hndl& = @FFind(Ar1#,Ar2#) ' return ist der Handle
Ret& = Hndl&
' Schleife solange Ret& > 0 (solange was gefunden wird)
While (Ret& > 0)
Print @String$(Ar2#,44)
' suche nächste Datei entsprechend der Suchmaske
Ret& =@FNext(Hndl&,Ar2#)
EndWhile
' FindFirst-Handle wieder schließen
@FClose(Hndl&)
Dispose Ar1#
Dispose Ar2#
Print
Print "Ende mit linker Maustaste oder Enter"
WaitInput
End
Ich weiß nicht welche API Kenntnisse Du hast, daher noch folgende Informationen.
In der API Doku (Win32.hlp) findest Du keinen Hinweis, daß die Aufrufe nicht FindFirstFileA (bzw. FindFirstFileW) und FindNextFileA (bzw. FindNextFileW) lauten. Normalerweise wird A und nicht W benutzt.
Die verwendeten Parameterlisten sind:
für FindFirstFileA
HANDLE FindFirstFile(
LPCTSTR lpFileName, // pointer to name of file to search for
LPWIN32_FIND_DATA lpFindFileData // pointer to returned information
);
für FindNextFileA
BOOL FindNextFile(
HANDLE hFindFile, // handle to search (found with FindFirstFileA)
LPWIN32_FIND_DATA lpFindFileData // pointer to structure for data on found file
);
in Profan wird, immer wenn "pointer" angegeben ist, eine Bereichsvariable benutzt. Ist dagegen, wie hier, "handle" angegeben wird eine LongInteger Variable benutzt.
Die Struktur (die Aufteilung) der Bereichsvariablen für "lpFindFileData" sieht so aus:
typedef struct _WIN32_FIND_DATA { // wfd
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA;
alle DWORDs sind LongIntegers (4-Bytes). TCHAR sind Strings, wobei hier die Länge nicht genau festgelegt ist. FILETIME sind eigene Strukturen mit je 8-Bytes.
Daher ergibt sich, daß der gefundene Dateiname ab Stelle 45 gesetzt wird (4 + 8 + 8 + 8 + 4 + 4 + 4 + 4). Da bei Bereichsvariablen die erste Stelle mit 0 adressiert wird, ist der Dateiname daher auf Adresse 44 zu finden.
Ich hoffe, Du kommst damit weiter.
Für weitere Fragen schreib mir.
Mfg.
Gerhard.
|
| |
|