Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7468[/thread]

Callback, Funktionsaufruf aus C nach Perl

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
fritz
 2005-11-14 16:14
#60104 #60104
User since
2005-10-19
44 Artikel
BenutzerIn
[default_avatar]
Hi liebe Perlgemeinde.

Nachdem ich mich jetzt schon seit knapp 3 Monaten intensiv mit Perl beschaeftige und schon oft dieses Forum nutzen konnte stehe ich nun vor einem kniffligen Problem.

folgendes:

Meine Aufgabe ist es Funktionen einer DLL ueber Perl aufzurufen und diese dann abzuarbeiten. Die aufgerufenen Funktionen sind im C Code geschrieben. Das klappt eigentlich ganz gut, mit allerdings einer Ausnahme.

Die Funktion lautet:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
QCV_Init
{
struct InitParam => { map { $_ => '$'} qw(MsgIdSingleStep MsgIdBreakpoint MsgIdStorage MsgIdState MsgIdWarning MsgIdCPUStopped)};
my $IP = InitParam->new();
$IP->MsgIdSingleStep(0);
$IP->MsgIdBreakpoint(1);
$IP->MsgIdStorage(2);
$IP->MsgIdState(3);
$IP->MsgIdWarning(4);
$IP->MsgIdCPUStopped(5);

my $return = $QVC{Init}->Call(callback(),\$IP);
}


jetzt das Problem, ich uebergebe der Funktion zwei Parameter, wobei der zweite davon ein Struct ist das ich definieren kann. Die Funktion der DLL speichert die Werte der Struct. Nachdem die Funktion aufgerufen wurde, soll die DLL eine Funktion in Perl oeffnen und an diese 4 Parameter uebergeben. Die Funktion heisst bei mir callback(). Das Problem ist nun das es mir nicht moeglich ist diese callback Funktion oeffnen zu lassen.

Bitte um Hilfe wie man so etwas machen kann.

PS: Der Funktionsaufruf funktioniert da ich von der DLL eine 1 zurueck bekomme wenn ich sie ausfuehre.

Nur die Sache mit der Callback Funktion haut eben noch nicht hin.

MFG

Fritz

Crian: Code-Tags\n\n

<!--EDIT|Crian|1132053212-->
esskar
 2005-11-15 02:47
#60105 #60105
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
also nochmal zum mitschreiben:

du hast in perl eine Funktion namens callback...
du willst, dass deine dll den diese Funktion aufrufen kann?

sowas geht nicht in Perl direkt. du musst wohl den umweg über XS nehmen (perldoc perlxs) und dort die dll einbinden.

das problem ist einfach, dass die dll nix von perl weiß und deswegen auch keine perl-funktionen aufrufen kann.
J-jayz-Z
 2005-11-15 09:49
#60106 #60106
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=fritz,14.11.2005, 15:14]Meine Aufgabe ist es Funktionen einer DLL ueber Perl aufzurufen und diese dann abzuarbeiten. Die aufgerufenen Funktionen sind im C Code geschrieben.[/quote]
Ich glaube, er meint anderstherum.
Schau dir mal Inline an (danke nochmal an pq :) ), wenn du den Code der Funktion hast. Dann brauchst du nicht unbedingt die dll sondern kannst es direkt in den Perl Code schreiben.
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pKai
 2005-11-15 12:04
#60107 #60107
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=J-jayz-Z,15.Nov..2005, 08:49]Ich glaube, er meint anderstherum.[/quote]
Nö, er macht genau das und schreibt ja auch, dass das funktioniert.
Was anscheinend nicht funktioniert ist, dass eine der aufgerufenen DLL-Funktionen wiederum eine Perl-sub aufruft.
Code: (dl )
Perl -> DLL -> Perl
Also linker Pfeil O. K., rechter nicht/unklar.
Mit Inline würde man in meinem Verständnis auch nur den linken Aufrufweg behandeln/substituieren?!
I sense a soul in search of answers.
J-jayz-Z
 2005-11-15 13:10
#60108 #60108
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich glaube eher C->DLL->Perl, oder?
Er hat C Code, der auf ne DLL zugreift und den will er von Perl aus aufrufen ...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pKai
 2005-11-15 21:55
#60109 #60109
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
nein
I sense a soul in search of answers.
sri
 2005-11-15 22:58
#60110 #60110
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich hab sowas mal fuer WWW::Curl gebastelt, vielleicht hilft das ja weiter. (einfach nach "callback" suchen)
fritz
 2005-11-16 13:37
#60111 #60111
User since
2005-10-19
44 Artikel
BenutzerIn
[default_avatar]
Also nochmal fuer alle um Missverstaendnisse vorzubeugen.

Ich rufe ueber Perl Funktionen einer DLL auf die in C geschrieben sind. Das Problem ist jetzt das eine dieser C Funktionen eine Callback Funktion in Perl oeffnen muesste. Leider weiss ich nicht wie sowas geht.

Vielen Dank schon mal im Vorraus
Strat
 2005-11-16 18:12
#60112 #60112
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
da bin ich auch ueberfragt; und einfach den namen der perl-funktion von der funktion in der dll zurueckgeben lassen und die dann nach der dll-funktion ausfuehren? oder ist das zu naiv?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sri
 2005-11-16 18:18
#60113 #60113
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Schau einfach in mein Beispiel!!!
Du brauchst eine proxy-C-funktion die dann die Perl funktion aufruft.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-11-14 16:14.