WIN32_FIND_DATA

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Sora

Betreff: WIN32_FIND_DATA

BeitragDo, Apr 09, 2009 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mache ich diesmal falsch: Rolling Eyes

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-X

Betreff: ....

BeitragDo, Apr 09, 2009 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 09, 2009 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
für Strukturen in einer Struktur kannst du in BlitzMax leider kein Type in Type verwenden.

Oh, das wusste ich nicht, danke. Wink

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-X

Betreff: .....

BeitragDo, Apr 09, 2009 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 11, 2009 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

Suco-X

Betreff: ......

BeitragSa, Apr 11, 2009 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: .....

BeitragSa, Apr 11, 2009 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 12, 2009 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön, danke. Wink
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group