在Delphi里,怎么查找出某个软件的安装目录?
在Delphi里,怎么查找出某个软件的安装目录?比如JDK的安装目录,我想一点按钮就能弹出它的目录,那获取其它软件的安装目录又是怎么样???我主要是要知道怎么获取JAVA...
在Delphi里,怎么查找出某个软件的安装目录?
比如JDK的安装目录,我想一点按钮就能弹出它的目录,那获取其它软件的安装目录又是怎么样???
我主要是要知道怎么获取JAVA的安装目录,废话的别答了。。。。。。。
晕死,JDK的安装目录都不知道吗??例如c:\j2sdk1.4.0 这个就是JDK的安装目录呀 展开
比如JDK的安装目录,我想一点按钮就能弹出它的目录,那获取其它软件的安装目录又是怎么样???
我主要是要知道怎么获取JAVA的安装目录,废话的别答了。。。。。。。
晕死,JDK的安装目录都不知道吗??例如c:\j2sdk1.4.0 这个就是JDK的安装目录呀 展开
5个回答
展开全部
自认为不是废话,所以回答一下:
------------------------------------------------------------
一般程序的注册表信息写在这个位置:
HKEY_LOCAL_MACHINE\SOFTWARE\<公司名>\程序名\
如Acrobat Reader的安装路径可从以下位置取得:
HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\5.0\InstallPath
-----------------------------------------------------------
JDK 的目录一般就在
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\
但是根据安装的版本不同,会有不同的子目录,比如,1.5版本的信息就放在: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.5\ 里面,其中
"JavaHome"="X:\XXXXXX\jdk1.5" 这个键值就是他的路径了。
所以你可以用DELPHI遍历 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\ 的所有子目录,找到JavaHome键值就是了。
-----------------------------------------------------------
另一种方法是从程序的反安装信息中找程序路径,控制面板“添加/删除程序”就是调用其下的UninstallString来进行程序反安装的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
枚举其下所有项,通过DisplayName匹配你要找的程序名,通过UninstallString可得到反安装字串,解析出反安装程序路径——但注意不是所有程序的反安装路径和程序路径是一致的;
如果存在InstallLocation键,且它对应的值不为空,那就是安装路径。
-------------------------------------------
自己做的例子,已经调试通过(最顶上要加 Uses Registry 单元),如果有多个的话,取第一个应该就可以了,我现在用Showmessage都Show出来了:
procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
Val:TStrings;
ii:integer;
TmpStr:String;
begin
Reg:=TRegistry.Create();
Val:=TStringList.Create();
Try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\JavaSoft\Java Development Kit\',False) then
Reg.GetKeyNames(Val);
//Memo1.Lines.AddStrings(Val);
if Val.Count>1 then
begin
for ii:=0 to Val.Count-1 do
begin
Reg.CloseKey;
if Reg.OpenKey('SOFTWARE\JavaSoft\Java Development Kit\'+Val.Strings[ii],False) then
begin
TmpStr:=Reg.ReadString('JavaHome');
if TmpStr<>'' then
Showmessage(TmpStr);
end;
end;
end;
Finally
Reg.Free;
Val.Free;
end;
end;
//-------加了 Reg.CloseKey;
------------------------------------------------------------
一般程序的注册表信息写在这个位置:
HKEY_LOCAL_MACHINE\SOFTWARE\<公司名>\程序名\
如Acrobat Reader的安装路径可从以下位置取得:
HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\5.0\InstallPath
-----------------------------------------------------------
JDK 的目录一般就在
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\
但是根据安装的版本不同,会有不同的子目录,比如,1.5版本的信息就放在: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.5\ 里面,其中
"JavaHome"="X:\XXXXXX\jdk1.5" 这个键值就是他的路径了。
所以你可以用DELPHI遍历 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\ 的所有子目录,找到JavaHome键值就是了。
-----------------------------------------------------------
另一种方法是从程序的反安装信息中找程序路径,控制面板“添加/删除程序”就是调用其下的UninstallString来进行程序反安装的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
枚举其下所有项,通过DisplayName匹配你要找的程序名,通过UninstallString可得到反安装字串,解析出反安装程序路径——但注意不是所有程序的反安装路径和程序路径是一致的;
如果存在InstallLocation键,且它对应的值不为空,那就是安装路径。
-------------------------------------------
自己做的例子,已经调试通过(最顶上要加 Uses Registry 单元),如果有多个的话,取第一个应该就可以了,我现在用Showmessage都Show出来了:
procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
Val:TStrings;
ii:integer;
TmpStr:String;
begin
Reg:=TRegistry.Create();
Val:=TStringList.Create();
Try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\JavaSoft\Java Development Kit\',False) then
Reg.GetKeyNames(Val);
//Memo1.Lines.AddStrings(Val);
if Val.Count>1 then
begin
for ii:=0 to Val.Count-1 do
begin
Reg.CloseKey;
if Reg.OpenKey('SOFTWARE\JavaSoft\Java Development Kit\'+Val.Strings[ii],False) then
begin
TmpStr:=Reg.ReadString('JavaHome');
if TmpStr<>'' then
Showmessage(TmpStr);
end;
end;
end;
Finally
Reg.Free;
Val.Free;
end;
end;
//-------加了 Reg.CloseKey;
参考资料: http://topic.csdn.net/t/20051223/10/4476825.html
展开全部
要获得一个程序的安装目录,分两种情况
1 该程序没有运行
2 该程序正在运行
如果是情况1,那么你只有通过后台查找来确定该应用程序的路径.
如果是情况2,也就是说程序正在运行,你可以先获得进程的id,然后根据id号来找到程序的安装路径.
下面演示下情况2:
按钮btngetpro获得所有运行程序的进程名称和id,并通过id得到其安装路径,显示在列表框listbox1中。
函数:function getdirdueid(id:integer):string; 根据id得到安装路径。
程序运行需要 uses PSAPI,TLHelp32;
//根据进程id获取路径
function getdirdueid(id:integer):string;
var
h : THandle;
fileName : string;
iLen : integer;
hMod : HMODULE;
cbNeeded : DWORD;
begin
h:= OpenProcess(PROCESS_ALL_ACCESS,false,864); //240 为ID
if h >0 then
begin
if EnumProcessModules(h,@hMod,sizeof(hMod),cbNeeded) then
begin
SetLength(fileName, MAX_PATH);
iLen := GetModuleFileNameEx(h,hMod,PCHAR(fileName),MAX_PATH);
if iLen <> 0 then
begin
SetLength(fileName, StrLen(PCHAR(fileName)));
end;
end;
CloseHandle(h);
end;
result := filename;
end;
//获取进程id
procedure TForm1.btngetproClick(Sender: TObject);
var
ProcessName : string; //进程名
ProcessID : integer; //进程表示符
i : integer;
ContinueLoop:BOOL;
FSnapshotHandle:THandle; //进程快照句柄
FProcessEntry32:TProcessEntry32; //进程入口的结构体信息
stemp:string;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
ProcessID := FProcessEntry32.th32ProcessID;
stemp:='';
stemp:= '应用程序名 :'+ProcessName +'#进程ID:'+ inttostr(ProcessID);
stemp:=stemp+''+ getdirdueid(ProcessID);
Listbox1.Items.add(stemp);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
1 该程序没有运行
2 该程序正在运行
如果是情况1,那么你只有通过后台查找来确定该应用程序的路径.
如果是情况2,也就是说程序正在运行,你可以先获得进程的id,然后根据id号来找到程序的安装路径.
下面演示下情况2:
按钮btngetpro获得所有运行程序的进程名称和id,并通过id得到其安装路径,显示在列表框listbox1中。
函数:function getdirdueid(id:integer):string; 根据id得到安装路径。
程序运行需要 uses PSAPI,TLHelp32;
//根据进程id获取路径
function getdirdueid(id:integer):string;
var
h : THandle;
fileName : string;
iLen : integer;
hMod : HMODULE;
cbNeeded : DWORD;
begin
h:= OpenProcess(PROCESS_ALL_ACCESS,false,864); //240 为ID
if h >0 then
begin
if EnumProcessModules(h,@hMod,sizeof(hMod),cbNeeded) then
begin
SetLength(fileName, MAX_PATH);
iLen := GetModuleFileNameEx(h,hMod,PCHAR(fileName),MAX_PATH);
if iLen <> 0 then
begin
SetLength(fileName, StrLen(PCHAR(fileName)));
end;
end;
CloseHandle(h);
end;
result := filename;
end;
//获取进程id
procedure TForm1.btngetproClick(Sender: TObject);
var
ProcessName : string; //进程名
ProcessID : integer; //进程表示符
i : integer;
ContinueLoop:BOOL;
FSnapshotHandle:THandle; //进程快照句柄
FProcessEntry32:TProcessEntry32; //进程入口的结构体信息
stemp:string;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
ProcessID := FProcessEntry32.th32ProcessID;
stemp:='';
stemp:= '应用程序名 :'+ProcessName +'#进程ID:'+ inttostr(ProcessID);
stemp:=stemp+''+ getdirdueid(ProcessID);
Listbox1.Items.add(stemp);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,应该这样的思路,是否是一个已知软件?
其次,查找该软件安装后在注册表的登记位置。
最后,取出这个位置,就知道安装的路径了。
这个应该是最快捷,也是最能理解的方式
JAVA路径?什么意思啊,是开发工具路径,还是后台路径啊,后台的话是什么平台啊,WEBSPHERE???
其次,查找该软件安装后在注册表的登记位置。
最后,取出这个位置,就知道安装的路径了。
这个应该是最快捷,也是最能理解的方式
JAVA路径?什么意思啊,是开发工具路径,还是后台路径啊,后台的话是什么平台啊,WEBSPHERE???
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(*^__^*) 呵呵 不废话 我就少打几个字
对着软件的快捷方式 ——点属性 ——然后点—— 查找目标
OK.........................
当然 直接属性——目标 (D:\安装文件\QQ.exe)就知道怎么找了
(*^__^*)
我应该答的很少了.....
祝你好运0.........
对着软件的快捷方式 ——点属性 ——然后点—— 查找目标
OK.........................
当然 直接属性——目标 (D:\安装文件\QQ.exe)就知道怎么找了
(*^__^*)
我应该答的很少了.....
祝你好运0.........
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询