论坛风格切换切换到宽版
  • 5076阅读
  • 12回复

怎样通过附加任务来决定是否向hosts写入内容? [复制链接]

上一主题 下一主题
离线bank-w3000
 

发帖
195
金钱
1220
威望
122
只看楼主 倒序阅读 0 发表于: 2013-11-05

想通过向hosts文件写入网址的方式来屏蔽广告,看了一些相关的帖子,没有达到想要的结果。
想要达到的结果是:
1、在附加任务选择页面添加一个选项:通过hosts屏蔽广告。
2、如果勾选该项,程序开始安装时则向hosts文件写入诸如 127.0.0.1 www.abcd.com 这样的内容;如果不勾选该项,则不写hosts。
3、如果写入了hosts,卸载时则清除向hosts写入的内容,即恢复hosts被修改前的状态。
请求虎哥及各位帮助。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2013-11-06
离线bank-w3000

发帖
195
金钱
1220
威望
122
只看该作者 2 发表于: 2013-11-06
回 1楼(gnatix) 的帖子
gnatix:这个帖子看过了吗?http://bbs.hanzify.org/read-htm-tid-60508.html (2013-11-06 04:17) 

看过了一些,不是很懂,虎哥能否根据顶楼的要求给写出代码来学习使用啊!
离线bank-w3000

发帖
195
金钱
1220
威望
122
只看该作者 3 发表于: 2013-11-06
回 1楼(gnatix) 的帖子
gnatix:这个帖子看过了吗?http://bbs.hanzify.org/read-htm-tid-60508.html (2013-11-06 04:17)

之前试着通过替换hosts文件的方式来弄,不过这样会存在弊端,不想用这样的方式。
可是通过Tasks控制Code来决定是否向hosts写入及卸载时清除写入内容就不会了,虎哥帮忙啊!
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2013-11-07
  1. [Setup]
  2. AppName=My Program
  3. AppVerName=My Program version 1.5
  4. DefaultDirName={pf}\My Program
  5. DefaultGroupName=My Program
  6. [Tasks]
  7. Name: noad; Description: "通过 hosts 屏蔽广告(&D)"
  8. [code]
  9. const
  10.   myMark = '由 XYZ 添加';   // 作为标识,用来标识你修改的内容
  11. function GetFileAttributes(lpFileName: String): Cardinal;
  12.   external 'GetFileAttributesA@kernel32.dll stdcall';
  13. function SetFileAttributes(lpFileName: String; dwFileAttributes: Cardinal): Boolean;
  14.   external 'SetFileAttributesA@kernel32.dll stdcall';
  15. function LineInFile(sLine, fPath: string): Boolean;
  16. var
  17.   aos: TArrayOfString;
  18.   i: Integer;
  19. begin
  20.   Result:= false;
  21.   if LoadStringsFromFile(fPath, aos) then
  22.     for i:= 0 to GetArrayLength(aos)-1 do
  23.       if aos[i] = sLine then
  24.         begin
  25.           Result := true;
  26.           Exit;
  27.         end;
  28. end;
  29. procedure AddHosts(newItem, comments: string);
  30. var
  31.   OldFileAttribute: Cardinal;
  32.   hfPath, newLine: string;
  33. begin
  34.   hfPath := ExpandConstant('{sys}\drivers\etc\hosts');
  35.   if not LineInFile(newItem, hfPath) then       // 仅添加 Hosts 中还没有的项目
  36.     begin
  37.       OldFileAttribute:= GetFileAttributes(hfPath);
  38.       SetFileAttributes(hfPath, FILE_ATTRIBUTE_NORMAL);
  39.       newLine := newItem + ' # ' + myMark;
  40.       If comments > ' ' then
  41.         newLine := newLine + ' / ' + comments;
  42.       SaveStringToFile(hfPath, #13#10 + newLine, True);
  43.       SetFileAttributes(hfPath, OldFileAttribute);
  44.     end;
  45. end;
  46. procedure RemoveHosts(sItem: string);
  47. var
  48.   OldFileAttribute: Cardinal;
  49.   hfPath, newLine: string;
  50.   stl: TStringList;
  51.   i: Integer;
  52. begin
  53.   hfPath := ExpandConstant('{sys}\drivers\etc\hosts');
  54.   newLine := sItem + ' # ' + myMark;
  55.   stl:= TStringList.Create;
  56.   stl.LoadFromFile(hfPath);
  57.   for i:= stl.Count-1 downto 0 do
  58.     if Pos(newLine, stl.Strings[i]) = 1 then
  59.       stl.Delete(i);
  60.   OldFileAttribute:= GetFileAttributes(hfPath);
  61.   SetFileAttributes(hfPath, FILE_ATTRIBUTE_NORMAL);
  62.   stl.SaveToFile(hfPath);
  63.   stl.Free;
  64.   SetFileAttributes(hfPath, OldFileAttribute);
  65. end;
  66. procedure CurStepChanged(CurStep: TSetupStep );
  67. begin
  68.   if CurStep = ssPostInstall then         // 安装文件前检查
  69.     if IsTaskSelected('noad') then        // 是否选择了相应的任务
  70.       begin
  71.         AddHosts('127.0.0.1 www.abcd.com', '你的注释');       // 在 Hosts 中添加新项目,带注释
  72.         AddHosts('127.0.0.1 www.abcd.net', '');               // 在 Hosts 中添加新项目,不带注释
  73.       end;
  74. end;
  75. procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep );
  76. begin
  77.   if CurUninstallStep = usUninstall then   // 卸载文件前
  78.     begin
  79.       RemoveHosts('127.0.0.1 www.abcd.com');        // 从 Hosts 中删除项目
  80.       RemoveHosts('127.0.0.1 www.abcd.net');        // 从 Hosts 中删除项目
  81.     end;
  82. end;



离线bank-w3000

发帖
195
金钱
1220
威望
122
只看该作者 5 发表于: 2013-11-07
收到,谢谢虎哥帮助!
离线bank-w3000

发帖
195
金钱
1220
威望
122
只看该作者 6 发表于: 2013-11-08
回 4楼(gnatix) 的帖子
gnatix:[Setup]AppName=My ProgramAppVerName=My Program version 1.5DefaultDirName={pf}\My ProgramDefaultGroupName=My Program....... (2013-11-07 06:50) 

虎哥能不能做到,如果没有选择写入hosts的任务,卸载时就不去读写hosts了。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 7 发表于: 2013-11-08
当然能够做到,但是没有必要。即使安装时没有选择写入hosts的任务,卸载时还是会尝试删除项目,这个没有问题,因为它不会真的删除任何项目的。通过设置一个标识,即常量 myMark,程序保证只会处理由你添加的项目。
如果你一定要在卸载时检查是否在安装时真的写入了 hosts,那么你需要读取保存在注册表里面的安装信息。
离线bank-w3000

发帖
195
金钱
1220
威望
122
只看该作者 8 发表于: 2013-11-08
回 7楼(gnatix) 的帖子
gnatix:当然能够做到,但是没有必要。即使安装时没有选择写入hosts的任务,卸载时还是会尝试删除项目,这个没有问题,因为它不会真的删除任何项目的。通过设置一个标识,即常量 myMark,程序保证只 .. (2013-11-08 02:39) 

虎哥,你说的对,我也明白。
但是让人纠结的一点是,对hosts的操作,许多安全软件都会拦截并提示,如果没有选择写入hosts任务,卸载时安全软件弹出的拦截提示,会让有的人产生误会,他会怀疑你的软件在卸载时是不是在搞小动作啊?
既然能够做到,还是尽量避免可能产生的误会好些啊,虎哥。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 9 发表于: 2013-11-08
  1. #define AppID "FDBDCE28-5522-494B-B75A-E515082A312D"
  2. [Setup]
  3. AppId={#AppID}
  4. AppName=My Program
  5. AppVerName=My Program version 1.5
  6. DefaultDirName={pf}\My Program
  7. DefaultGroupName=My Program
  8. [Tasks]
  9. Name: noad; Description: "通过 hosts 屏蔽广告(&D)"
  10. [code]
  11. const
  12.   myMark = '由 XYZ 添加';   // 作为标识,用来标识你修改的内容
  13. function GetFileAttributes(lpFileName: String): Cardinal;
  14.   external 'GetFileAttributesA@kernel32.dll stdcall';
  15. function SetFileAttributes(lpFileName: String; dwFileAttributes: Cardinal): Boolean;
  16.   external 'SetFileAttributesA@kernel32.dll stdcall';
  17. function LineInFile(sLine, fPath: string): Boolean;
  18. var
  19.   aos: TArrayOfString;
  20.   i: Integer;
  21. begin
  22.   Result:= false;
  23.   if LoadStringsFromFile(fPath, aos) then
  24.     for i:= 0 to GetArrayLength(aos)-1 do
  25.       if aos[i] = sLine then
  26.         begin
  27.           Result := true;
  28.           Exit;
  29.         end;
  30. end;
  31. procedure AddHosts(newItem, comments: string);
  32. var
  33.   OldFileAttribute: Cardinal;
  34.   hfPath, newLine: string;
  35. begin
  36.   hfPath := ExpandConstant('{sys}\drivers\etc\hosts');
  37.   if not LineInFile(newItem, hfPath) then       // 仅添加 Hosts 中还没有的项目
  38.     begin
  39.       OldFileAttribute:= GetFileAttributes(hfPath);
  40.       SetFileAttributes(hfPath, FILE_ATTRIBUTE_NORMAL);
  41.       newLine := newItem + ' # ' + myMark;
  42.       If comments > ' ' then
  43.         newLine := newLine + ' / ' + comments;
  44.       SaveStringToFile(hfPath, #13#10 + newLine, True);
  45.       SetFileAttributes(hfPath, OldFileAttribute);
  46.     end;
  47. end;
  48. procedure RemoveHosts(sItem: string);
  49. var
  50.   OldFileAttribute: Cardinal;
  51.   hfPath, newLine: string;
  52.   stl: TStringList;
  53.   i: Integer;
  54. begin
  55.   hfPath := ExpandConstant('{sys}\drivers\etc\hosts');
  56.   newLine := sItem + ' # ' + myMark;
  57.   stl:= TStringList.Create;
  58.   stl.LoadFromFile(hfPath);
  59.   for i:= stl.Count-1 downto 0 do
  60.     if Pos(newLine, TrimLeft(stl.Strings[i])) = 1 then
  61.       stl.Delete(i);
  62.   OldFileAttribute:= GetFileAttributes(hfPath);
  63.   SetFileAttributes(hfPath, FILE_ATTRIBUTE_NORMAL);
  64.   stl.SaveToFile(hfPath);
  65.   stl.Free;
  66.   SetFileAttributes(hfPath, OldFileAttribute);
  67. end;
  68. function WasTaskSelected(sTask, AppID: String): boolean;
  69. var
  70.   sSelectedTasks: String;
  71. begin
  72.   sSelectedTasks := '';
  73.   RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppID+'_is1',
  74.                             'Inno Setup: Selected Tasks', sSelectedTasks);
  75.   Result := Pos(sTask, sSelectedTasks) > 0;
  76. end;
  77. procedure CurStepChanged(CurStep: TSetupStep );
  78. begin
  79.   if CurStep = ssPostInstall then         // 安装文件前检查
  80.     if IsTaskSelected('noad') then        // 是否选择了相应的任务
  81.       begin
  82.         AddHosts('127.0.0.1 www.abcd.com', '你的注释');       // 在 Hosts 中添加新项目,带注释
  83.         AddHosts('127.0.0.1 www.abcd.net', '');               // 在 Hosts 中添加新项目,不带注释
  84.       end;
  85. end;
  86. procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep );
  87. begin
  88.   if CurUninstallStep = usUninstall then   // 卸载文件前检查
  89.     if WasTaskSelected('noad', '{#AppID}') then   // 安装时是否选择了相应的任务
  90.       begin
  91.         RemoveHosts('127.0.0.1 www.abcd.com');        // 从 Hosts 中删除项目
  92.         RemoveHosts('127.0.0.1 www.abcd.net');        // 从 Hosts 中删除项目
  93.       end;
  94. end;