Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Funktionsaufruf via Pointer

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Azrael



Anmeldungsdatum: 21.11.2005
Beiträge: 12

BeitragVerfasst am: 17.11.2006, 22:50    Titel: Funktionsaufruf via Pointer Antworten mit Zitat

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? lächeln

Danke schonmal
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 17.11.2006, 22:55    Titel: Antworten mit Zitat

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 böse Ifer
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Azrael



Anmeldungsdatum: 21.11.2005
Beiträge: 12

BeitragVerfasst am: 17.11.2006, 23:16    Titel: Antworten mit Zitat

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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 18.11.2006, 14:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.11.2006, 00:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 08.12.2006, 16:41    Titel: Antworten mit Zitat

Hallihallo, habe da letztens mal mit rumgespielt, bin auch sehr begeistert (grinsen), 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 lächeln

jb
_________________
Elektronik und Programmieren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 08.12.2006, 17:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 08.12.2006, 18:14    Titel: Antworten mit Zitat

Jaja, das ist schon klar... Mir geht es halt um genau obige Methode...

jb
_________________
Elektronik und Programmieren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 08.12.2006, 18:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 08.12.2006, 18:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 08.12.2006, 19:21    Titel: Antworten mit Zitat

Und wieso geht meine Methode dann? Zunge rausstrecken
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 08.12.2006, 20:18    Titel: Antworten mit Zitat

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
Zunge rausstrecken
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 08.12.2006, 20:37    Titel: Antworten mit Zitat

Bei mir FB 0.16, FB 0.17 CVS geht es.
Liegt vielleicht daran, dass ich Linux nutze happy
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 08.12.2006, 20:52    Titel: Antworten mit Zitat

hmm,
das würde ja dann bedeuten, dass unter Linux FBC die erheblich schnelleren Rechenbefehle der FPU nicht nutzt???
Kopf schütteln
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz