in reply to Re^3: 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

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?
  • Comment on Re^4: How do I call C++ Dll's class Function in perl using Win32::API

Replies are listed 'Best First'.
Re^5: How do I call C++ Dll's class Function in perl using Win32::API
by BrowserUk (Patriarch) on Mar 12, 2009 at 13:20 UTC

    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
        Is this the problem from Perl side

        Yes. In order to call the functions in your DLL, you need to supply Win32::API with the name of the function to call--but it has to be the name as exported, not the internal C++ method name.

        Because a single class can have multiple methods with the same name but different nos and/or types of parameters, the names have to be "mangled" for export. Encoded within those mangled names is the number and types of the parameters the functions (methods) expect.

        See Name mangling for more info. It doesn't mean that calling C++ methods is impossible with Win32::API--just makes it sufficiently hard that no one will bother unless they absolutely have no choice. Eg. They have a C++ DLL that they must use, but no source.

        You'd be better of investigating Inline::CPP.


        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.