BBS: Inland Empire Archive Date: 05-12-92 (21:51) Number: 18 From: DOUGLAS LUSHER Refer#: NONE To: RICK PEDLEY Recvd: NO Subj: HMM Conf: (2) Quik_Bas
I'm afraid, Mr. Parisien that someone gave you some bad info a couple of days ago in this echo about how to get the length of an .EXE file from its header. If you tested what you were given I'm sure you found, as I did, that it sometimes gave incorrect results. I am posting to you herein (and to anyone else who cares to make use of them) a couple of functions that you may find useful if you pursue the idea of appending data to the end of the program file that will use the data. One function corrects the info that you were given previously, returning the correct file size for the .EXE file name passed to it. (At least it gave the correct size in all my tests.) The second function returns the name of the currently executing program, including the disk drive and complete path. If you have appended data to the end of an .EXE file, your program must be able to find that file to read the data or write new data. If you just embed the name that you intend to give the program in the code, you may face some problems. First, a user may rename the file (you know those users...), and second, a user may have your program in a subdirectory listed in his/her path and run your program while logged into another subdirectory - how then would your program "find itself"? The function I have provided solves both these problems. Below is a sample program demonstrating these functions and how they can be used. My program does only string data, but of course data of all types may be appended to an .EXE file and manipulated using these techniques. Enjoy, everyone. DECLARE FUNCTION EXEFileLength& (FileName$) DECLARE FUNCTION ProgramName$ () REM $INCLUDE: 'qb.bi' DEFINT A-Z DIM SHARED Register AS RegType CLS PN$ = ProgramName$ L& = EXEFileLength&(PN$) Poem$(1) = "Mary had a little lamb" Poem$(2) = " Whose fleece was white as snow," Poem$(3) = "And everywhere that Mary went" Poem$(4) = " The lamb was sure to go." OPEN PN$ FOR APPEND AS #1 FOR Z = 1 TO 4 PRINT #1, Poem$(Z) NEXT CLOSE #1 OPEN PN$ FOR INPUT AS #1 SEEK #1, L& + 1 FOR Z = 1 TO 4 LINE INPUT #1, Z$: PRINT Z$ NEXT CLOSE #1 PRINT TYPE Sample em AS STRING * 33 END TYPE DIM Po AS Sample Poem$(1) = "Mary had another lamb " Poem$(2) = " Whose fleece was black as soot," Poem$(3) = "And everywhere that Mary went " Poem$(4) = " His sooty foot he put. " OPEN PN$ FOR BINARY AS #1 PUT #1, L& + 1, Poem$(1) PUT #1, , Poem$(2) PUT #1, , Poem$(3) PUT #1, , Poem$(4) CLOSE #1 OPEN PN$ FOR BINARY AS #1 SEEK #1, L& + 1 FOR Z = 1 TO 4 GET #1, , Po: PRINT Po.em NEXT CLOSE #1 END FUNCTION EXEFileLength& (FileName$) STATIC File = FREEFILE OPEN FileName$ FOR INPUT AS File A$ = INPUT$(6, File) CLOSE File Pages& = ASC(MID$(A$, 6)) * 256& + ASC(MID$(A$, 5)) Extra& = ASC(MID$(A$, 4)) * 256& + ASC(MID$(A$, 3)) IF Extra& THEN Pages& = Pages& - 1 EXEFileLength& = Pages& * 512& + Extra& END FUNCTION FUNCTION ProgramName$ STATIC 'find Program Segment Prefix Register.AX = &H6200 CALL Interrupt(&H21, Register, Register) 'change to that segment DEF SEG = Register.BX 'from the PSP get the DOS environment segment and change to it DEF SEG = PEEK(45) * &H100 + PEEK(44) 'now scan for two consecutive null bytes Ptr = 0 DO WHILE PEEK(Ptr) OR PEEK(Ptr + 1): Ptr = Ptr + 1: LOOP 'the program name is stored three bytes beyond the two nulls Ptr = Ptr + 4 'now find the length of the program name string by scanning for the 'null byte that terminates it Length = 0 DO WHILE PEEK(Ptr + Length): Length = Length + 1: LOOP 'pull out the program name string and exit Temp$ = SPACE$(Length) FOR X = 1 TO Length MID$(Temp$, X) = CHR$(PEEK(Ptr + X - 1)) NEXT DEF SEG ProgramName$ = Temp$: Temp$ = "" END FUNCTION --- TMail v1.28 * Origin: TC-AMS MLTBBS 2.2 - Minnetonka, MN (612)-938-4799 (1:282/7)
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET