----- Original Message ----- 
From: "Foo Ji-Haw" <[EMAIL PROTECTED]>
To: <perl-win32-users@listserv.ActiveState.com>
Sent: Friday, February 17, 2006 7:54 PM
Subject: Tough qn: understanding this (C) error while using inline


> Hi all,
>
> I'm trying my first hand at writing some C code to extend TAPI onto Perl
> using inline.pm. I didn't get very far though. Appreciate if anyone can
> help explain the error (source code is attached).
>

 Make sure you have a good look through 'perldoc Inline::C-Cookbook'. It has
many helpful examples.

Reinhard's method of linking to the tapi32 library looks a little odd to me
... however, I can't say it doesn't work as I haven't tested it.
I usually link to libraries using the construct shown in the demo below.

There are problems with passing/returning 'DWORD' and 'HINSTANCE' types. The
script below also demonstrates those problems - along with a couple of
possible solutions. In each case a third solution is to provide a 'typemap'
file that tells perl how to deal with the 'DWORD' and 'HINSTANCE' types.


use warnings;
use Inline C => Config =>
    LIBS => '-ltapi32', # not necessary for this demo
    BUILD_NOISY => 1; # See the build process in progress

use Inline C => <<'EOC';

#include <windows.h> // not really necesary as it's
                     // already included by perl.h

// 'foo1_nok()' compiles ok but won't work without
//  an appropriate typemap that tells perl how
//  to deal with the 'DWORD' type argument/return.

DWORD foo1_nok(DWORD x) {
      x++;
      return x;
}

unsigned foo1_ok1(unsigned x) {
     DWORD t;
     t = (DWORD)x;
     t++;
     return (unsigned)t;
}

SV * foo1_ok2(SV * x) {
     DWORD t;
     t = (DWORD)SvUV(x);
     t++;
     return newSVuv((unsigned long)t);
}

// 'foo2_nok()' compiles ok but won't work without
//  an appropriate typemap that tells perl how
// to deal with the 'HINSTANCE' type argument/return.

HINSTANCE foo2_nok(HINSTANCE x) {
      return x;
}

int foo2_ok1(int x) {
     HINSTANCE t;
     t = (HINSTANCE)x;
     return (int)t;
}

SV * foo2_ok2(SV * x) {
     HINSTANCE t;
     t = (HINSTANCE)SvIV(x);
     return newSViv((int)t);
}


EOC

$a = 121;

$x = foo1_ok1($a);
$y = foo1_ok2($a);
print $x, " ", $y, "\n";

eval {
  no warnings;
  $z = foo1_nok($a);# Also issues a warning unless disabled
  };

if($@) {print "\$\@: ",[EMAIL PROTECTED]
else {print $z, "\n"}

print "##########################\n";

$x = foo2_ok1($a);
$y = foo2_ok2($a);
print $x, " ", $y, "\n";

eval {
  no warnings;
  $z = foo2_nok($a);# Also issues a warning unless disabled
  };

if($@) {print "\$\@: ",[EMAIL PROTECTED]
else {print $z, "\n"}

__END__

Cheers,
Rob

_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to