Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
71 views

Using EHLLAPI in C# - CodeProject

Uploaded by

Angel Saez
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
71 views

Using EHLLAPI in C# - CodeProject

Uploaded by

Angel Saez
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

4/24/2021 Using EHLLAPI in C# - CodeProject

14,847,622 members Sign in

Search for articles, questions,


articles Q&A forums stuff lounge ?

Using EHLLAPI in C#
Luca Bertoncini Rate me: 4.68/5 (16 votes)
17 Feb 2005 CPOL

This article will explain how to interact with AS/400 applications using the PCSHLL32.DLL library distributed with IBM Client Access
emulator.

Download demo project - 12.4 Kb


Download source code - 13.5 Kb

Using EHLLAPI from C#


EHLLAPI (Extended High Level Language Application Programming Interface) is a standard library to build interfaces to AS400
applications. It's distributed with all major emulation vendors (RUMBA, IBM Client Access, ...), and it's installed automatically as DLL.

This article will explain how to interact with AS/400 applications using the library distributed with IBM Client Access emulator:
PCSHLL32.DLL. If you use a different emulation software, you can apply the concepts exposed in this article with some minor
modifications.

https://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 1/6
4/24/2021 Using EHLLAPI in C# - CodeProject

EHLLAPI Concept
In a lot of companies, data integration is not so simple because a lot of programs are very old and databases are not well structured.
Even if data can be accessed using ODBC drivers, the real problem is the knowledge of data structures and integration: which tables I
must change to insert a new product code? Where are all the data of a customer (in which tables)? These and a lot of other questions
have a simple answer: ask to users and learn the commands they type on the screen to insert or read information. You translate the
problem: it's not important to know the logic to manipulate data, what's important is to know the "video" command the users type.

The interface used to interact with AS/400 is called "screen scraping": it's based on the fact that emulator software use a char interface to
interact with AS/400 programs. Using this interface, you can read from and write to emulation screens. This really simple mechanism
reveals all its power if inserted in a high level window program.

DLL Exported Function


PCSHLL32.DLL includes just a function named HLLAPI that receives a parameter (function code): by changing the value of this
parameter, we can perform all the operations. There are almost one hundred functions available in the DLL and declared as const
inside code. In my experience, I used just five of these functions:

HA_CONNECT_PS: connect to a client session (every session is identified by an ID: "A", "B", and so on).
HA_DISCONNECT_PS: disconnect from a client session.
HA_SET_CURSOR: set the cursor in the absolute position (rows * 80 (or 132) + cols).
HA_SENDKEY: send a string to a client session.
HA_COPY_PS_TO_STR: read from video.
HA_WAIT: wait for session deblocking.
To import the DLL function, I used this code:

Copy Code

public class EhllapiFunc


{
[DllImport("PCSHLL32.dll")]
public static extern UInt32 hllapi(out UInt32 Func,
StringBuilder Data, out UInt32 Length, out UInt32 RetC);
}

This class contains just a static function referrer to the PCSHLL32 function. This function return 0 if all is OK, otherwise it returns an
error code (see inside the code). Parameters are declared without statement because they are used in two directions (to send and
receive value). Depending on the Func parameter, Data, Length and RetC parameters have different meanings.

Inside Class Code


I created a class named EhllapiWrapper. This class exposes five static methods. The structure of these methods is very simple:
initialize parameter, call HLLAPI function exposed by the EhllapiFunc class, and return value:

Shrink ▲   Copy Code

public static UInt32 Connect(string sessionID)


{
StringBuilder Data = new StringBuilder(4);
//Data will contain the ID code of Session

Data.Append(sessionID);
UInt32 rc=0;
UInt32 f=HA_CONNECT_PS; //function code
https://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 2/6
4/24/2021 Using EHLLAPI in C# - CodeProject

UInt32 l=4; //lenght of data parameter


return EhllapiFunc.hllapi(out f, Data, out l, out rc);
//return error code
}
public static UInt32 Disconnect(string sessionID)
{
StringBuilder Data = new StringBuilder(4);
Data.Append(sessionID);
UInt32 rc=0;
UInt32 f=HA_DISCONNECT_PS;
UInt32 l=4;
return EhllapiFunc.hllapi(out f, Data, out l, out rc);
}
public static UInt32 SetCursorPos(int p)
{
StringBuilder Data = new StringBuilder(0);
//no Data parameter is required

UInt32 rc=(UInt32) p;
//rc parameter contains the curson position

UInt32 f=HA_SET_CURSOR;
UInt32 l=0;
return EhllapiFunc.hllapi(out f, Data, out l, out rc);
}
public static UInt32 GetCursorPos(out int p)
{
StringBuilder Data = new StringBuilder(0);
UInt32 rc=0;
UInt32 f=HA_QUERY_CURSOR_LOC;
UInt32 l=0; //return position
UInt32 r = EhllapiFunc.hllapi(out f, Data, out l, out rc);
p = (int)l;
return r;
}
public static UInt32 SendStr(string cmd)
{
StringBuilder Data = new StringBuilder(cmd.Length);
//Data has the length of cmd string

Data.Append(cmd);
UInt32 rc=0;
UInt32 f=HA_SENDKEY;
UInt32 l=(UInt32)cmd.Length;
//l parameter contain the length of cmd string

return EhllapiFunc.hllapi(out f, Data, out l, out rc);


}

public static UInt32 ReadScreen(int position, int len, out string txt)
{
StringBuilder Data = new StringBuilder(3000);
//Initialization to a MAX char
//(> maximum number of char in a screen session)

UInt32 rc=(UInt32)position;
//set initial position to start reading from

UInt32 f=HA_COPY_PS_TO_STR;
UInt32 l=(UInt32)len;
//set the number of chars that
//function will read from position

UInt32 r = EhllapiFunc.hllapi(out f, Data, out l, out rc);


txt=Data.ToString(); //result
https://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 3/6
4/24/2021 Using EHLLAPI in C# - CodeProject
return r;
}
public static UInt32 Wait()
//just wait for execution of a command on session
{
StringBuilder Data = new StringBuilder(0);
UInt32 rc=0;
UInt32 f=HA_WAIT ;
UInt32 l=0;
UInt32 r = EhllapiFunc.hllapi(out f, Data, out l, out rc);
return r;
}

Using EhllapiWrapper Class


A typical use of the wrapper class is this one:

1. Connect to session.
2. Set cursor position.
3. Send string.
4. Read screen.
5. Disconnect.

Some Notes

Session ID for Client Access emulator is a char where "A" identifies the first session opened, "B" the second one, and so on. You can
send a special key to the session using a particular syntax (see the comment section inside Wrapper class code). For example, ENTER
corresponds to @E, F1 key to @1, and so on.

Demo Code
Demo code includes a simple form containing five buttons (one for every method). I used a different color to identify functions and
parameters. Form has TopMost = true, so it remains visible when you interact with session. So start a Client Access session, specify
ID (typically "A" if it's the first session started), and push Connect. A message box is displayed with return code.

License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

https://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 4/6
4/24/2021 Using EHLLAPI in C# - CodeProject

Luca BertonciniI'm a Delphi programmer since the 1.0 version.


Web Developer My acual interest concern all modern language and development tools.
Italy I'm a runner (3H:12M) to Pisa Marathon in 2002.

Comments and Discussions


 

You must Sign In to use this message board.

Search Comments

First Prev Next

not able to load pcshll32.dll


gillu08 11-Mar-21 0:17

connection
Membro 14718217 16-Jan-20 9:22

IBM i series access for Windows


Member 12973327 8-Aug-19 8:48

need to load dynmically PCSHL32/ehlapi32/whlapi32 dll in same program


Rajat_Arora 6-Jun-19 4:38

Getting field of an Emulator


Rajat_Arora 4-Jun-19 23:43

How do i send command Enter to EMulator


Member 12088213 12-May-19 6:22

Re: How do i send command Enter to EMulator


Rajat_Arora 10-Jun-19 1:13

Where i can download PCSHLL32.DLL


Member 12277439 14-Feb-19 14:28

Can Rest API use this approach to call IBM PCOMM


ArindamSarkar 3-Sep-18 20:18

Getting error Unable to load DLL 'PCSHLL32.dll':


Member 11086058 25-Jun-18 23:40

Re: Getting error Unable to load DLL 'PCSHLL32.dll':

https://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 5/6
4/24/2021 Using EHLLAPI in C# - CodeProject

Nicholas Carlson 30-Nov-18 5:04

Re: Getting error Unable to load DLL 'PCSHLL32.dll':


DKANO 16-May-19 18:39

a similar solution for vs 2017 and the newer I Access


Member 13691418 23-Feb-18 12:09

Re: a similar solution for vs 2017 and the newer I Access


Eduardo Oceguera 16-Apr-18 7:19

Appreciate your effort but unable to run the project!


Member 13678866 15-Feb-18 11:04

Re: Appreciate your effort but unable to run the project!


Nicholas Carlson 30-Nov-18 5:02

how to do you use a dll?


Member 13266908 21-Jun-17 3:22

Re: how to do you use a dll?


Nicholas Carlson 30-Nov-18 5:20

Error ( an attempt to load a program with an incorrect format was made.)


everton.rpa 5-Jul-16 4:48

Re: Error ( an attempt to load a program with an incorrect format was made.)
Member 10020480 19-Aug-16 11:26

Re: Error ( an attempt to load a program with an incorrect format was made.)
everton.rpa 19-Aug-16 12:15

[EHLLAPI.EhllapiWrapper]::SendStr("@E") returning 5 rc
Kingkongclicker 21-Jun-16 1:02

Re: [EHLLAPI.EhllapiWrapper]::SendStr("@E") returning 5 rc


Kingkongclicker 21-Jun-16 1:05

Re: [EHLLAPI.EhllapiWrapper]::SendStr("@E") returning 5 rc


Fatih Cihan 25-Apr-17 3:44

How use SHIFT+F11, SHIFT+F12


Member 1640644 1-Jun-16 6:08

Refresh 1 2 3 Next ᐅ

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink Layout: fixed | fluid Article Copyright 2005 by Luca Bertoncini


Advertise Everything else Copyright © CodeProject, 1999-
Privacy 2021
Cookies
Terms of Use Web03 2.8.20210423.2

https://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 6/6

You might also like