in reply to Re^2: How do I call C++ Dll's class Function in perl using Win32::API
in thread How do I call C++ Dll's class Function in perl using Win32::API

It does matter.
D:\>perl -MWin32=NULL -e " warn NULL() 0 at -e line 1. D:\>perl -Mwin32=NULL -e " warn NULL() Undefined subroutine &main::NULL called at -e line 1.
  • Comment on Re^3: How do I call C++ Dll's class Function in perl using Win32::API
  • Download Code

Replies are listed 'Best First'.
Re^4: How do I call C++ Dll's class Function in perl using Win32::API
by anupama (Novice) on Mar 12, 2009 at 13:01 UTC
    Below i have written a C++ code for testing Test.cpp #include "Test.h"
    #include <stdio.h>
    class __declspec(dllexport) CDllTest
    {
    public:
    CDllTest(){}
    ~CDllTest(){}
    public:
    void _stdcall SayHello();
    };
    void __stdcall CDllTest::SayHello()
    {
    printf("Hello C++");
    }
    Test.h
    void _stdcall SayHello();
    Perl File Test.pl
    #!/usr/bin/perl -slw
    use strict;
    use warnings;
    #use Win32::API;
    #use Win32::API::Callback;
    #use Win32::API::Test;
    use Win32::API::Prototype;
    my $fun = Win32::API->new('D:\Documents and Settings\M1009280\My Documents\Visual Studio 2005\Projects\Test\Test\Test.dll','void SayHello()') or die $^E;
    print "$fun\n";
    my $Result = $fun->Call();
    print "$Result\n";


    when the above perl script is exectued with the correct o/p
    D:\strawberry\perl\bin>perl Test.pl
    Win32::API::parse_prototype: WARNING unknown output parameter type 'void' at D:/ strawberry/perl/site/lib/Win32/API.pm line 312.
    Hello C++
    Hai

    but need to forcebly exit to get the cmd prompt "perl.exe encountered a problem and needs to be close"
    how do i get rid of this problem
    Is the problem from perl script or C++ code?

      C++ mangles (modifies) names for export so that if the DLL contains two (or more) classes that both have a foo() method, they will not clash.

      Run the command: dumpbin /exports your.dll to see what the exported entrypoints look like. These are the function/prototype names you would need to supply to Win32::API.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Also, Win32::API doesn't expose c++ constructor new
        Test.dll dump looks like this
        Microsoft (R) COFF/PE Dumper Version 8.00.50727.42
        Copyright (C) Microsoft Corporation. All rights reserved.
        Dump of file Test.dll
        File Type: DLL
        Section contains the following exports for Test.dll
        00000000 characteristics
        49B9DFE4 time date stamp Fri Mar 13 09:54:04 2009
        0.00 version
        1 ordinal base
        4 number of functions
        4 number of names
        ordinal hint RVA name
        1 0 00001000 ??0CDllTest@@QAE@XZ
        2 1 00001010 ??1CDllTest@@QAE@XZ
        3 2 00001020 ??4CDllTest@@QAEAAV0@ABV0@@Z
        4 3 00001030 SayHello
        Summary
        3000 .data
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        9000 .text
        Is this the problem from Perl side