WIN32_FIND_DATA
Übersicht

SoraBetreff: WIN32_FIND_DATA |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was mache ich diesmal falsch: ![]() Die einzelnen Funktionen an sich funktionieren, nur die Übergabe der Informationen an WIN32_FIND_DATA ist fehlerhaft. Falsche Datentypen oder habe ich irgendwas anderes übersehen? Code: [AUSKLAPPEN] SuperStrict
Extern "win32" Function FindFirstFileA:Int(file:Byte Ptr, data:Byte Ptr) Function FindNextFileA:Int(handle:Int, data:Byte Ptr) Function FindClose:Int (handle:Int) End Extern Local data:WIN32_FIND_DATA = New WIN32_FIND_DATA Local beispiel:String = "C:\Windows\*" Local file:Byte Ptr = beispiel.toCString() Local handle:Int = FindFirstFileA(file, Byte Ptr data) MemFree(file) While FindNextFileA(handle, Byte Ptr data) 'gefundene Dateien ausgeben (print data.xxx ...) Wend FindClose(handle) Type WIN32_FIND_DATA Field dwFileAttributes:Int Field ftCreationTime:FileTimeT Field ftLastAccessTime:FileTimeT Field ftLastWriteTime:FileTimeT Field nFileSizeHigh:Int Field nFileSizeLow:Int Field dwReserved0:Int Field dwReserved1:Int '? Field cFileName:Byte[MAX_PATH] Field cAlternateFileName:Byte[14] End Type Type FileTimeT Field dwLowDateTime:Int Field dwHighDateTime:Int End Type http://msdn.microsoft.com/en-u...s.85).aspx http://msdn.microsoft.com/en-u...S.85).aspx http://msdn.microsoft.com/en-u...S.85).aspx Jemand eine Idee? |
||
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also für Strukturen in einer Struktur kannst du in BlitzMax leider kein Type in Type verwenden. Die Struktur WIN32_FIND_DATA müsste also so aussehen:
Code: [AUSKLAPPEN] Type WIN32_FIND_DATA Field dwFileAttributes:Int Field dwLowDateTime1:Int Field dwLowDateTime2:Int Field dwLowDateTime3:Int Field dwLowDateTime4:Int Field dwLowDateTime5:Int Field dwLowDateTime6:Int 'Field ftCreationTime:FileTimeT 'Field ftLastAccessTime:FileTimeT 'Field ftLastWriteTime:FileTimeT Field nFileSizeHigh:Int Field nFileSizeLow:Int Field dwReserved0:Int Field dwReserved1:Int '? Field cFileName:Byte Ptr = New Byte[MAX_PATH] Field cAlternateFileName:Byte Ptr = New Byte[14] End Type Trotzdem funktioniert es aus einem mir unbegreiflichen Grund nicht, den Dateinamen zu erhalten. Ich habe mich im Internet umgeschaut und die Struktur (Also die darin verwendeten Datentypen) muss so einfach stimmen. Ist mir ein Rätsel wieso das nicht klappt. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
Sora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: für Strukturen in einer Struktur kannst du in BlitzMax leider kein Type in Type verwenden.
Oh, das wusste ich nicht, danke. ![]() Zitat: Ist mir ein Rätsel wieso das nicht klappt.
Mir auch, nur data.dwFileAttributes liefert richtige Ergebnisse, alles andere ist "Müll", oder liefert teils sogar Memory Fehler.. Wenn ich die Funktionen in C schreibe und dann in Bmax einbinde, funktioniert es einwandfrei, dies möchte ich aber erst mal nur als Notlösung ansehen, denn es solle ja eigentlich auch so gehen.. |
||
![]() |
Suco-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich habe jetzt einfach mal einen Dateipfad für FindFirstFile angegeben und er gibt mir mit data.nFileSizeLow auch die richtige Größe der Datei aus. Das bedeutet, dass die Struktur wie ich sie oben postete bis einschließlich nFileSizeLow:Int korrekt aufgebaut sein muss(Von den Datentypen her). Die Frage ist, was danach falsch läuft denn ich tippe einfach mal darauf dass er bei cFilename einfach die falsche Startadresse hat und deswegen einen Fehler verursacht/keine Daten erhalten kann.
Hoffe mal Mark hat da im laufe der Updates nicht heimlich was dran rumgefummelt, anders könnte ich es mir im Grunde aber auch nicht erklären. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
Sora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, schon merkwürdig, vor allem auch, weil der Zugriff auf cFileName komplett gesperrt wird....naja habe die Funktionen jetzt komplett in C nachgeschrieben, so funktioniert es immerhin problemlos.
Danke für deine Mühe. ![]() |
||
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich denke wenn es um solche Dinge geht bist du mit einem C-Workaround am besten bedient, da kannst du nichts falsch machen.
Mich würde aber trotzdem mal interessieren wieso das nicht funktioniert, das stört mich doch ein wenig. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Suco-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, ich nochmal. Solltest du noch eine C-Alternative suchen, hier eine andere Variante:
Code: [AUSKLAPPEN] Strict Extern "win32" Function FindFirstFile(path$z, data:Byte Ptr)="FindFirstFileA@8" Function FindNextFile(handle:Int, data:Byte Ptr)="FindNextFileA@8" End Extern Function FindFile_GetFilename:String(buf:Byte Ptr) Return String.fromCString(buf+44) End Function Local ffBuf:Byte Ptr, handle:Int ffBuf = MemAlloc(320) handle = FindFirstFile("c:\*", ffBuf) While(FindNextFile(handle, ffBuf)<>0) Print FindFile_GetFilename(ffBuf) Wend MemFree(ffBuf) Es wird auf Types verzichtet und einfach der benötigte Speicher der Struktur reserviert. Danach hole ich einfach die Adresse der gewünschten Struktur-Variable durch Startpointer+index und schon klappt das ganze. Zwar nicht so praktisch wie es mit Types wäre, aber funktioniert. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
Sora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schön, danke. ![]() Da ich meine "Variante" nun schon fertig habe, lass ich es dabei. Falls so ein Problem aber noch mal auftauchen sollte, werde ich sicher zu deiner Lösung greifen. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group