设置环境变量path的简单问题(50分)

  • 主题发起人 主题发起人 tjaofeng
  • 开始时间 开始时间
T

tjaofeng

Unregistered / Unconfirmed
GUEST, unregistred user!
2000系统,程序是一个外壳框架,调用很多BPL组成
在一个BPL中调用SetEnvironmentVariable设置PATH,希望所有的BPL都能使用这个PATH
但是好象只有在本BPL中才有效,我在电脑的属性-设置环境变量 看到PATH确实已经改变了
,但是程序里还是找不到这个路径,但是这时如果我在电脑的属性设置里按下确定时,整个程序
里的BPL就都可以用这个PATH了,我想是不是按下确定时,系统会重新载入PATH这个变量呢?
那是什么函数,还是什么别的情况?
 
这个问题不是很难吧,为什么没有人回答阿
up!up!
 
修改注册表
 
修改注册表,然后发送消息。如下Kingron的代码

{类似SetGlobalEnvironment('aa', 'bb', True);来完成,最后一项为True,该设置仅仅对当前用户有效,False,对所有用户都有效}

{*********************************************}
{ Set Global Environment Function }
{ Coder : Kingron,2002.8.6 }
{ Bug Report : Kingron@163.net }
{ Test OK For Windows 2000 Advance Server }
{ Parameter: }
{ Name : environment variable name }
{ Value: environment variable Value }
{ Ex: SetGlobalEnvironment('MyVar','OK') }
{*********************************************}

function SetGlobalEnvironment(const Name, Value: string;
const User: Boolean = True): Boolean;
resourcestring
REG_MACHINE_LOCATION = 'System/CurrentControlSet/Control/Session Manager/Environment';
REG_USER_LOCATION = 'Environment';
begin
with TRegistry.Create do
try
if User then { User Environment Variable }
Result := OpenKey(REG_USER_LOCATION, True)
else { System Environment Variable }
begin
RootKey := HKEY_LOCAL_MACHINE;
Result := OpenKey(REG_MACHINE_LOCATION, True);
end;
if Result then
begin
WriteString(Name, Value); { Write Registry for Global Environment }
{ Update Current Process Environment Variable }
SetEnvironmentVariable(PChar(Name), PChar(Value));
{ Send Message To All Top Window for Refresh }
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
end;
finally
Free;
end;
end; { SetGlobalEnvironment }
 
改注册表的方法我已经用过了,看到注册表里的键值也确实改过了,可程序里就是没有变
但是在电脑的属性设置里更改时,程序里马上就可以用了,注意这时程序本身并没有关掉
真是郁闷,我的想法是我在电脑的属性设置里更改时调用了不知什么API函数,要能监控
一下就好拉,不知有没有这种工具,还有不知大家这种情况是怎么处理的,以下是我
更改PATH的两种方法:
1、procedure SetPath;
var
cur_path:string;
lib_path:string;
begin
cur_path:=GetEnvironmentVariable('path');
Lib_path := ExtractFilePath(Application.ExeName);
cur_path := cur_path +';'+ Lib_path;
SetEnvironmentVariable('path',pchar(cur_path));
end;
2、procedure SetPath;
var
cur_path: string;
App_path: string;
Reg: TRegistry;
begin
reg := TRegistry.Create;
App_path := ExtractFilePath(Application.ExeName);
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('/SYSTEM/CurrentControlSet/Control/Session Manager/Environment', True) then
cur_path := reg.ReadString('path');
if pos(App_path, cur_path) = 0 then
begin
cur_path := cur_path +';'+ App_path;
reg.WriteString('path', cur_path);
end
finally
Reg.CloseKey;
Reg.Free;
end;
end;
请大家帮忙看看
 
缺这个:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
 
ok 搞定,其实说这么多就是为这句话:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
 
接受答案了.
 
后退
顶部