论坛风格切换切换到宽版
  • 2880阅读
  • 7回复

请教老虎版主获取路径问题? [复制链接]

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 倒序阅读 0 发表于: 2015-09-21
一、WPS
Windows Registry Editor Version 5.00
只有32位版本,HKLM32
[HKEY_LOCAL_MACHINE\SOFTWARE\Kingsoft\Office\6.0\Common]
"InstallRoot"="C:\\Program Files (x86)\\Kingsoft\\WPS Office Professional"

; 获取 SOFTWARE\Wow6432Node\Kingsoft\Office\x.y\Common,第一个x
; 获取 安装路径,getpath
;写入 ini
;FileName: "{app}\abc.ini"; Section: "Path"; Key: "Default"; String: "{code:getpath}\office{code:x}\wps.exe";

二、MS Office

Windows Registry Editor Version 5.00
32位版本:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Word\InstallRoot]
"Path"="C:\\Program Files (x86)\\Microsoft Office\\Office15\\"

64位版本:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Word\InstallRoot]
"Path"="C:\\Program Files (x86)\\Microsoft Office\\Office15\\"

;获取 Word 路径,15.0 是变动的,请教老虎版主怎么获取路径?
;FileName: "{app}\abc.ini"; Section: "Path"; Key: "Default"; String: "{code:getpath}\WINWORD.EXE";

弄了很多遍了,都找不到路径,请教老虎版主到底该怎么弄?越弄越晕?

  1. //获取安装路径
  2. function GetPath(Param: String): String;
  3. var
  4. i, j: Integer;
  5. strPath: String;
  6. subkeynames1, subkeynames2: TArrayOfString;
  7. begin
  8.   Result:=ExpandConstant('LH-U');
  9.    if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  10.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  11.      if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  12.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  13.           if RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j], 'InstallLocation', strPath) then
  14.             strPath:=strPath;
  15.             Result:= strPath;
  16.    if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  17.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  18.      if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  19.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  20.           if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j], 'InstallLocation', strPath) then
  21.             strPath:=strPath;
  22.             Result:= strPath;
  23. end;
  24. function Getversion(Param: String): String;
  25. var
  26. i, j: Integer;
  27. oversion: String;
  28. subkeynames1, subkeynames2: TArrayOfString;
  29. begin
  30. oversion := ExpandConstant('LH-U');
  31. if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\Office') then
  32. begin
  33. if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  34.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  35.      if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  36.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  37.           if RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j], 'DisplayVersion', oversion) then
  38.             oversion:=copy(oversion,1,2);
  39.             Result:= oversion;
  40. end;
  41. if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Office') then
  42. begin
  43. if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  44.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  45.      if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  46.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  47.           if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j], 'DisplayVersion', oversion) then
  48.             oversion:=copy(oversion,1,2);
  49.             Result:= oversion;
  50. Result:= oversion;
  51. end;
  52. end;
  53. function GetPathII(Param: String): String;
  54. var
  55.   i, j: Integer;
  56.   strPath: String;
  57.   subkeynames1, subkeynames2: TArrayOfString;
  58. begin
  59.   Result:=ExpandConstant('LH-U');
  60.    if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'SOFTWARE\Kingsoft\Office', subkeynames1) then
  61.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  62.      if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i], subkeynames2) then
  63.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  64.           if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j], 'InstallRoot', strPath) then
  65.             strPath:=strPath;
  66. Result:= strPath;
  67. end;

离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2015-09-21
你的函数搞得很乱,请标明哪个函数是读取哪个软件的(MW Office 或者 WPS)。
GetPath 读取 MS Office 安装路径?
Getversion 读取 MS Office 版本?
GetPathII 读取 WPS 安装路径?

WPS 我从来没有安装过,不知道注册表里面的具体内容。但是 MS Office 在注册表里面好像不是使用 InstallLocation 键。请仔细检查一下你的代码。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 2 发表于: 2015-09-21
  1. function GetPath(Param: String): String;        // 读取 MS Office 安装路径
  2. var
  3. i, j: Integer;
  4. strPath: String;
  5. subkeynames1, subkeynames2: TArrayOfString;
  6. begin
  7.   strPath:=ExpandConstant('LH-U');
  8.   if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  9.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  10.      if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  11.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  12.           if RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j]+'\InstallRoot', 'Path', strPath) then
  13.             strPath:=strPath;
  14.   if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  15.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  16.      if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  17.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  18.           if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j]+'\InstallRoot', 'Path', strPath) then
  19.             strPath:=strPath;
  20.   Result:= strPath;
  21. end;
  22. function Getversion(Param: String): String;   // // 读取 MS Office 版本
  23. var
  24. i, j: Integer;
  25. oversion: String;
  26. subkeynames1, subkeynames2: TArrayOfString;
  27. begin
  28. oversion := ExpandConstant('LH-U');
  29. if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\Office') then
  30. begin
  31. if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  32.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  33.      if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  34.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  35.           if RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j]+'\ProductVersion', 'LastProduct', oversion) then
  36.             oversion:=copy(oversion,1,pos('.', oversion)-1);
  37. end;
  38. if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Office') then
  39. begin
  40. if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  41.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  42.      if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i], subkeynames2) then
  43.         for j:= 0 to  GetArrayLength(subkeynames2)-1 do
  44.           if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\'+subkeynames2[j]+'\ProductVersion', 'LastProduct', oversion) then
  45.             oversion:=copy(oversion,1,pos('.', oversion)-1);
  46. end;
  47. Result:= oversion;
  48. end;


离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 3 发表于: 2015-09-21
回 1楼(gnatix) 的帖子
感谢老虎版主解答,自己看导出来的注册表写的,弄错了,卸载的地方是 InstallLocation ,就是向您所说的这样:
GetPath 读取 MS Office 安装路径
FileName: "{app}\abc.ini"; Section: "Path"; Key: "Default"; String: "{code:getpath}\WINWORD.EXE";
;Getversion 读取 MS Office 版本,Microsoft Office 不需要提取版本号,只需要提取路径,自己弄得糊涂了

GetPathII 读取 WPS 安装路径,还需要获取版本号,方法应该和您提供的一样吧。

还有就是安装 WPS 的注册表也会写道 SOFTWARE\Microsoft\Office\ 下, WPS.zip (1 K) 下载次数:1
wps 也会写入SOFTWARE\Kingsoft wps2.zip (69 K) 下载次数:1
wps 也需要获取版本号,思路一样,但是同时安装了不知道怎么区分?
FileName: "{app}\abc.ini"; Section: "Path"; Key: "Default"; String: "{code:getpathII}\office{code:getwpsversion}\wps.exe";

请教老虎版主,如果两个都安装了怎么分别读取?区分开来?

就是为了打包一软件能在安装时关联外部的编辑器,写入它调用的 ini 文件.



