Pointer auf Type an Funktion übergeben [Error-Code 1813]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Der Eisvogel

Betreff: Pointer auf Type an Funktion übergeben [Error-Code 1813]

BeitragMi, Dez 31, 2008 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich habe folgendes Probelm:
Ich möchte einen Pointer auf ein Type-Feld an eine Funktion übergeben:
Code: [AUSKLAPPEN]
Type pointertype
'Fields
End Type

Local pt:pointertype=New pointertype

Funktion(Varptr pt)

Function Funktion(pointertotype:int ptr)
'code
End Function


Aber irgendwie klappt das nicht. Er spuckt keine Fehlermeldug aus, aber macht auch nix. Ich brauche das, um eine API-Funktion aufrufen zu können. Sie verlangt nämlich einen Pointer auf eine Struktur.
Wies jmd was ich falsch mache und wie man es richtig macht?

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.
  • Zuletzt bearbeitet von Der Eisvogel am Mi, Dez 31, 2008 23:50, insgesamt 2-mal bearbeitet

BtbN

BeitragMi, Dez 31, 2008 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du wirst keine BMax-Typen angeben können, weil diese einen internen overhead haben, der es unmöglich macht für eine C-Funktion dort etwas hineinzuschreiben ohne dein Programm zum absturz zu bringen.

Der Eisvogel

BeitragMi, Dez 31, 2008 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Soll ich das dann wie in BB auch schon mit Banken machen?
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.

BtbN

BeitragMi, Dez 31, 2008 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde einfach speicher allocieren der genau so groß wie die Struktur ist, und dann die struktur-daten daraus auslesen. Angeblich kann man auch Types nehmen, wenn diese in einem Extern-Block definiert sind. Allerdings hatte ich damit bis jetzt nicht sonderlich viel erfolg.

Der Eisvogel

BeitragMi, Dez 31, 2008 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss ich das jetzt verstehen?
Kannst du mir nen Beispiel geben, wie du das jetzt meinst?

EDIT: Un wenn ich das in Extern setzte, dann kann ich ja kein New mehr benutzen, wie muss ich das denn dann machen, also einen neuen Type-Eintrag machen?
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.
 

ChristianK

BeitragMi, Dez 31, 2008 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Types, die in Extern-Blöcken deklariert werden, müssen mit C(++)-Funktionen erstellt und gelöscht werden, die ebenfalls Extern deklariert werden. Ein Beispiel dazu ist in den BlitzMax Docs drin.
Für WinAPI-Funktionen reicht es aber, Byte Ptr für den Typ anzugeben. BlitzMax übergibt dann automatisch einen Zeiger auf die eigentlichen Daten des Types.
Übrigens sind Type-Handles schon Zeiger, d.h. du brauchst kein Varptr zu verwenden:

Code: [AUSKLAPPEN]
Type TPointerType
   ' ...
End Type

Local pt:TPointerType = New TPointerType
Funktion(pt)

Function Funktion(x:TPointerType)
   ' ...
End Function
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Der Eisvogel

BeitragMi, Dez 31, 2008 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie geht es aber nicht. Die Funktion macht zwar etwas, aber nicht das, was sie machen sollte.
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.

Suco-X

Betreff: ....

BeitragMi, Dez 31, 2008 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt relativ viele Möglichkeiten. Habe dir einfach mal 3 Beispiele zu der WinAPI Funktion "GetCursorPos" gemacht. Diese Funktion gibt dir die Mauskoordinaten(Vom Desktop) aus und erwartet als übergabe eine Struktur namens Point mit den Werten x und y.

Type Variante:
Code: [AUSKLAPPEN]

Strict

Type TPoint
   Field x:Int, y:Int
End Type

Extern "win32"
   Function GetCursorPos(lpPoint:Byte Ptr)
End Extern

Graphics 800,600,0

Local mouseCoords:TPoint = New TPoint

Repeat
   Cls

   GetCursorPos(mouseCoords)
   
   DrawText "MouseX: "+mouseCoords.x, 10,0
   DrawText "MouseY: "+mouseCoords.y, 10, 30

   Flip
Until KeyHit(KEY_ESCAPE)



Variante mit dem reservieren vom Speicher
Code: [AUSKLAPPEN]

Strict

Extern "win32"
   Function GetCursorPos(lpPoint:Byte Ptr)
End Extern

Graphics 800,600,0

Local mem:Byte Ptr = MemAlloc(8)

Repeat
   Cls

   GetCursorPos(mem)
   
   DrawText "MouseX: "+Int Ptr(mem)[0], 10,0
   DrawText "MouseY: "+Int Ptr(mem)[1], 10, 30

   Flip
Until KeyHit(KEY_ESCAPE)


Und die letzte Variante, Banks.
Code: [AUSKLAPPEN]

Strict

Extern "win32"
   Function GetCursorPos(lpPoint:Byte Ptr)
End Extern

Graphics 800,600,0

Local bank:TBank = CreateBank(8)

Repeat
   Cls

   GetCursorPos(BankBuf(bank))
   
   DrawText "MouseX: "+PeekInt(bank,0), 10,0
   DrawText "MouseY: "+PeekInt(bank,4), 10, 30

   Flip
Until KeyHit(KEY_ESCAPE)


Das mit den Types klappt nur wenn du dich an die richtigen Datentypen hälst und bei Strukturen die wiederrum Strukturen erwarten wird es etwas komplizierter.

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

Der Eisvogel

BeitragMi, Dez 31, 2008 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt gehts, aber ich weiß nicht, was ich ich vorher anders hatt, war bestimmt irgendein bescheuerter Fehler. Danke euch 3en.

EDIT: Geth doch nicht. Also sagen wir es so, es geht halb. Alle Ints von dem Type gehen, aber der String, der an letzter Stelle ist, der geht nicht. Warum.
In der Strukturbeschreiben steht "null-terminated string" und das ist doch in BM ein einfacher String. Wenn ich da jetzt auch noch ein Chr(0) dranhänge gehts leider auch nicht.
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.

Suco-X

Betreff: .....

BeitragMi, Dez 31, 2008 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre es der Weltuntergang die gemeinte Struktur vielleicht mal zu veröffentlichen?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Der Eisvogel

BeitragMi, Dez 31, 2008 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, NOTIFYICONDATA
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.

Suco-X

Betreff: .....

BeitragMi, Dez 31, 2008 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann sollte der Type so aussehen:

Code: [AUSKLAPPEN]

Type NOTIFYICONDATA
   Field cdSize:Int
   Field hWnd:Int
   Field uID:Int
   Field uFlags:Int
   Field uCallbackMessage:Int
   Field hIcon:Int
   Field szTip:Byte Ptr = MemAlloc(64)
   
   Method getTip:String()
      Return String.FromCString(szTip)
   End Method
   
   Method setTip(str:String)
      szTip = str.ToCString()
   End Method
End Type


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

Der Eisvogel

BeitragMi, Dez 31, 2008 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
So jetzt hab ich das gemacht. Aber wenn ich jetzt mit der Maus über das Icon gehe ist es sofort weg. Ich habe das Feld hWnd mit GetActiveWindow gefüllt.
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.

Geeecko

BeitragMi, Dez 31, 2008 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Code nix los.

Der Eisvogel

BeitragMi, Dez 31, 2008 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Import pub.win32


Graphics 640,480

icon=LoadTrayIcon("icon.ico")

tray_icon=SetTrayIcon(GetActiveWindow(),icon,"Hallo")

DrawText "Icon gesetzt",10,10
Flip
WaitKey

DeleteTrayIcon(tray_icon)

DrawText "Icon gelöscht",10,30
Flip
WaitKey






Const IMAGE_ICON=1
Const LR_LOADFROMFILE=$10
Const LR_DEFAULTSIZE=$40

Const NIM_ADD=$0
Const NIM_MODIFY=$1
Const NIM_DELETE=$2

Type NOTIFYICONDATA
   Global list=CreateList()
   
   Field bank:TBank
   Field cbSize:Int
   Field hWnd:Int
   Field uID:Int
   Field uFlags:Int
   Field uCallbackMessage:Int
   Field hIcon:Int
   Field szTip:Byte Ptr=MemAlloc(64)
   
   Method New()
      ListAddLast(list,Self)
      bank=CreateBank(88)
      cbSize=SizeOf(Self)
      uFlags=NIF_MESSAGE Or NIF_ICON Or NIF_TIP
   End Method
   
   Method SetTip(tip$)
      szTip=tip.ToCString()
   End Method
End Type



Extern "Win32"
   Function Shell_NotifyIconA(dwMessage,lpData:Byte Ptr)
   Function LoadImageA(hInst,lpsz$,un1,n1,n2,un2)
End Extern



Function LoadTrayIcon(icon_name$)
   Return LoadImageA(0,icon_name,IMAGE_ICON,0,0,LR_DEFAULTSIZE Or LR_LOADFROMFILE)
End Function



Function SetTrayIcon(hWnd,hIcon,szTip$)
   Local nid:NOTIFYICONDATA=New NOTIFYICONDATA
   nid.hWnd=hWnd
   nid.uID=12
   nid.hIcon=hIcon
   nid.SetTip(szTip)

   DebugLog Shell_NotifyIconA(NIM_ADD,nid)
   
   Return HandleFromObject(nid)
End Function



Function DeleteTrayIcon(hTrayIcon:Int)
   Local nid:Object=HandleToObject(hTrayIcon)
   
   Return Shell_NotifyIconA(NIM_DELETE,nid)
End Function


Irgendwie geht jetzt auch das Icon selber nicht mehr. Es kommt nur noch ne leere Fläche. Weis nicht was ich jetzt gemacht habe. In Blitz3D Habe ich das alle hinbekommen. Sad
Ich hoffe, dass ich das in BMax auch noch schaffe.
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.

Geeecko

BeitragMi, Dez 31, 2008 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiß nich ob es daran liegt, aber in:

Code: [AUSKLAPPEN]

Type NOTIFYICONDATA
   Global list=CreateList()
   
   Field bank:TBank


die liste und die bank... weiß nicht ob das darein darfst, weil du das ja an c++ übergibt,
und c++ nicht weiß was es sein soll, bzw denkt es gehört zu einem integer oder so.
 

#Reaper

Newsposter

BeitragMi, Dez 31, 2008 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Meister_Dieb hat Folgendes geschrieben:
die liste und die bank... weiß nicht ob das darein darfst, weil du das ja an c++ übergibt,
und c++ nicht weiß was es sein soll, bzw denkt es gehört zu einem integer oder so.


Nein, das darf da nicht rein. C++ schreibt da sonst einfach irgendwas rein. Es wird nicht auf Variablennamen o.Ä. geachtet, damit man was ordentliches zurückbekommt muss man die Variablen in der richtigen Reihenfolge und mit dem richtigen Typ angeben.
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

BeitragMi, Dez 31, 2008 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, mist das hab ich in meinem vielen rumprobiren rein geschrieben danke jungs.

EDIT: Naja jetzt bleibt das Icon wieder, aber ein Bild ist immernoch nicht da, und der Tooltip geht auch nicht.

EDIT: Das Problem mit dem Icon ist, das es nicht geldaen wird. GetLastError gibt den Code 1813 aus. Aber ich weis nicht, was ich falsch mache.
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 Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group