Access a c++ module from Perl

Discussion in 'Perl Misc' started by bg-greece, Oct 24, 2005.

  1. bg-greece

    bg-greece Guest

    I am using cygwin and perl and trying to access some function from a C++
    windows dll. After the first attempt produced a segmentation fault, I tried
    to do it step-by-step. I created a dummy function in the dll file:

    int TestDLL(int x)
    {
    return 1;
    }


    and put the following code in a perl file:

    use strict;
    use Win32::API::prototype;

    my $TestDLL = ApiLink("mydll",'I TestDLL(I x)');
    if (not defined $TestDLL) {
    die "Can't import API TestDLL: $! \n";
    }
    print "ApiLink done\n";

    my $xx = 0;
    my $return = $TestDLL->Call($xx);
    print $return."\n";


    But even this produces a segmentation fault (core dump). Any ideas?

    BG
    bg-greece, Oct 24, 2005
    #1
    1. Advertising

  2. bg-greece

    John Bokma Guest

    "bg-greece" <> wrote:

    > I am using cygwin and perl and trying to access some function from a
    > C++ windows dll. After the first attempt produced a segmentation
    > fault, I tried to do it step-by-step. I created a dummy function in
    > the dll file:


    ....

    > But even this produces a segmentation fault (core dump). Any ideas?


    Just a very wild guess: you wrote Cygwin. How did you make the DLL? Inside
    Cygwin, or outside it?

    --
    John Small Perl scripts: http://johnbokma.com/perl/
    Perl programmer available: http://castleamber.com/
    I ploink googlegroups.com :)
    John Bokma, Oct 24, 2005
    #2
    1. Advertising

  3. bg-greece

    bg-greece Guest

    the dll was created with with Microsoft Visual C++ 6.0


    "John Bokma" <> wrote in message
    news:Xns96F96BB05E958castleamber@130.133.1.4...
    > Just a very wild guess: you wrote Cygwin. How did you make the DLL? Inside
    > Cygwin, or outside it?
    >
    > --
    > John Small Perl scripts: http://johnbokma.com/perl/
    > Perl programmer available: http://castleamber.com/
    > I ploink googlegroups.com :)
    >
    bg-greece, Oct 25, 2005
    #3
  4. bg-greece

    Bart Lateur Guest

    bg-greece wrote:

    >I am using cygwin and perl and trying to access some function from a C++
    >windows dll. After the first attempt produced a segmentation fault, I tried
    >to do it step-by-step. I created a dummy function in the dll file:
    >
    >int TestDLL(int x)
    >{
    > return 1;
    >}
    >
    >
    >and put the following code in a perl file:
    >
    >use strict;
    >use Win32::API::prototype;
    >
    >my $TestDLL = ApiLink("mydll",'I TestDLL(I x)');
    > if (not defined $TestDLL) {
    > die "Can't import API TestDLL: $! \n";
    >}


    In my experience, the prototype based stuff is very buggy. I've had
    nothing but crashes with it. I would skip it and go the oldfashioned raw
    way, which always *did* work. Try.

    use Win32::API;
    my $TestDLL = Win32::API->new('mydll', 'TestDLL', 'I', 'I')
    or die "Can't load function";

    HTH,
    Bart.
    Bart Lateur, Oct 25, 2005
    #4
  5. bg-greece

    bg-greece Guest

    In fact Win32::API was the first try and it also produced segmentation
    fault.Other trivial examples however (with kernel32.dll for example) have
    worked.

    > In my experience, the prototype based stuff is very buggy. I've had
    > nothing but crashes with it. I would skip it and go the oldfashioned raw
    > way, which always *did* work. Try.
    >
    > use Win32::API;
    > my $TestDLL = Win32::API->new('mydll', 'TestDLL', 'I', 'I')
    > or die "Can't load function";
    >
    > HTH,
    > Bart.
    bg-greece, Oct 25, 2005
    #5
  6. bg-greece wrote:
    > the dll was created with with Microsoft Visual C++ 6.0


    Are you using the Cygwin distribution of Perl? I think you will find
    that it was _not_ made with Visual C++ V6, but with gcc.

    I personally have had good luck with Win32::API, though sometimes it was
    not obvious how to describe the function I wanted to import, and when
    you get the description wrong, you do get segment violations. I do not
    remember using the new, sexy prototype interface, just the old, clunky
    one. See Win32::process::Info::NT for an example.

    Disclaimer: I wrote the cited module. And I never said it was a _good_
    example.

    Tom Wyant
    harryfmudd [AT] comcast [DOT] net, Oct 25, 2005
    #6
  7. bg-greece

    John Bokma Guest

    "bg-greece" <> wrote:

    > "John Bokma" <> wrote in message
    > news:Xns96F96BB05E958castleamber@130.133.1.4...
    >> Just a very wild guess: you wrote Cygwin. How did you make the DLL?
    >> Inside Cygwin, or outside it?


    > the dll was created with with Microsoft Visual C++ 6.0


    That might cause the problem(s) you see.

    --
    John Small Perl scripts: http://johnbokma.com/perl/
    Perl programmer available: http://castleamber.com/
    I ploink googlegroups.com :)
    John Bokma, Oct 26, 2005
    #7
  8. bg-greece

    bg-greece Guest

    You mean I should create the DLL with cygwin/gcc?
    Putting aside that it needs a lot of time to do the porting, it contradicts
    the fact that I can perfectly call Windows system DLL's like user32,
    kernel32 and so on using Win32::API.

    B.

    "John Bokma" <> wrote in message
    news:Xns96FAC9D803B50castleamber@130.133.1.4...
    > "bg-greece" <> wrote:
    >
    > > "John Bokma" <> wrote in message
    > > news:Xns96F96BB05E958castleamber@130.133.1.4...
    > >> Just a very wild guess: you wrote Cygwin. How did you make the DLL?
    > >> Inside Cygwin, or outside it?

    >
    > > the dll was created with with Microsoft Visual C++ 6.0

    >
    > That might cause the problem(s) you see.
    >
    > --
    > John Small Perl scripts: http://johnbokma.com/perl/
    > Perl programmer available: http://castleamber.com/
    > I ploink googlegroups.com :)
    >
    bg-greece, Oct 26, 2005
    #8
  9. bg-greece wrote:
    > You mean I should create the DLL with cygwin/gcc?
    > Putting aside that it needs a lot of time to do the porting, it contradicts
    > the fact that I can perfectly call Windows system DLL's like user32,
    > kernel32 and so on using Win32::API.


    Well, to be honest I have never done what you're trying to do FROM
    CYGWIN. I also note that someone has, because Win32-Process-Info 1.006
    has a "pass" from Cygwin (see
    http://testers.cpan.org/show/Win32-Process-Info.html).

    On the other hand, if you have the calling sequence right (as you say
    you do) and if the version of C doesn't matter (as you say it doesn't),
    then we just proved your code works.

    But it doesn't. At this point, I generally ask myself "what is it that I
    know to be true, but which is in fact not true?". The possibilities seem
    to me to be:

    1) the calling sequence is in fact coded incorrectly in Perl. I have no
    experience with the prototype version of the interface, but the
    traditional interface call in Bart Lateur's response looks right to me
    given the C signature in your original note, and you say that didn't work.

    2) Different compilers _can_ produce different calling sequences, so
    that's what I was focusing on. You say calls to Kernel32 work, which
    suggests that this isn't the problem, but doesn't prove it, since we
    don't know that Kernel32 was written in Visual C++. But we _do_ know
    that Visual C++ can call kernel32.dll. Have you read kernel32.h, and
    made sure your signatures are specified the same way? C++ wants to
    mangle function names (that's how overloading works), and it's possible
    that there is more than one way to handle the call stack. A mangled
    function name would probably result in a failure to import the function,
    but there are probably other things that could go wrong.

    3) Something else entirely. Arthur Conan Doyle was wrong when he had
    Sherlock Holmes say something like "When you have eliminated everything
    else, the remaining possibility, however improbable, must be the truth."
    The problem with the Sherlock Holmes approach is that it assumes you
    really know what every single possibility is.

    Tom Wyant
    harryfmudd [AT] comcast [DOT] net, Oct 26, 2005
    #9
  10. bg-greece

    Sisyphus Guest

    "bg-greece" <> wrote in message
    news:djl9aa$16vn$...
    > In fact Win32::API was the first try and it also produced segmentation
    > fault.Other trivial examples however (with kernel32.dll for example) have
    > worked.
    >


    Those dll's that are working were built using the stdcall calling
    convention. I suggest building your dll using the same calling convention -
    there's a command line switch that does that for you. (I think it's '/Gz' -
    but check 'cl /?')

    There exists somewhere a patched version of Win32::API that will work with
    cdecl calling convention, but I don't think that patched version has been
    ported to Cygwin.

    Cheers,
    Rob
    Sisyphus, Oct 29, 2005
    #10
  11. bg-greece

    bg-greece Guest

    Finally I needed to provide the .DEF file before building the DLL so perl
    could see the correct function names (i.e. the ones without "decoration").
    Thanx everyone
    B.
    bg-greece, Nov 4, 2005
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. eric_bellard
    Replies:
    1
    Views:
    5,104
    CarlosRivera
    Oct 7, 2004
  2. Mothra
    Replies:
    5
    Views:
    484
    Dennis Lee Bieber
    Apr 15, 2005
  3. Maric Michaud
    Replies:
    0
    Views:
    7,188
    Maric Michaud
    Jun 24, 2006
  4. abcd
    Replies:
    4
    Views:
    241
    Ben Finney
    Mar 20, 2007
  5. Gabriel Genellina
    Replies:
    0
    Views:
    443
    Gabriel Genellina
    Nov 21, 2008
Loading...

Share This Page