Problem mit WinAPI-Struktur

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Problem mit WinAPI-Struktur

BeitragMo, Mai 03, 2010 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich versuche gerade diese Struktur:
Code: [AUSKLAPPEN]
typedef struct tagMODULEENTRY32 {
  DWORD dwSize;
  DWORD th32ModuleID;
  DWORD th32ProcessID;
  DWORD GlblcntUsage;
  DWORD ProccntUsage;
  BYTE *modBaseAddr;
  DWORD modBaseSize;
  HMODULE hModule;
  TCHAR szModule[MAX_PATH];
  TCHAR szExePath[MAX_PATH];
  DWORD dwFlags;
} MODULEENTRY32, *PMODULEENTRY32, *LPMODULEENTRY32;


In einen BM-Type zu quetschen. Allerdings will es mir nicht gelingen, die "Strings" szModule und szExePath in den Type einzulagern:
BlitzMax: [AUSKLAPPEN]
Type MODULEENTRY323
Field dwSize:Int=551
Field th32ModuleID:Int
Field th32ProcessID:Int
Field GlblcntUsage:Int
Field ProccntUsage:Int
Field modBaseAddr:Int
Field modBaseSize:Int
Field hModule:Int
Field szModule:Byte' Ptr=MemAlloc(255)
Field szExePath:Byte Ptr=MemAlloc(260)
Field dwFlags:Int
End Type

So versuche ich momentan. Es ist eigentlich auch logisch, dass das so nicht funktionieren kann. Aber wie kann ich diese String sonst in einem Type einbetten? Klar würde es auch mit einem reinen MemAlloc(551) gehen, aber ich möchte die Komfortabilität der Types genießen können. Bei einfach Strukturen, wie der POINTAPI klapp es ja wunderbar. Das sind halt auch keine Strings. Wäre cool wenn das irgendwie geht . Wenn nicht, dann muss ich es nur mit MemAlloc machen. Damit geht es.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

#Reaper

Newsposter

BeitragMo, Mai 03, 2010 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn das BM-Type zu den C/C++ Structs kompatibel sein soll, dann musst du natürlich auch die Datentypen genau beachten. Alle weiß ich nun nicht genau, aber DWORD ist ein Short (16 bit), ein Byte* ein Pointer auf einen Byte (also Byte Ptr), HMODULE musst du nachschauen (scheint ein Struct in einem Struct zu sein, musst es dir mal anschauen, kA) und TCHAR ist (meine ich) ein einfaches Byte-Array. MemAlloc funktioniert da nicht, da es dann nur ein Pointer auf den Memory-Block wäre.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Der Eisvogel

BeitragDi, Mai 04, 2010 6:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh, Also mit diesen Größenangaben, also immer Int hat es mit MemAlloc funktioniert. Wenn ich diese Struktur in einem VB-Bereich suche, bekomme ich als Ergebnis auch eine Struktur mit Ints. Es wäre meiner Meinung nach sinnlos da etwas anderes zu machen, da die Zahlen die da rein müssen Ints sind. Short geht da nicht. Aber danke für den Hinweis. Ich werde das gleich mal ausprobieren.

EDIT: Also ich habe das mit dem DWORD jetzt nochmal nachgeschaut. Das ist schon ein 32 Bit Wert (siehe hier). Auch HMODULE entspricht einem 32 Bit Wert. Ich hab jetzt modBaseAddr in eine Pointer umgewandelt brachte aber nix. Ich habe aus den 2 String Byte-Array gemacht, hilft aber leider auch nicht. Wenn ich dort dann drauf zugreifen will, bekomme ich immer die schöne Meldung EXCEPTION_ACCESS_VIOLATION. Diese Meldung kenne ich nur von ungeschützen Speicherzugriffen, vorher ist mir diese noch nie begegnet. Ich denke mal, dass hat aber nicht mit damit zu tun oder?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Noobody

BeitragDi, Mai 04, 2010 10:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Strings werden dort explizit als Char-Array konstanter Grösse definiert, weswegen sie zur Grösse der Struktur hinzuzählen. Das Array nimmt also nicht nur 4 Bytes ein (Zeiger zum ersten Element) wie in BMax, sondern ist Teil der Struktur. Beide Arrays zusammen nehmen also nochmal MAX_PATH*2 zusätzliche Bytes ein.

Einen Type mit Arrays zu 'vergrössern' geht in BMax leider nicht, da Arrays dort immer Referenzen zu Speicherblöcken auf dem Heap sind (immer 4 Bytes). Du kannst also entweder so viele Fields hinzufügen, dass sie die Arrays ersetzen (was je nach Grösse von MAX_PATH ziemlich unpraktikabel wird), oder du musst wohl oder übel jedesmal, wenn ein Zeiger auf das Struct verlangt wird, einen Speicherblock (MemAlloc) in passender Grösse angeben und die Werte nachträglich in den Type übertragen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Der Eisvogel

BeitragDi, Mai 04, 2010 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Danke. Dann werde ich mir jetzt die Funktionen wrappen.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group