离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2015-09-22
WPS 信息最好从 HKEY_LOCAL_MACHINE\SOFTWARE\Kingsoft\Office\x.x\common 读取。
  1. function GetPath(Param: String): String;        // 读取 MS Office 安装路径
  2. var
  3.   i: Integer;
  4.   strPath: String;
  5.   subkeynames1: TArrayOfString;
  6. begin
  7.   strPath:=ExpandConstant('LH-U');
  8.   if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  9.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  10.       if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common\InstallRoot') then
  11.         if RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]++'\common\InstallRoot', 'Path', strPath) then
  12.           strPath:=strPath;
  13.   if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  14.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  15.       if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common\InstallRoot') then
  16.         if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]++'\common\InstallRoot', 'Path', strPath) then
  17.           strPath:=strPath;
  18.   Result:= strPath;
  19. end;
  20. function Getversion(Param: String): String;   //读取 MS Office 主版本号
  21. var
  22.   i: Integer;
  23.   oversion: String;
  24.   subkeynames1: TArrayOfString;
  25. begin
  26.   oversion := ExpandConstant('LH-U');
  27.   if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\Office') then
  28.     begin
  29.       if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  30.         for i:= 0 to GetArrayLength(subkeynames1)-1 do
  31.           if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common\ProductVersion') then
  32.             if RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common\ProductVersion', 'LastProduct', oversion) then
  33.               oversion:=copy(oversion,1,pos('.', oversion)-1);
  34.     end;
  35.   if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Office') then
  36.     begin
  37.       if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Microsoft\Office', subkeynames1) then
  38.         for i:= 0 to GetArrayLength(subkeynames1)-1 do
  39.           if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common\ProductVersion') then
  40.             if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common\ProductVersion', 'LastProduct', oversion) then
  41.               oversion:=copy(oversion,1,pos('.', oversion)-1);
  42.     end;
  43.   Result:= oversion;
  44. end;
  45. function GetPathII(Param: String): String;       //读取 WPS Office 安装路径
  46. var
  47.   i: Integer;
  48.   strPath: String;
  49.   subkeynames1: TArrayOfString;
  50. begin
  51.   strPath:=ExpandConstant('LH-U');
  52.   if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Kingsoft\Office', subkeynames1) then
  53.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  54.       if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\Office\'+subkeynames1[i]+'\common') then
  55.         if RegQueryStringValue(HKLM32, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common', 'InstallRoot', strPath) then
  56.             strPath:=strPath;
  57.   if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Kingsoft\Office', subkeynames1) then
  58.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  59.       if RegKeyExists(HKLM64, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common') then
  60.         if RegQueryStringValue(HKLM64, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common', 'InstallRoot', strPath) then
  61.             strPath:=strPath;
  62.   Result:= strPath;
  63. end;
  64. function GetversionII(Param: String): String;       //读取 WPS Office 主版本号
  65. var
  66.   i: Integer;
  67.   oversion: String;
  68.   subkeynames1: TArrayOfString;
  69. begin
  70.   oversion:=ExpandConstant('LH-U');
  71.   if RegGetSubkeyNames(HKLM32, 'SOFTWARE\Kingsoft\Office', subkeynames1) then
  72.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  73.       if RegKeyExists(HKLM32, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common') then
  74.         if RegQueryStringValue(HKLM32, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common', 'Version', oversion) then
  75.             oversion:=copy(oversion,1,pos('.', oversion)-1);
  76.   if RegGetSubkeyNames(HKLM64, 'SOFTWARE\Kingsoft\Office', subkeynames1) then
  77.     for i:= 0 to GetArrayLength(subkeynames1)-1 do
  78.       if RegKeyExists(HKLM64, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common') then
  79.         if RegQueryStringValue(HKLM64, 'SOFTWARE\Kingsoft\Office\'+subkeynames1[i]+'\common', 'Version', oversion) then
  80.             oversion:=copy(oversion,1,pos('.', oversion)-1);
  81.   Result:= oversion;
  82. end;



离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 5 发表于: 2015-09-22
回 4楼(gnatix) 的帖子
gnatix:WPS 信息最好从 HKEY_LOCAL_MACHINE\SOFTWARE\Kingsoft\Office\x.x\common 读取。function GetPath(Param: String): String;        // 读取 MS Office 安装路径var  i: Integer;  strPath: Stri .. (2015-09-22 01:08)

老虎版主,你提取的版本号不对,应该是 WPS 不循规蹈矩,它是 Office\6.0\common 中的 6.03.00.9402,和下面的不一致:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Kingsoft\Office\6.0\common]
"DefaultLanguage"=dword:00000804
"InstallRoot"="C:\\Program Files (x86)\\Kingsoft\\WPS Office 2013"
"Version"="9.1.0.4569"
"ProfessionalVersionNumber"="9.1.0.4569"
"DisplayName"="WPS Office 2013 专业增强版 (9.1.0.4569)"

WPS 2013 中 wps 的位置就是:
C:\Program Files (x86)\Kingsoft\WPS Office 2013\office6\wps.exe

请教老虎版主能否直接从 SOFTWARE\Wow6432Node\Kingsoft\Office\6.0\common 提取 6; 另外, WPS 只有 32位,不用提取 HKLM64;


还有就是:
在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ 下的信息就和 Microsoft Office 的一样了,应该可以通过您给的方法提取到 ;
就是因为一样,所以请教老虎版主,在两个都安装的情况下,怎么知道提取的是 WPS 的路径,还是 MS Office 的路径?像:

MS Office 的:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Word\InstallRoot]
"Path"="C:\\Program Files (x86)\\Microsoft Office\\Office15\\"


不知道能否从提取的路径中检测是否有 Microsoft Office ,有的话就作为路径提取出来;
检测到有 Kingsoft 就直接略过,但不知是否可以在 SOFTWARE\Wow6432Node\Kingsoft\Office\6.0\common 直接提取 路径 + 6.0;




WPS 的注册表内容,跟 Microsoft Office 差不多,所以提取了不知道到底是哪个的路径, WPS 还需要提取如 WPS 2013 写入的 6.0 版本号:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\11.0\Word\InstallRoot]
"path"="C:\\Program Files (x86)\\Kingsoft\\WPS Office 2013"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\10.0\Common\ProductVersion]
"LastProduct"="6.03.00.9402"


还有就是,老虎版主,我安装脚本中有 Check 函数检测到底安装 WPS 或 MS Office 没,用在写 ini 后检查,所以这里乱填了一个,应该可以不要吧
Result:=ExpandConstant('LH-U');
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 6 发表于: 2015-09-23
就凭 WPS 在注册表里面写东西的乱哄劲,只能说这种垃圾东西不用也罢。
如果 WPS 也是往 MS 里面写东西,那么你只能先假设是 MS,然后检查相应的程序文件是否存在,再假设是 WPS,然后检查相应的程序文件是否存在。

离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 7 发表于: 2015-09-24
回 6楼(gnatix) 的帖子
gnatix:就凭 WPS 在注册表里面写东西的乱哄劲,只能说这种垃圾东西不用也罢。如果 WPS 也是往 MS 里面写东西,那么你只能先假设是 MS,然后检查相应的程序文件是否存在,再假设是 WPS,然后检查相应的 .. (2015-09-23 01:22) 

感谢老虎版主,终于解决了