16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"Wininit.iniの使用例 (注意:長文です)"
この発言に対し以下のコメントが寄せられています
#00806 Satobe さん RE:Wininit.iniの使用例
Wininit.iniはWindows再起動時の初期化時にファイル
を削除またはリネームをするための設定ファイルです。
実現法を指南してくださった JCG00336 Satobeさん、
ご助言くださった FMSDEV/MES/7のみなさんありがとう
ございました。
● Wininit.iniの内容
***************************************************
[rename]
NUL=削除したいファイル
上書きされるファイル = リネームしたいファイル
***************************************************
例1)C:\MSDOS.001というファイルを削除する設定を書
き込みます。
InitFile.WriteString
('Rename', 'NUL', 'C:\MSDOS.001');
例2)C:\MSDOS.001を、MSDOS.SYSとリネームする設定を
書き込みます。
InitFile.WriteString
('Rename', 'C:\MSDOS.SYS', 'C:\MSDOS.001');
なお、Wininit.iniの内容は再起動後のWindows起動の
際、「設定ファイルを更新しています」のメッセージの
時に処理され、Wininit.bakにバックアップされた後、
削除されます。
何かのアプリケーションのインストール時、「今すぐ
再起動しますか?」のメッセージが出ますね。その時、
NOを押して、C:\Windows\Wininit.iniを覗いてみたらい
かがでしょう?
● 以下、Wininit.iniの使用例です。プロジェクトを作成
しプロジェクトマネージャでUnit1を削除後、dprファイル
のuse節以下をコピー、gosafeという名前で保存してくだ
さい。
n-tack HZY01767
/////////////////// gosafe.dpr ///////////////////
program gosafe; // < ここは自動で変更される。
{******* 使用する場合はここ以後をコピー *******}
uses
IniFiles, SysUtils, Windows, ShellAPI;
var
WinPath,BootDrv:String;
Result1:Integer;
Param:String;
{------- WritePrivateProfileString API-------}
procedure UpdateFile(Filename:String);
begin
WritePrivateProfileString(nil, nil, nil, PChar(Filename));
end;
{------- MSDOS.SYS -------}
function SetMsdos:Integer;
var
SysFile:TIniFile;
begin
SysFile:= TIniFile.Create(BootDrv + ':\MSDOS.SYS');
try
// Get Windows Directory. (c:\windows or a:\windows ???)
WinPath:= SysFile.ReadString('Paths','WinDir','ERROR');
if WinPath='ERROR' then begin
Result:= 10;
Exit;
end;
// Get Host Windows BootDrive. (c:\ or a:\ ???)
BootDrv:= SysFile.ReadString('Paths','HostWinBootDrv','ERROR');
if BootDrv='ERROR' then begin
Result:= 11;
Exit;
end;
// MSDOS.SYS を MSDOS.001 という名前でBackupする
CopyFile(PChar(BootDrv + ':\MSDOS.SYS'), PChar(BootDrv + ':\MSDOS.
001'), False);
// Change MSDOS.SYS Attr.
if not (FileSetAttr(BootDrv + ':\MSDOS.SYS',faArchive)=0) then
begin
Result:= 12;
Exit;
end;
// Wait;
UpdateFile(BootDrv + ':\MSDOS.SYS');
// MSDOS.SYS に BootSafe=1を追加する
SysFile.WriteBool('Options','BootSafe',True);
// Wait;
UpdateFile(BootDrv + ':\MSDOS.SYS');
// SetBack MSDOS.SYS Attr.
FileSetAttr(BootDrv + ':\MSDOS.SYS',faReadOnly + faHidden);
finally
SysFile.Free;
end;
Result:= 0;
end;
{------- ERROR SETBACK -------}
function SetBack:Integer;
var
SysFile:TIniFile;
begin
Result:= 13;
SysFile:= TIniFile.Create(BootDrv + ':\MSDOS.SYS');
try
// Change MSDOS.SYS Attr.
if not (FileSetAttr(BootDrv + ':\MSDOS.SYS',faArchive)=0) then
begin
Result:= 99;
Exit;
end;
// Wait
UpdateFile(BootDrv + ':\MSDOS.SYS');
// MSDOS.SYS に BootSafe=0を追加する
SysFile.WriteBool('Options','BootSafe',False);
// Wait
UpdateFile(BootDrv + ':\MSDOS.SYS');
// SetBack MSDOS.SYS Attr.
FileSetAttr(BootDrv + ':\MSDOS.SYS',faReadOnly + faHidden);
finally
SysFile.Free;
end;
end;
{------- Wininit.ini -------}
function SetWininit:Integer;
var
InitFile:TIniFile;
begin
try
// Change .\Windows\Wininit.ini Attr.
if FileExists(WinPath + '\Wininit.ini') then
if not (FileSetAttr(WinPath + '\Wininit.ini',faArchive)=0) then
Exit;
except
Result:= SetBack; // エラーのためMSDOS.SYSの内容の書き戻し
Exit;
end;
InitFile:= TIniFile.Create(WinPath + '\Wininit.ini');
try
// C:\MSDOS.001をC:\MSDOS.SYSにリネームする設定をWininit.iniへ書き
込む
InitFile.WriteString('Rename', BootDrv + ':\MSDOS.SYS', BootDrv +
':\MSDOS.001');
finally
InitFile.Free;
end;
Result:= 0;
end;
{------- Entry Point -------}
begin
if FileExists('C:\MSDOS.SYS') then BootDrv:='C'
else if FileExists('A:\MSDOS.SYS') then BootDrv:='A';
// When ERROR:99 Case, Running with Param '-setback'.
Param:= LowerCase(ParamStr(1));
if Param='-setback' then begin
Result1:= SetBack;
MessageBox(0,PChar('SetBack Success.'),'Message Box', mb_OK);
Exit;
end;
// Set MSDOS.SYS
Result1:= SetMsdos;
if Result1>0 then begin
MessageBox(0,PChar('ERROR (' + IntToStr(Result1) + ')'),'Message
Box', mb_OK);
Exit;
end;
// Set Wininit.ini
Result1:= SetWininit;
if Result1= 99 then begin
MessageBox(0,PChar('ERIOUS ERROR(99) : Look ''Error.txt'' File,
and Edit MSDOS.SYS.'),'Message Box', mb_OK);
Exit;
end
else if Result1>0 then begin
MessageBox(0,PChar('ERROR (' + IntToStr(Result1) + ')'),'Message
Box', mb_OK);
Exit;
end;
// Reboot
ExitWindowsEx(EWX_REBOOT, 0);
end.
Original document by n-tack 氏 ID:(HZY01767)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|