Hallo,
ich will ein R&S Speki per LAN steuern. Dazuliefert der Hersteller eine
dll mit:
http://www.rohde-schwarz.com/webhelp/zvb/HW_Interfaces/LAN_Interfaces/RSIB_Interface_Functions.htm
Um das mit Perl aus steuern zu können habe ich mir das durchgelesen:
http://search.cpan.org/~acalpini/Win32-API-0.41/API.pm
Das Beispiel aus o.g. Link funktioniert, aber schon der erste Versuch
eine Funktion aus der rsib32.dll anzusprechen quittiert der perl
Interpreter mit einer
"Perl Command Line Interpreter hat ein Problem festgestellt und muss
beendet werden. Problembericht senden?"
Ich bin bei Perl absoluter Anfänger. Ich bin deshalb unsicher ob ich das
"Call by Reference" der dll-Funktion richtig benutze. Das importieren
der Dll-Funktion bereitet auch schon Schwierigkeiten - Perl will kein
"short" und kein "unsigned".
Hat jemand eine Idee was man machen kann?
Ist Perl für sowas überhaupt geeignet? Die Beispiele des Herstellers
sind in Visual C, C++, Visual Basic und .Net. Aber ich wollte eigentlich
keins dieser Fässer aufmachen. Nur ein bisschen Quick&Dirty Daten vom
Gerät holen, ohne gleich eine neue IDE zu erlernen.
Vielen Dank
Randy
1 | #!/usr/bin/perl -w
|
2 | use Win32::API;
|
3 | use strict;
|
4 |
|
5 | my $PID;
|
6 |
|
7 | my $ub; # short
|
8 | my $ibsta = 42; # short
|
9 | my $ref_ibsta = \$ibsta;
|
10 | my $iberr = 43; # short
|
11 | my $ref_iberr = \$iberr;
|
12 | my $ibcntl = 16777318; # unsigned long
|
13 | my $ref_ibcntl = \$ibcntl;
|
14 |
|
15 |
|
16 |
|
17 | print "Hello world!\n";
|
18 |
|
19 |
|
20 | Win32::API->Import("kernel32", "int GetCurrentProcessId()");
|
21 | $PID = GetCurrentProcessId();
|
22 | print "$PID\n"; # das funktioniert
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | #Win32::API->Import("RSIB32", "short WINAPI RSDLLibfind( char far *udName, short far *ibsta, short far *iberr, unsigned long far *ibcntl)");
|
28 | # Perl kennt keinen "WINAPI", kein "short" und kein "unsigned"
|
29 | Win32::API->Import("RSIB32", "int RSDLLibfind( char far *udName, int far *ibsta, int far *iberr, long far *ibcntl)");
|
30 | #Win32::API->Import("RSIB32", "int RSDLLibfind( char *udName, int *ibsta, int *iberr, long *ibcntl)");
|
31 | # far oder nicht far: Wird beides akzeptiert
|
32 |
|
33 | $ub = RSDLLibfind("172.16.48.11", $ref_ibsta, $ref_iberr, $ref_ibcntl); # hier stürzt es ab
|
34 |
|
35 | print "ub: $ub\n";
|
36 | print "ref_ibsta: $ibsta\n";
|
37 | print "ref_iberr: $iberr\n";
|
38 | print "ref_ibcntl: $ibcntl\n";
|