Guest Fabian[...]
Die .dll heißt Carbondioxide.dll und die Funktion dazu DOTP mit den Argumenten Druck und Temperatur. Diese Argumente sind als Referenz zu übergeben; der Rückgabewert erfolgt direkt als value schreiben die Autoren der .dll.
[...]
$function=Win32::API->new('CARBONDIOXIDE','DOTP','DD','D');
[...]
Wenn ich das richtig verstehe, bekommt die Funktion zwei Zeiger als Argumente aber Du weist
Win32::API an sie mit zwei Fließkommazahlen als Argumente aufzurufen — das kann ja nicht funktionieren.
Wenn die Funktion aber wirklich Zeiger auf Gleitkommazahlen als Argumente erwartet, dann wird der Aufruf über
Win32::API ein wenig hässlich, denn das müsste in etwa so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use 5.010;
use strict;
use warnings;
use Win32::API;
sub DOTP {
my ($T, $P) = @_;
state $ffi = Win32::API->new(
'CARBONDIOXIDE',
'double DOTP(LPDOUBLE lpT, LPDOUBLE lpP)'
);
my $bufT = pack('d', $T);
my $bufP = pack('d', $P);
return $ffi->Call($bufT, $bufP);
}
say DOTP(300, 6);
Last edited: 2012-05-08 16:05:26 +0200 (CEST)
When C++ is your hammer, every problem looks like your thumb.