Hi, If you have a *PGM object, then it can be compiled to enforce having 1 point of entry (using *ONLY on the ENTMOD parameter). Also in multi-module *PGMs you do not really 'export' the functions used between the modules - they are statically bound and built into the program object in the compile process, and should not be available for external use under 'normal' conditions. This should be evident if you compare the output for DSPPGM output of your program to a DSPSRVPGM of a similar type of service program (which does export functions and can have many entry points). (For that matter even in a service program you do not have to export all the functions if you make a multi-module service program and you want some of the functions to stay internal to the service program's operation using binder language.) I would also compile it with 'Allow Update' *NO so none of the modules inside the program or any bound service programs can be replaced using UPDPGM. If you do not ship the modules that make up your compiled program (and I cannot see any reason to do this), and you do not make the source available, and compile it properly so it can't be updated or debugged, and if you set the program to the highest optimization level, I do not see how someone can directly invoke those procedures that are in the modules that make up the program - they should come only through the call level interface. Take care, Genyphyr Novak ------------------------------ message: 8 date: Wed, 24 May 2006 10:32:45 -0500 from: "Elvis Budimlic" <ebudimlic@xxxxxxxxxxxxxxxxxxxxxxxxx> subject: Re: [C400-L] modules and exported symbols To the best of my knowledge, there's no legit way to do that. You could ask on the MI list, as those guys would probably know if there is a non-legit way to do that. In any case, I suspect you're not selling your product to MI guys anyway so I wouldn't fret about it. Elvis -----Original Message----- Subject: [C400-L] modules and exported symbols Say that I create some modules with CRTCMOD and create a program out of them with CRTPGM. Can any of the functions exported from the modules be used by a third party in the same way one might use a service program? I think the answer is "not easily", but I'm not sure. I have a function that determines whether a given license key is valid. It's not static to the module it's in, because, of course, other parts of the program need to call it. But I don't want to provide an API that helps people brute out a key.