as I mentioned in Interact with mainframe screen, I am using the OLE interface of IBM Personal Communications 3270 emulator to perform automated tasks on a mainframe. However, some sessions get stuck when 3 or 4 sessions are used in parallel. So I tried to find another way...and I found it. Starting at version 4.1 or 4.3 (don't know exactly), a DLL EHLAPI.dll is provided with PCOMM to interface C or Java applications with the emulator, and I also found Win32::API.

Once everything is put together, I managed to have some interaction between Perl script and the 3270 emulator with the following code.It is a just a simple one, but works, and shows an increase speed execution(and hopefully less buggy).

here are the pages I found of interest to help me interface my Perl script with the EHLLAPI of the PCOMM:

A quick benchmark, only with the seconds elapsed, shows that for the same queries, the OLE version took around 60 seconds to execute, were the EHLLAPI version tooks only 15 seconds ! Until now I thought that the cause of the 'slow' execution time was due to the execution time of the query on the mainframe, or to the communication between the emulator and the mainframe, but most of the time was spent on the OLE interface.

use strict;
use Win32::API;

print "Getting API function\n";
my $hllapi = new Win32::API('D:/PC3270W/EHLAPI32.dll', 'hllapi', ['P',
+'P','P','P'], 'N');
die("oups not created") unless(defined($hllapi));

print "Connecting to session A";
my $fct=pack('L', 1);
my $connBuffer="A"."\0" x 3;
my $connBufferLen = pack('L', 4);
my $returnCode=pack('L',13);
my $ret=unpack('L',$returnCode);
print "return code -$ret-\n";
die("oups") if($ret != 0);

print "Trying sendkeys - JD\n";
$fct=pack('L', 3);
my $keys='JD@E';
my $keysLengh=pack('L', 4);

print "Waiting for command to be finished\n";
my $a="\0";
my $b=pack('L',0);
my $rc=pack('L',0);

print "Reading screen\n";
my $readBuf= "\0" x 3000;
my $lenToRead=pack('L',1920);
my $offset=pack('L',1);

for(my $k=0;$k<24;$k++){
    my $offset=$k*80;
    print substr($readBuf,$offset,80)."\n";
print "\n";