anupama has asked for the wisdom of the Perl Monks concerning the following question:

I could call C code complied in Vc++ and access the funtion in perl using Win32::API
(__stdcall convention used for compilation).
Now, I am applying the same approach to access the C++ DLL's class function.
use strict;
use win32;
use Win32::API;
use Win32::API::Callback;
use Win32::API::Test;
use Win32::API::Struct;
my $Testdll = Win32::API->new('Testdll','BOOL OpenConnection(N N N)','N')or die "Can't load function";
my $result = $Testdll->Call("https://google.com","username","password");
print "$result\n";
The above function "OpenConnection" is declared in a class
. when i run the above perl script in strawberry perl error msg pops up shown below
Win32::API::parse_prototype: WARNING unknown parameter type '' at D:/strawberry/ perl/site/lib/Win32/API.pm line 287.
Win32::API::parse_prototype: WARNING unknown parameter type '' at D:/strawberry/ perl/site/lib/Win32/API.pm line 287.
Win32::API::parse_prototype: WARNING unknown parameter type '' at D:/strawberry/ perl/site/lib/Win32/API.pm line 287.
Can't load function at Test_1.pl line 10.
Is there any other way i can call the Dll's?
Shouls i write a wrapper function in perl.If so, how do i write?
. Please help


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','CDllTest::SayHello()') or die $^E;
print "$fun\n";
my $Result = $fun->Call();
print "$Result\n";
when i execute the Test.pl (using Strawberry perl env)i get below error: D:\strawberry\perl\bin>perl Test.pl
Win32::API::parse_prototype: bad prototype 'CDllTest::SayHello()' at D:/strawber ry/perl/site/lib/Win32/API.pm line 317.
Died at Test.pl line 12.
  • Comment on How do I call C++ Dll's class Function in perl using Win32::API

Replies are listed 'Best First'.
Re: How do I call C++ Dll's class Function in perl using Win32::API
by Anonymous Monk on Mar 12, 2009 at 09:13 UTC

      shouldn't matter with a case-insensitive file system.

        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.
Re: How do I call C++ Dll's class Function in perl using Win32::API
by Anonymous Monk on Mar 12, 2009 at 09:55 UTC
    Since you already have a compiler, you should go with SWIG/XS or Inline::CPP.
Re: How do I call C++ Dll's class Function in perl using Win32::API
by dcd (Scribe) on Mar 12, 2009 at 21:13 UTC
    Does Win32::API know how to pass the object pointer to your C++ function? (perhaps you want declare the function you call as a static member function).