WinApi: __out LPRECT lpRect

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

das wurgel

Betreff: WinApi: __out LPRECT lpRect

BeitragFr, Mai 13, 2011 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Extern "Win32"
   Function WINAPI_GetWindowRect:Int(hwnd:Int, lpRect:Byte Ptr Var)="GetWindowRect@8"
End Extern


Jetzt kriege ich bei lpRect zwar einen Pointer zurück, wenn ich ihn aber versuche durch indexen zu dereferenzieren, kommt eine Meldung "EXEPTION_ACESS_VIOLATION". Wie komm ich daran? Kann man das irgendwie mit ner Bank machen oder so?
1 ist ungefähr 3

mpmxyz

BeitragFr, Mai 13, 2011 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe zwar keine so große Ahnung, woran es nun wirklich liegt, aber hier ein paar Anregungen:
Funktioniert "Byte Ptr Var"? Teste einmal "Byte Ptr Ptr"! (Denke daran, dass die Byte-Pointer-Variable mit "Varptr" übergeben wird!)
Das, was da zurückgegeben wird, hat diese Struktur:
Code: [AUSKLAPPEN]
typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;

Deklariere einen entsprechenden Extern-Type. (Es wäre zumindest einen Versuch wert.)
Eine andere potentielle Fehlerquelle: Wie liest du die Daten aus?
Ansonsten fällt mir gerade nichts ein.
mfG
mpmxyz
PS: Banks sind in BlitzMax im Gegensatz zu BB/B3D übrigens keine Wundermittel mehr, sondern einfach nur Objekte mit einem Byte-Pointer. Wink
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

das wurgel

BeitragFr, Mai 13, 2011 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Extern "Win32"
   Function WINAPI_FindWindow:Int(lpClassName:Byte Ptr, lpWindowName:Byte Ptr)="FindWindowA@8"
   Function WINAPI_GetWindowRect:Int(hwnd:Int, lpRect:Byte Ptr Ptr)="GetWindowRect@8"
End Extern

Local hWnd% = WINAPI_FindWindow(Null, "Rechner")

Print Hex(hWnd)Local lpRect:Byte Ptr

WINAPI_GetWindowRect(hWnd, Varptr lpRect)

Print Hex(Int(lpRect))
Print lpRect[0] ' EXEPTION_ACESS_VIOLATION


Jetzt bekomme ich einen Pointer auf einen Pointer der beim indexen eine Fehlermeldung macht. Ich dachte ich könnte auf diese Weise die Werte aus der Rect-Struktur auslesen.
1 ist ungefähr 3

mpmxyz

BeitragFr, Mai 13, 2011 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir hatten einen Denkfehler: structs werden an Ort und Stelle gespeichert.
Ein Pointer auf eine struct-Variable ist demnach ein Pointer auf einen Speicherbereich.
BlitzMax: [AUSKLAPPEN]
Strict
Extern "Win32"
Function WINAPI_FindWindow:Int(lpClassName:Byte Ptr, lpWindowName:Byte Ptr)="FindWindowA@8"
Function WINAPI_GetWindowRect:Int(hwnd:Int, lpRect:Int Ptr)="GetWindowRect@8"
End Extern

Local hWnd% = WINAPI_FindWindow(Null, "Rechner")

Print Hex(hWnd)
Local lpRect:Int Ptr=Int Ptr(MemAlloc(16))

WINAPI_GetWindowRect(hWnd, lpRect)

Print Hex(Int(Byte Ptr(lpRect)))
Print lpRect[0]
Print lpRect[1]
Print lpRect[2]
Print lpRect[3]
MemFree(lpRect)

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

das wurgel

BeitragSa, Mai 14, 2011 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke mpmxyz! Jetzt verstehe ich meinen Fehler.
1 ist ungefähr 3

Suco-X

Betreff: .....

BeitragSa, Mai 14, 2011 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.


Sowas wie in dem Beispiel unten geht natürlich auch. Sieht vielleicht etwas sauberer aus.

Code: [AUSKLAPPEN]

Strict

Extern "Win32"
   Function WINAPI_FindWindow:Int(lpClassName:Byte Ptr, lpWindowName:Byte Ptr)="FindWindowA@8"
   Function WINAPI_GetWindowRect:Int(hwnd:Int, lpRect:Byte Ptr)="GetWindowRect@8"
   Function WINAPI_Desktop()="GetDesktopWindow@0"
End Extern

Type TRect
   Field x:Int
   Field y:Int
   Field w:Int
   Field h:Int
End Type

Local hWnd:Int = WINAPI_Desktop()
Local rect:TRect = New TRect

WINAPI_GetWindowRect(hWnd, Byte Ptr(rect))

Print rect.x
Print rect.y
Print rect.w
Print rect.h



Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

das wurgel

BeitragSo, Mai 15, 2011 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass BlitzMax-Types dazu kompatibel sind wusste ich garnicht.
Noch ein paar Fragen: Woher weiß ich, dass ein LONG ein 32bit Integer ist? Kann ich davon ausgehen, dass das immer so ist? Wo finde ich die Header-Datei, in der das definiert ist?
1 ist ungefähr 3

Thunder

BeitragSo, Mai 15, 2011 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier sind die Definitionen der Typen, die auf msdn verwendet werden: http://msdn.microsoft.com/en-u...85%29.aspx

LONG ist wahrscheinlich deshalb 32 Bit lang, weil der gleichnamige C Typ long auch 32 Bit lang ist.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group