环境变量

 
我在做一个Delphi7的绿色版,用Inno setup 来做了一个绿化注册程序(初学),想在注册的时候把delphi的目录添加到系统环境变量path中,不重启立即生效.倒是找到相关的代码,不过是delphi的,没法在inno setup script中运行. 特请教对Inno setup script 熟悉的达人. 
下面是我的CODE段代码: 

var 
  FRootDir: string; 
  
procedure _SetDelphiPath(aIsInstall: Boolean); 
var 
  S_Path, s: string; 
  S1: string; 
begin 
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM/CurrentControlSet/Control/Session Manager/Environment', 'Path', S_Path) then 
  begin 
    if aIsInstall then 
      S1 := ExpandConstant('{src}/bin') 
    else 
      S1 := FRootDir + '/bin'; 

    if pos(Uppercase(S1), Uppercase(S_Path)) = 0 then //还没有加入 
    begin 
      if aIsInstall then 
      begin 
        S_Path := S_Path + ';' + S1; 
      end; 
    end else 
      if not aIsInstall then 
      begin 
        StringChangeEx(S_Path, S1 + ';', '', True); 
        StringChangeEx(S_Path, S1, '', True); 
      end; 

    if aIsInstall then 
      S1 := ExpandConstant('{src}/Projects/bpl') 
    else 
      S1 := FRootDir + '/Projects/bpl'; 

    if pos(Uppercase(S1), Uppercase(S_Path)) = 0 then //还没有加入 
    begin 
      if aIsInstall then 
      begin 
        S_Path := S_Path + ';' + S1; 
      end; 
    end else 
      if not aIsInstall then 
      begin 
        StringChangeEx(S_Path, S1 + ';', '', True); 
        StringChangeEx(S_Path, S1, '', True); 
      end; 

    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM/CurrentControlSet/Control/Session Manager/Environment', 'Path', S_Path); 
  end; 
end; 

procedure DeinitializeUninstall(); 
begin 
  _SetDelphiPath(False); 
end; 

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
begin 
  FIsExists := False; 
  if CurUninstallStep = usUninstall then 
  begin 
    if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE/Borland/Delphi/7.0', 'RootDir', FRootDir) then 
    begin 
      StringChangeEx(FRootDir, '//', '/', True); 
      FRootDir := RemoveBackslash(FRootDir); 
    end; 
  end; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
var 
  SL: TStringList; 
  S1: string; 
begin 
  if CurPageID = wpFinished then 
  begin 
    _SetDelphiPath(True); 

  
  //关键问题在下面的代码如何实现? 
  //SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,Integer(Pchar('Environment'))); 
  //这是我找到的delphi里的方法,在inno setup script里该怎么写?或是有其它的方法?
 
  end; 
end;  
 
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数: 17

 

  • dejoy用户头像
  • dejoy
  • (燕青)
  • 等 级:
  • 2

#1楼 得分:0回复于:2008-04-27 08:58:56
inno setup 中貌似有一个ChangesEnvironment属性,已经设为true,不过似乎不起作用,新建一个DOS窗口后查看Path还是没添加的. 
Inno setup 肯定是能做到的,因为Delphi 7 Second Edition v7.2安装程序也是用它做的,它的安装完成后系统变量就立即生效了,但没它的inno script,不知是如何做的.
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • hongqi162用户头像
  • hongqi162
  • (失踪的月亮)
  • 等 级:
  • 14

    更多勋章
#2楼 得分:10回复于:2008-04-27 20:06:43
没弄过,帮顶了
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • hongqi162用户头像
  • hongqi162
  • (失踪的月亮)
  • 等 级:
  • 14

    更多勋章
#3楼 得分:10回复于:2008-04-27 20:09:05
你写一个bat然后调用这个bat可以么,很多安装程序都是这样做的
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • dejoy用户头像
  • dejoy
  • (燕青)
  • 等 级:
  • 2

#4楼 得分:0回复于:2008-04-28 14:35:26
引用 3 楼 hongqi162 的回复:
你写一个bat然后调用这个bat可以么,很多安装程序都是这样做的 

BAT可以修改全局环境变量么?不行吧?再说BAT能使修改的变量立即生效吗?
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • suiyunonghen用户头像
  • suiyunonghen
  • (不得闲)
  • 等 级:
#5楼 得分:20回复于:2008-04-28 15:45:28
还要 在InnoSetUp中SendMessage啊! 
没试过这样使用!顶一顶,有机会验证一下看看. 
建议楼主去找一份InnoSetUp的源代码把里面相应的部分修改一下,改成自己需要支持的脚本功能啊.
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • dejoy用户头像
  • dejoy
  • (燕青)
  • 等 级:
  • 2

#6楼 得分:0回复于:2008-04-28 19:39:50
已解决~~~ 

原来是没有在正确的inno事件中调用. 
正确的方法 
设置ChangesEnvironment后,需要在正确的事件中调用,安装时需要在以下调用 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
  if CurStep = ssInstall then 
    _SetDelphiPath(True); 

end; 
卸载时需要在以下调用: 
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
begin 
  if CurUninstallStep = usUninstall then 
  begin 
    _SetDelphiPath(False); 
  end; 
end; 

之前的 
procedure CurPageChanged(CurPageID: Integer); 
begin 
  if CurPageID = wpFinished then 
  ..... 
调用时inno已经通知刷新系统变量了,所以不起作用.要在通知刷新之前调用,经过试验前面两个事件时机结果正确. 
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • dejoy用户头像
  • dejoy
  • (燕青)
  • 等 级:
  • 2

#7楼 得分:0回复于:2008-04-28 19:41:22
放分了 有需要的赶快来
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • hongqi162用户头像
  • hongqi162
  • (失踪的月亮)
  • 等 级:
  • 14

    更多勋章
#8楼 得分:0回复于:2008-04-28 22:00:21
:)
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • SmallHand用户头像
  • SmallHand
  • (火龍)
  • 等 级:
#9楼 得分:10回复于:2008-04-29 09:57:26
楼主求甚解的精神值得学习。 
我要知道怎么来的,还要知道是怎么没的。呵呵。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • byteh
  • (火星菠菜)
  • 等 级:
#10楼 得分:10回复于:2008-04-29 10:28:52
up and mark
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • meiZiNick用户头像
  • meiZiNick
  • (三太子)
  • 等 级:
#11楼 得分:10回复于:2008-05-01 06:27:45
我也想了解,谢谢LZ.
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • knowledge_Is_Life用户头像
  • knowledge_Is_Life
  • (阿凡)
  • 等 级:
#12楼 得分:10回复于:2008-05-01 14:08:12
都是很好的建议! 值得学习
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • tipfoo用户头像
  • tipfoo
  • 等 级:
#13楼 得分:100回复于:2008-09-15 21:30:51
更完美的解决方案 
http://legroom.net/software/modpath
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • maimihui
  • (java_小子)
  • 等 级:
#14楼 得分:10回复于:2008-09-28 12:40:15
不懂!顶了!

你可能感兴趣的:(String,dos,脚本,Integer,Path,Delphi)