Thank you very much for the example code. I'm learning quite a bit from reading the LE and Binder manuals. I'm doing all my work from a UNIX shell, using UNIX command such as "as" and "ld". One thing that I've learned that was non-obvious to me was that the binder needs the parameters "DYNAM(DLL)" and "CASE(MIXED)" in order to work properly for my testing.
I don't know why I'm bothering. As you indicated, this does not seem to be of much interest. I guess the "real UNIX" programmers are all using C. I would be too, if I had access to a z/OS C compiler (and don't mention MVSGCC to me, I'm just not capable of getting it to work as I want it to). -- John McKown Systems Engineer IV IT Administrative Services Group HealthMarkets(r) 9151 Boulevard 26 * N. Richland Hills * TX 76010 (817) 255-3225 phone * [email protected] * www.HealthMarkets.com Confidentiality Notice: This e-mail message may contain confidential or proprietary information. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message. HealthMarkets(r) is the brand name for products underwritten and issued by the insurance subsidiaries of HealthMarkets, Inc. -The Chesapeake Life Insurance Company(r), Mid-West National Life Insurance Company of TennesseeSM and The MEGA Life and Health Insurance Company.SM > -----Original Message----- > From: IBM Mainframe Assembler List > [mailto:[email protected]] On Behalf Of Steve Comstock > Sent: Friday, March 30, 2012 9:06 AM > To: [email protected] > Subject: Re: curiosity question: How much interest in writing > / using DLLs in assembler? > > On 3/30/2012 7:35 AM, McKown, John wrote: > > This question is the outgrowth from my writing UNIX > programs which are > designed to be run from a UNIX shell prompt in HLASM. The > first "outgrowth" was > LE enabling all my UNIX HLASM code. The main reason was to be > able to easily use > some selected C language routines, especially sprintf(). > Normally, in HLASM, if > we want to dynamically invoke a subroutine, we do with with a > LOAD/BALR or LINK > function. However, that does not work well for UNIX programs > because, as best as > I can tell, you cannot LOAD or LINK to a program which > resides in a UNIX file. > You must put the subroutine in a PDS or PDSE which is > accessable to the UNIX > process. Which normally means the LINKLIST or via a dataset > referenced in the > STEPLIB environment variable. I am a bit of a "purist". When > I'm wrting a UNIX > command, I want everything to be accessable via normal UNIX > facilities. > > > > I have written a "do nothing" dll in HLASM just to try to > learn how to write > > a > DLL in HLASM. I have something that appears to work. Now, I > need to write some > HLASM which attempts to actually use that code. > > > > Has anybody else done anything with DLLs in HLASM? If so, > what did you think > of it? Another use for DLLs that I find interesting is to > have data fields in > them be EXPORTed and referenced from other programs. What is > interesting, to me, > is that all references to a DLL in an LE enclave refer to the > same copy. So any > data which is EXPORTed is, in effect, "global" to the LE > enclave. This seems a > reason way to share data. What say ye? > > > -- > > John McKown > > Systems Engineer IV > > IT > > > > Administrative Services Group > > > > HealthMarkets(r) > > > Yes, well we cover writing and using DLLs written in Assembler > in our course "Creating and Using DLLs in z/OS"; the course > is multi-lingual in that it discusses creating and invoking > DLLs with C, PL/I, COBOL, and Assembler. > > See > http://www.trainersfriend.com/Language_Environment_courses/m52 > 5descr.htm > for details. > > But it seems to be a non-starter: no one has ever requested > that we teach it. Judging by that, I would say there is not > much interest. But, there may be pockets of usage out there. > > > Note that you can load a module from the HFS using the > BPX1LOD callable service, which may be a simpler solution > to the problem you are describing. > > As for invoking a DLL from Assembler, here's some snippets from > code in that course: > > LOAD alias c'dllload' > QUERYF alias c'dllqueryfn' > QUERYV alias c'dllqueryvar > . > . > . > > * Load DLL load module CDLL12 > * > CALL LOAD,(DLL_NAME),MF=(E,GENCALL) > . > . > . > * Locate DLL function CDSUB4; if successful, call the function > * > l 2,dll_tok > CALL QUERYF,((2),F2_NAME),MF=(E,GENCALL) > st 15,f2_ptr > c 15,f0 > be outa_here > CALL (15),(STRING),MF=(E,GENCALL) > . > . > . > * Locate DLL variable data_area; if successful, change it > l 2,dll_tok > CALL QUERYV,((2),VAR_NAME),MF=(E,GENCALL) > st 15,v_ptr > c 15,f0 > be outa_here > mvc 0(l'new_str+1,15),new_str - change value > . > . > . > GENCALL CALL ,(,,,),MF=L > > dll_tok ds f > > dll_name dc c'CDLL12' > dc x'00' > > f2_name dc c'CDSUB4' > dc x'00' > > var_name dc c'data_area' > dc x'00' > > string dc c'Data from me' > dc x'00' > > new_str dc c'funny little string' > dc x'00' > > > -- > > Kind regards, > > -Steve Comstock > The Trainer's Friend, Inc. > > 303-355-2752 > http://www.trainersfriend.com > > * To get a good Return on your Investment, first make an investment! > + Training your people is an excellent investment > > * Try our tool for calculating your Return On Investment > for training dollars at > http://www.trainersfriend.com/ROI/roi.html > >
