用Delphi修改系统环境变量

本文介绍如何使用Delphi编写程序来复制Oracle客户端文件夹、修改注册表并设置系统的环境变量,包括具体的Delphi代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

第二个是写注册表。

第三个是注册环境变量。

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

[delphi]  view plain  copy
  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls,Registry,ShellAPI;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     btnAddOraCli: TButton;  
  12.     procedure btnAddOraCliClick(Sender: TObject);  
  13.   private  
  14.     { Private declarations }  
  15.   public  
  16.     { Public declarations }  
  17.   procedure SetEnvPath; //设置环境变量  
  18.   function CopyOraFiles(const SourDir,DestDir :string) :Boolean; //复制整个文件夹  
  19.   end;  
  20.   
  21. var  
  22.   Form1: TForm1;  
  23.   
  24. implementation  
  25.   
  26. {$R *.dfm}  
  27.   
  28. procedure TForm1.btnAddOraCliClick(Sender: TObject);  
  29. var  
  30.   sbtnCaption : string;  
  31. begin  
  32.   sbtnCaption := btnAddOraCli.Caption;  
  33.   btnAddOraCli.Enabled := False;  
  34.   btnAddOraCli.Caption := '正在复制文件';  
  35.   if not CopyOraFiles('Ora_Cli''C:/'then  
  36.   begin  
  37.     ShowMessage('复制文件出错,Oracle客户端没有设置成功');  
  38.     Exit;  
  39.   end;  
  40.   WinExec('merge.bat',sw_hide);  //运行批处理文件,合并注册表信息  
  41.   btnAddOraCli.Caption :='正在设置环境变量';  
  42.   SetEnvPath;  
  43.   btnAddOraCli.Enabled := True;  
  44.   btnAddOraCli.Caption := sbtnCaption;  
  45. end;  
  46.   
  47. function TForm1.CopyOraFiles(const SourDir, DestDir: string): Boolean;  
  48. var  
  49.   fOPStruct :TSHFileOpStruct;  
  50. begin  
  51.   {网上抄来的COPY文件的方法}  
  52.   FillChar(fOPStruct,SizeOf(fOPStruct),0);  
  53.   with fOPStruct do  
  54.   begin  
  55.     Wnd := 0;  
  56.     wFunc := FO_COPY;  
  57.     pFrom := PChar(SourDir + #0);  
  58.     pTo := PChar(DestDir +#0);  
  59.     fFlags := FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR ;  
  60.   end;  
  61.   if (SHFileOperation(fOPStruct) = 0and (fOPStruct.fAnyOperationsAborted = False) then //检查返回值是0表示成功,再检查用户是否取消了复制  
  62.     Result := True  
  63.   else  
  64.     Result := False;  
  65. end;  
  66.   
  67.   
  68. procedure TForm1.SetEnvPath;  
  69. var  
  70.   reg : TRegistry;  
  71.   sLMKey : string;  
  72.   sCurStr : string;  
  73.   sStrToAdd: string;  
  74.   sName: string;  
  75. begin  
  76.   sLMKey := 'System/CurrentControlSet/Control/Session Manager/Environment';  //环境变量保存在注册表的这个位置  
  77.   sName := 'Path'//我们要修改的是Path环境变量  
  78.   sStrToAdd := 'C:/Ora_Cli/bin'//要添加的环境变量  
  79.   reg := TRegistry.Create;  
  80.   try  
  81.     reg.RootKey := HKEY_LOCAL_MACHINE;  
  82.     if reg.OpenKey(sLMKey,False) then  
  83.     begin  
  84.       sCurStr := reg.ReadString(sName); //读取环境变量  
  85.       if Pos(sStrToAdd,sCurStr) = 0 then  //判断此环境变量是否已经存在  
  86.       begin  
  87.         sCurStr := sCurStr + ';' + sStrToAdd;  //把'C:/Ora_Cli/bin'这个值加入到环境变量的最后  
  88.   
  89.         {网上看到的方法都是用WriteString这个函数来写Path环境变量, 可是我用了就有问题 
  90.          用了这个函数后,系统对%systemroot%,这带%的变量就不翻译了,有很多命令如ping就不能用了, 
  91.          会说ping不是可执行命令等等,后来经高手提醒说:用WriteExpandString就没问题了。 
  92.          看了Delphi的帮助,有这么一句: 
  93.          Call WriteExpandString to store a string that contains unexpanded references to environment variables such as %PATH% 
  94.         }  
  95.         //reg.WriteString(sName,sCurStr);   //用这句就有问题  
  96.         reg.WriteExpandString(sName,sCurStr);  //把值写到注册表里  
  97.         reg.CloseKey;  
  98.         SetEnvironmentVariable(PChar(sName),PChar(sCurStr));//更新当前进程的环境变量  
  99.         SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,Integer(PChar('Environment'))); //通知所有上层窗口,环境参数变化  
  100.         ShowMessage('Oracle客户端安装成功');  
  101.       end  
  102.       else  
  103.         ShowMessage('此环境变量已经存在');  
  104.     end;  
  105.   except  
  106.     on E: Exception do  
  107.     begin  
  108.       reg.Free;  
  109.       ShowMessage('Error: ' + E.Message);  
  110.       Exit;  
  111.     end;  
  112.   end;  
  113.   reg.Free;  
  114. end;  
  115.   
  116. end.  

 

 

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

regedit /s Instal_Ora_Cli.reg

 

 

注册表文件内容如下:

 

[xhtml]  view plain  copy
  1. Windows Registry Editor Version 5.00  
  2.   
  3. [HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE]  
  4. "ORACLE_HOME"="C://Ora_Cli"  
  5. "ORACLE_HOME_NAME"="OraHome92"  
  6. "ORACLE_GROUP_NAME"="Oracle - OraHome92"  
  7. "NLS_LANG"="AMERICAN_AMERICA.US7ASCII"  
  8. "VOBHOME2.0"="C://Ora_Cli"  
  9.   
  10. [HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES]  
  11. "HOME_COUNTER"="1"  
  12. "DEFAULT_HOME"="OraHome92"  
  13. "LAST_HOME"="0"  
  14.   
  15. [HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES/ID0]  
  16. "NAME"="OraHome92"  
  17. "PATH"="C://Ora_Cli"  
  18. "NLS_LANG"="NA"  
  19.   
  20. [HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0]  
  21. "ID"="0"  
  22. "ORACLE_GROUP_NAME"="Oracle - OraHome92"  
  23. "ORACLE_HOME_NAME"="OraHome92"  
  24. "ORACLE_HOME"="C://Ora_Cli"  
  25. "NLS_LANG"="AMERICAN_AMERICA.US7ASCII"  
  26. "ORAMTS_CP_TRACE_LEVEL"="0"  
  27. "ORAMTS_CONN_POOL_TIMEOUT"="120"  
  28. "ORAMTS_SESS_TXNTIMETOLIVE"="120"  
  29. "ORAMTS_NET_CACHE_MAXFREE"="5"  
  30. "ORAMTS_NET_CACHE_TIMEOUT"="120000"  
  31. "ORAMTS_OSCREDS_MATCH_LEVEL"="OS_AUTH_LOGIN"  
  32. "ORACLE_HOME_KEY"="Software//ORACLE//HOME0"  

Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值