Search code examples
visual-studioperldllpointersdllexport

Passing C++ structure pointer from Perl to arbitary dll function call


I am using Win32::API to call an arbitary function exported in a DLL which accepts a C++ structure pointer.

struct PluginInfo {
        int  nStructSize;   
        int  nType;     
        int  nVersion;    
        int  nIDCode;    
        char         szName[ 64 ];  
        char            szVendor[ 64 ];
        int  nCertificate;  
        int  nMinAmiVersion;
};

As we need to use the "pack" function to construct the structure and need to pass an argument

my $name = " " x 64;
my $vendor = " " x 64;
my $pluginInfo = pack('IIIIC64C64II',0,0,0,0,$name,$vendor,0,0);

Its not constructing the structure properly.
It seems that length argument applied to C will gobble those many arguments.
Can some one please suggest the best way to construct this structure form Perl and passon to dll call.

Thanks in advance,
Naga Kiran


Solution

  • Use Z (NUL-padded string) in your template, as in

    my $pluginInfo = pack('IIIIZ64Z64II',0,0,0,0,$name,$vendor,0,0);
    

    Also, take a look at Win32::API::Struct, which is part of the Win32::API module.