Wilson WindowWare Tech Support

WinBatch WinBatch+Compiler WebBatch
Home | Tech Database | Tech BBS | White Papers | Purchase


Using WININIT.INI to Install Files after Reboot in Windows 95/IntControl(30,x,x,x,x) to Move Files after Reboot for NT

Keywords:      WININIT.INI   WININIT.EXE	 IntControl(30,...)

Question:

How do I delete a Winbatch files after a WB program finishes?

Answer:

You can't do it directly. Basically you have to write a WININIT.INI file in the windows directory that is designed to take care of this. (Note that the WININIT.INI file is NOT an INI file (be careful) and as such cannot be reliably written to via the iniwritepvt function)

If you look at the WININIT.INI and .BAK files in your Windows directory you can figure out how this works.

If it is WinBatch trying to overwrite the DLL is use, we can handle it, but if it is another setup program trying to do it, some other solution must be found.

If you create a file called WININIT.INI in the Windows directory, files listed will be renamed during bootup. An example of what a WININIT.INI file might look like is:


	[rename] 
	C:\Fred\Fault.exe=C:\Fred\Fault.1 

to delete a file use:
	[rename]
	NULL=C:\Fred\Fault.exe

Note: I believe the syntax is destination = source. Looks kind of backwards. Also, this file doesn't support long file names.

The following code will delete a file. if you change NUL to the new file name that will work. Short file names only are legal I think:

	fn="c:\xxx.exe"
	if WinMetrics(-4)==4 ;NT

		;the IntControl(30...) function only works in NT (wherein it makes a call to the 
		;"CreateFile" API for file deletion or copying when the file is free, or when a reboot occurs)	
	
		IntControl(30,fn,"",0,0)  

	endif

	if WinMetrics(-4)==5 ;95
	wininitfile=strcat(DirWindows(0),"wininit.ini")

	if FileExist(wininitfile)
		ff=FileOpen(wininitfile,"APPEND")
		FileWrite(ff,strcat("NUL=",fn))
		FileClose
	else
		ff=FileOpen(wininitfile,"WRITE")
		FileWrite(ff,"[rename]")
		FileWrite(ff,strcat("NUL=",fn))
		FileClose
	endif
	endif
For 32 bit system this will delete the fn file at next reboot.

WININIT.INI General Overview:

Depending on the Windows platform that you are running on you can perform delayed renames and deletes of files via various mechanisms the next time Windows restarts itself. By setting up a delayed delete of the files you can cause the script and its required .DLL's (runtime and extenders) to be deleted the next time Windows restarts itself, thus getting around the problem of deleting open files.

Under Win3x and Win9x you have the WININIT.INI file that can perform renames to the "NUL" device, thus deleting the files. You cannot, however, work with long file names when using WININIT.INI so be prepared to translate all file names to their short file names when making entries in this .INI file. Another gotcha is the syntax required to effect a file delete with this method. All entires go in a section named [Rename] and each entry is of the form "new-name=old-name". Unfortunately, deleting involves renaming the file to a name of "NUL". Since the .INI file management routines cannot handle duplicate keyword names in a section you have to cheat as follows to make it work:

[Rename]
C:\TEMP\JUNKXXXXA.TMP=C:\PROGRA~1\MYFILES\WBDBS32I.DLL
C:\TEMP\JUNKXXXXB.TMP=C:\PROGRA~1\MYFILES\WWWNT32I.DLL
C:\TEMP\JUNKXXXXC.TMP=C:\PROGRA~1\MYFILES\MYSCRIPT.EXE
NUL=C:\TEMP\JUNKXXXX.TMP
Since the target names on the first 3 renames are 9 characters long the .INI file routines can create the entries OK and then WININIT.EXE promptly processes the target names as 8.3 names and strips the sequence characters (A,B,C...) off of the ends of the names. This results in all of the source files getting renamed to the same name and then that one file name gets deleted at the end. WININIT.EXE will rename the WININIT.INI file to WININIT.BAK after processing it.

Under WinNT you have functions available within WinBatch to set up delayed renames and deletes of files with IntControl(30,x,x,x,x).


Article ID:   W13262
Filename:   Delete Files after bootup using WinINIT.INI.txt