# PROGRAM NAME : HLLAPI interface - ctypes version # Author: Stefano Spinucci # Written: 2002/02/16 # DESCRIPTION # This program interface the 3270 HLLAPI library of an Italian 3270 emulator using # the ctypes library (home page : http://starship.python.net/crew/theller/ctypes.html # or on sourceforge : http://sourceforge.net/projects/ctypes) # The calling scheme for the function is : # void FAR PASCAL hllapi(int FAR *, char FAR *, int FAR *, int FAR *); # NOTE : # <from ctypes docs> Internally ctypes makes heavy use of the new type system introduced # in Python 2.2, so it will not work in earlier versions. from ctypes import windll, c_int, c_string, c_char_p, byref # ------------------------------------------------------------------------------------------------ # dll initialization # ------------------------------------------------------------------------------------------------ #Load the dll 'Ehllapi.dll' (the file .py is in the same directory of the dll) Ehllap32 = windll.ehllap32 #Load the function 'hllapi' from the dll hllapi = Ehllap32.hllapi # ------------------------------------------------------------------------------------------------ # variables setting and function calling # ------------------------------------------------------------------------------------------------ #Set the variables h_func = c_int(1) h_text = c_string('A') #alternatively to "h_text = c_string('A')" you can use "h_text = c_char_p('A')" h_len = c_int(1) h_ret = c_int(999) #Function calling hllapi(byref(h_func), h_text, byref(h_len), byref(h_ret)) #Print the value returned print h_func.value print h_text.value print h_len.value print h_ret.value # PROGRAM NAME : HLLAPI interface - calldll version # Author: Stefano Spinucci # Written: 2002/02/16 # DESCRIPTION # This program interface the 3270 HLLAPI library of an Italian 3270 emulator using # the calldll library (from Sam Rushing http://www.nightmare.com/software.html) # I've found very useful also edll.py from http://pages.ccapcable.com/lac/undergroundPython.html # The calling scheme for the function is : # void FAR PASCAL hllapi(int FAR *, char FAR *, int FAR *, int FAR *); # ------------------------------------------------------------------------------------------------ # Function defining : # - myPrintLong : given a membuf with a long inside, print the long # - myPrintString : given a membuf with a string inside, print the string # - mySetLong : given a membuf with len = 4, set his value with the long passed # - mySetString : given a membuf, set his value with the string passed (adding the character \0) # ------------------------------------------------------------------------------------------------ def myPrintLong(vVar): #Print the long (first way) a= struct.unpack('I', vVar.read())[0] print a #Print the long (second way) print calldll.read_long(vVar.address()) def myPrintString(vVar): #Print the string (first way) a = vVar.read() print a[:len(a)-1] print len(a) #Print the string (second way) a = calldll.read_string(vVar.address()) print a print len(a) def mySetLong(vMemBuf, vValueToSet): string_packed = struct.pack("L",vValueToSet) # packed as unsigned long vMemBuf.write(string_packed) def mySetString(vMemBuf, vValueToSet): data_len = len(vValueToSet) pack_format = str(data_len+1)+"s" # add one for \0 at the end. string_packed = struct.pack(pack_format, vValueToSet) # pack() will add \0 for us vMemBuf.write(string_packed) # ------------------------------------------------------------------------------------------------ # Import the required library # ------------------------------------------------------------------------------------------------ #Import the calldll module import calldll #Import the struct module (a standard python module) import struct # ------------------------------------------------------------------------------------------------ # Get the handle of the dll and the address of the function # ------------------------------------------------------------------------------------------------ #Get the handle of the Dll handle = calldll.load_library ('C:\Tee3270\Ehllap32') #Get the address of the function address = calldll.get_proc_address (handle, 'HLLAPI') # ------------------------------------------------------------------------------------------------ # Initialization # ------------------------------------------------------------------------------------------------ # vFunction, vTextLen and vResult are defined as a membuf with lenght = 4, because 4 is the lenght # of an unsigned long packed with struct.pack("L", NumberToPack) vFunction = calldll.membuf(4) vTextLen = calldll.membuf(4) vResult = calldll.membuf(4) # vFunction is defined as a membuf with lenght = 1921 because the dll needs a buffer of # 1920 char + 1 for \0 at the end # You can here define a membuf of the lenght you need + 1 for the last \0 character vText = calldll.membuf(1921) # ------------------------------------------------------------------------------------------------ # Function calling # ------------------------------------------------------------------------------------------------ # Vars setting #1 mySetLong(vFunction, 1) #2 string_value_to_write = 'A' mySetString(vText, string_value_to_write) #3 mySetLong(vTextLen, len(string_value_to_write)) #4 mySetLong(vResult, 1) #Call the function calldll.call_foreign_function ( address, 'llll', 'l', (vFunction.address(), vText.address(), vTextLen.address(), vResult.address()) ) myPrintLong(vResult) myPrintString(vText) # ------------------------------------------------------------------------------------------------ # Dll unloading # ------------------------------------------------------------------------------------------------ #Unload the dll calldll.free_library (handle)