您的位置:首页 > 编程语言 > Delphi

用Delphi修改系统环境变量

2010-09-02 08:55 579 查看
最近有个程序,要用到Oracle客户端,又不想用官方的,就想自己写一个用来安装。要安装Oracle客户端有几个工作要做:

第一个是复制Oracle客户端文件。

第二个是写注册表。

第三个是注册环境变量。

用Delphi怎么修改系统的环境变量呢,上网找了一下,写了下面的程序,怕以后忘记了,贴上来。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Registry,ShellAPI;

type
TForm1 = class(TForm)
btnAddOraCli: TButton;
procedure btnAddOraCliClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure SetEnvPath; //设置环境变量
function CopyOraFiles(const SourDir,DestDir :string) :Boolean; //复制整个文件夹
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnAddOraCliClick(Sender: TObject);
var
sbtnCaption : string;
begin
sbtnCaption := btnAddOraCli.Caption;
btnAddOraCli.Enabled := False;
btnAddOraCli.Caption := '正在复制文件';
if not CopyOraFiles('Ora_Cli', 'C:/') then
begin
ShowMessage('复制文件出错,Oracle客户端没有设置成功');
Exit;
end;
WinExec('merge.bat',sw_hide);  //运行批处理文件,合并注册表信息
btnAddOraCli.Caption :='正在设置环境变量';
SetEnvPath;
btnAddOraCli.Enabled := True;
btnAddOraCli.Caption := sbtnCaption;
end;

function TForm1.CopyOraFiles(const SourDir, DestDir: string): Boolean;
var
fOPStruct :TSHFileOpStruct;
begin
{网上抄来的COPY文件的方法}
FillChar(fOPStruct,SizeOf(fOPStruct),0);
with fOPStruct do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := PChar(SourDir + #0);
pTo := PChar(DestDir +#0);
fFlags := FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR ;
end;
if (SHFileOperation(fOPStruct) = 0) and (fOPStruct.fAnyOperationsAborted = False) then //检查返回值是0表示成功,再检查用户是否取消了复制
Result := True
else
Result := False;
end;

procedure TForm1.SetEnvPath;
var
reg : TRegistry;
sLMKey : string;
sCurStr : string;
sStrToAdd: string;
sName: string;
begin
sLMKey := 'System/CurrentControlSet/Control/Session Manager/Environment';  //环境变量保存在注册表的这个位置
sName := 'Path'; //我们要修改的是Path环境变量
sStrToAdd := 'C:/Ora_Cli/bin'; //要添加的环境变量
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey(sLMKey,False) then
begin
sCurStr := reg.ReadString(sName); //读取环境变量
if Pos(sStrToAdd,sCurStr) = 0 then  //判断此环境变量是否已经存在
begin
sCurStr := sCurStr + ';' + sStrToAdd;  //把'C:/Ora_Cli/bin'这个值加入到环境变量的最后

{网上看到的方法都是用WriteString这个函数来写Path环境变量, 可是我用了就有问题
用了这个函数后,系统对%systemroot%,这带%的变量就不翻译了,有很多命令如ping就不能用了,
会说ping不是可执行命令等等,后来经高手提醒说:用WriteExpandString就没问题了。
看了Delphi的帮助,有这么一句:
Call WriteExpandString to store a string that contains unexpanded references to environment variables such as %PATH%
}
//reg.WriteString(sName,sCurStr);   //用这句就有问题
reg.WriteExpandString(sName,sCurStr);  //把值写到注册表里
reg.CloseKey;
SetEnvironmentVariable(PChar(sName),PChar(sCurStr));//更新当前进程的环境变量
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,Integer(PChar('Environment'))); //通知所有上层窗口,环境参数变化
ShowMessage('Oracle客户端安装成功');
end
else
ShowMessage('此环境变量已经存在');
end;
except
on E: Exception do
begin
reg.Free;
ShowMessage('Error: ' + E.Message);
Exit;
end;
end;
reg.Free;
end;

end.


merge.bat批处理文件的内容如下:

regedit /s Instal_Ora_Cli.reg

注册表文件内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE]
"ORACLE_HOME"="C://Ora_Cli"
"ORACLE_HOME_NAME"="OraHome92"
"ORACLE_GROUP_NAME"="Oracle - OraHome92"
"NLS_LANG"="AMERICAN_AMERICA.US7ASCII"
"VOBHOME2.0"="C://Ora_Cli"

[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES]
"HOME_COUNTER"="1"
"DEFAULT_HOME"="OraHome92"
"LAST_HOME"="0"

[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES/ID0]
"NAME"="OraHome92"
"PATH"="C://Ora_Cli"
"NLS_LANG"="NA"

[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0]
"ID"="0"
"ORACLE_GROUP_NAME"="Oracle - OraHome92"
"ORACLE_HOME_NAME"="OraHome92"
"ORACLE_HOME"="C://Ora_Cli"
"NLS_LANG"="AMERICAN_AMERICA.US7ASCII"
"ORAMTS_CP_TRACE_LEVEL"="0"
"ORAMTS_CONN_POOL_TIMEOUT"="120"
"ORAMTS_SESS_TXNTIMETOLIVE"="120"
"ORAMTS_NET_CACHE_MAXFREE"="5"
"ORAMTS_NET_CACHE_TIMEOUT"="120000"
"ORAMTS_OSCREDS_MATCH_LEVEL"="OS_AUTH_LOGIN"
"ORACLE_HOME_KEY"="Software//ORACLE//HOME0"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: