Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Azrael
Anmeldungsdatum: 21.11.2005 Beiträge: 12
|
Verfasst am: 17.11.2006, 22:50 Titel: Funktionsaufruf via Pointer |
|
|
Ich hab ein kleines Problem. Für (irgend)ein Fenster hab ich über diverse WinAPI Functionen ein Handle herausbekommen und den Pointer für die WndProc ausgelesen und mit einer eigenen ersetzt. Ziel war es lediglich spezielle Nachrichten des Fensters abzufangen, die restlichen jedoch weiter an die original WndProc zu senden. Nun hab ich aber leider nur den Pointer auf diese Funktion, doch wie ruf ich die auf? ASM kenn ich leider nicht genug, um zu wissen, wie ich Types an die Funktion übergebe (Sicher über den Stack, aber wie? Vielleicht nur die Pointer?) Zumindest wollte ich wissen, ob nicht in FB eine ganz einfache Lösung gibt, die mir das alles erspart. Wenn nicht, kann vielleicht jemand ein Beispiel geben, wie es anders geht?
Danke schonmal |
|
Nach oben |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 17.11.2006, 22:55 Titel: |
|
|
Code: |
sub test(a as integer, b as single, c as string)
print "test!"
end sub
dim meinesub as sub (parameter1 as integer, parameter2 as single,
undsoweiter as string)
meinesub = @test
meinesub(4, 5.4, "bla") |
mir ist klar, dass du per winapi anders an funktionspointer kommst (getprocadress oder sowas war das, wenn ich nicht irre), aber das sollte helfen, dir den richtigen weg zu weisen.
Gruß
Lutz Ifer _________________ Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft. |
|
Nach oben |
|
 |
Azrael
Anmeldungsdatum: 21.11.2005 Beiträge: 12
|
Verfasst am: 17.11.2006, 23:16 Titel: |
|
|
Code: | dim meinesub as sub (parameter1 as integer, parameter2 as single,
undsoweiter as string) |
Klasse, auf die Idee wär ich wohl nie gekommen. Ich werd das gleich mal ausprobieren. Danke  |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 18.11.2006, 14:33 Titel: |
|
|
Auf Wikibooks hab ich ein ähnliches Beispiel Programm veröffentlicht:
Code: | Declare function test (q as string) as string 'Nur zu Anschauungszwecken
Dim test10 as function (q as string) as string 'Trick Teil 1
Dim a as any ptr 'Nur zu Anschauungszwecken
a=@test 'Nur zu Anschauungszwecken
test10=a 'Trick Teil 2
? test10("Das ist") 'Aufruf
sleep
function test (q as string) as string 'Nur zu Anschauungszwecken
? "Test" 'Nur zu Anschauungszwecken
test=q + "Hallo Welt" 'Nur zu Anschauungszwecken
end function 'Nur zu Anschauungszwecken |
Was mir auch noch einfällt, ist das du einiges Beachten solltest, wenn du mit WinAPI Funktionen arbeitest.
Wenn eine WinAPI Funktion einen String erwartet, entspricht dies in Freebasic einem ZString.
Das weiteren ist soviel ich weiss die Reihenfolge der Parameter verkehrt, sie dazu auch CDECL. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 19.11.2006, 00:14 Titel: |
|
|
Anzumerken wäre noch, dass man die Klammern auch angeben muss, auch wenn keine Parameter verwendet werden:
Code: | DECLARE SUB foo ()
DIM AS SUB () bar
bar = @foo
bar()
foo
SUB foo ()
PRINT "Test"
END SUB |
Ein anderes Beispiel findet sich in der Befehlsreferenz unter
Operatoren in freeBASIC->@ (Adresse von)->3. Beispielcode _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 08.12.2006, 16:41 Titel: |
|
|
Hallihallo, habe da letztens mal mit rumgespielt, bin auch sehr begeistert ( ), habe aber eine Frage.
Kann man auch auf freeBASIC-eigene Funktionen zuweisen? Ein
Code: |
dim SINUS as function (wert as double) as double
SINUS = @sin() ' <-- hier kommt der Fehler
print SINUS(0)
|
klappt irgendwie nicht, obwohl es von der Syntax her doch korrekt sein müsste...
Wäre echt super, wenn das klappen würde
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 08.12.2006, 17:41 Titel: |
|
|
Also in dem Fall würde ich das anders machen, denn ich glaube nicht, dass das so einfach geht.
Viel einfacher ist die Methode per define:
Code: | #define SINUS(wert) sin(wert)
Print SINUS(1) |
_________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 08.12.2006, 18:14 Titel: |
|
|
Jaja, das ist schon klar... Mir geht es halt um genau obige Methode...
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 08.12.2006, 18:32 Titel: |
|
|
Ok, dann halt so:
Code: | #undef sin
declare function sin Lib "fb" Alias "sin"(x as double) As double
dim SINUS as function (wert as double) as double
SINUS = @sin()
print SINUS(1) |
Ich würde es allerdings nicht so machen, da es probleme bei funktionen gibt, die "überladen" werden (z.B. abs).
So geht es besser, allerdings muss man dann auch noch etwas bei der zuweisung ändern:
Code: | declare function sin_ Lib "fb" Alias "sin"(x as double) As double
dim SINUS as function (wert as double) as double
SINUS = @sin_()
print SINUS(1) |
_________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 08.12.2006, 18:57 Titel: |
|
|
Hi jb,
du hast dir mit sin() ein schlechtes Beispiel gesucht, da diese Anweisung nicht als Funktion in FB existiert.
Die Anweisung doubl=sin(integ) wird vom FBC direkt in Assembler umgesetzt Code: | fild dword ptr [integ]
fsin
fstp qword ptr [doubl] | also existiert kein Pointer auf sin(). _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 08.12.2006, 19:21 Titel: |
|
|
Und wieso geht meine Methode dann?  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 08.12.2006, 20:18 Titel: |
|
|
programmierer hat Folgendes geschrieben: | Und wieso geht meine Methode dann? |
Bei mir leider nicht weder unter FBC0.16st noch mit FBC0.17CVS immer
FBC hat Folgendes geschrieben: | Compiler output:
C:\FB016\test2.o:fake:(.text+0x28): undefined reference to `sin@8'
Results:
Compilation failed |  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 08.12.2006, 20:37 Titel: |
|
|
Bei mir FB 0.16, FB 0.17 CVS geht es.
Liegt vielleicht daran, dass ich Linux nutze  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 08.12.2006, 20:52 Titel: |
|
|
hmm,
das würde ja dann bedeuten, dass unter Linux FBC die erheblich schnelleren Rechenbefehle der FPU nicht nutzt???
Sieh dir mal das Assemblerlisting ( -r ) einer einfachen Anweisung an
Code: | dim as double a= 0.8
?sin(a) | ob da nicht "fsin" drin auftaucht.
EDIT/
Es ist möglich das in der libfb die du ansprichst unter Linux eine sin() - Funktion existiert (werde ich mal im CVS nachsehen).
Unter der Win32 - Version existiert in der libfb keine sin-Funktion.
@jb, mit Sleep geht es. Code: | Dim Pause As Sub (wert As Integer)
Pause = @Sleep
Print "Start ";Time
Pause (2000)
Print "Stop ";Time
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|