Thread Zugriffe auf .dll über Win32::API (17 answers)
Opened by Fabian at 2012-05-08 13:39

murphy
 2012-05-08 15:35
#158196 #158196
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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.
[...]
Code (perl): (dl )
$function=Win32::API->new('CARBONDIOXIDE','DOTP','DD','D');

[...]

Wenn ich das richtig verstehe, bekommt die Funktion zwei Zeiger als Argumente aber Du weist CPAN: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 CPAN:Win32::API ein wenig hässlich, denn das müsste in etwa so aussehen:
Code (perl): (dl )
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;

# Wrapper for external function with awkward interface
sub DOTP {
  # Get arguments
  my ($T, $P) = @_;

  # Prepare foreign function interface, if necessary
  state $ffi = Win32::API->new(
    'CARBONDIOXIDE',
    'double DOTP(LPDOUBLE lpT, LPDOUBLE lpP)'
  );

  # Pack arguments into memory to be passed to the function
  my $bufT = pack('d', $T);
  my $bufP = pack('d', $P);

  # Perform external call and return value
  return $ffi->Call($bufT, $bufP);
}

# Test the thing
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.

View full thread Zugriffe auf .dll über Win32::API