【问题标题】:HTA Self-Modifying Code?HTA自修改代码?
【发布时间】:2017-11-09 17:24:11
【问题描述】:

我想尝试制作一个在会话之间保存一些数据的 HTA。该文件可能会从一台计算机移动到另一台计算机,所以我不想依赖cookies,并且它没有一些远程服务器来保存数据,所以我希望找到一种方法来使用像vbscript这样的脚本来编写将保存数据返回给 HTA 本身,以便应用程序下次运行时,它已经拥有最新信息。

我可能会在代码中将一行行作为变量声明列表用于初始化应用程序。应用程序中会有某种“保存”按钮,它将读取这些变量的当前状态并编辑 hta 文件的源代码,特别是在这些行上,并用当前值替换这些值。

由于 HTA 文件本质上只是一个具有不同扩展名的文本文件,我认为有一种方法可以让 HTA 像任何其他文件一样编辑自身……但我实际上不知道该怎么做,或者如何隔离变量将驻留的代码行并对其进行编辑,而不必将整个文件加载到内存中并在每次我想保存某些内容时保存整个内容...我想保持完全独立,所以我不想依赖像 XML 或 CSV 这样的外部文件来存储会话之间的设置,所以我希望能够将数据嵌入到 HTA 中。

【问题讨论】:

    标签: vbscript hta


    【解决方案1】:

    您确实可以在运行时修改 HTA 文件,因为它是解释代码。您可以在浏览器中查看时修改 HTML 文件。

    但是,除非有某些令人信服的理由,您必须将所有内容保存在 1 个文件中,否则我不会这样做。 如果写入 HTA 时出现问题,您最终会得到一个空白文件并丢失所有内容。因此,我建议使用纯文本文件来存储您的数据并将其包含在您的 HTA 中。

    MyApp.hta

    <!doctype html>
    <HTA:APPLICATION
      APPLICATIONNAME="MyApp"
      SINGLEINSTANCE="yes"
      CONTEXTMENU="no"
      ICON=""
      ID="HTA"
      INNERBORDER="no"
      NAVIGABLE="no"
      SCROLL="yes"
      SHOWINTASKBAR="yes"
      VERSION="0.0.1"
    />
    <html lang="en-US">
    <head>
      <meta charset="UTF-8" />
      <meta http-equiv="X-UA-Compatible" content="IE=9" />
      <title>MyApp</title>
      <style type="text/css">
        body { font-family: Calibri, Arial; font-size: 20px; }
        label { font-weight: bold; }
        .settings__container { position: relative; height: 200px; border: 2px dashed #ccc; overflow: hidden; padding-right: 2px; }
        #settings { width: 100%; height: 100%; border: 0; }
      </style>
    </head>
    <body>
      <label>Settings:</label>
      <div class="settings__container">
        <textarea id="settings"></textarea>
      </div>
      <button id="save-settings__button">Save Now</button>
      <script type="text/javascript">
        (function() {
          var settingsElement = document.getElementById('settings'),
              settingsFile = "MyApp.settings.txt",
              io = new ActiveXObject('Scripting.FileSystemObject');
    
          function loadSettings() {
            try {
              var file = io.OpenTextFile(settingsFile, 1),
                  data = file.ReadAll();
    
              file.Close();
              settingsElement.value = data;
            } catch(e) {
              // Failed to load settings; settings file may not exist yet.
            }
          }
    
          function saveSettings(data) {
            var file = io.OpenTextFile(settingsFile, 2, true);
            file.Write(data);
            file.Close();
          }
    
          // Assuming IE9+
          document.getElementById('save-settings__button').addEventListener('click', function(e) {
            saveSettings(settingsElement.value);
          });
    
          // Load the settings file
          addEventListener('load', function(e) {
            loadSettings();
          });
    
          // Save the settings on exit
          addEventListener('unload', function(e) {
            saveSettings(settingsElement.value);
          });
        })();
      </script>
    </body>
    </html>
    

    【讨论】:

      【解决方案2】:

      看看FileSystemObject。如果您使用的是 vbscript,则需要

      • 使用OpenTextFile 打开 HTA 文件
      • 读取文件
      • 修改要更改的行
      • CreateTextFile将新内容写入文件(覆盖设置为True)

      对于使用Javascript,过程相同,方法略有不同。

      【讨论】:

      • 我还没有尝试过,但我想确定...文件被锁定了?我认为 IE 以只读方式打开文件,因此不会锁定文件,除非它们首次加载到内存中,所以我假设我可以在 HTA 已经打开时安全地保存它,但我想在我开始编写一堆无法工作的代码之前,请确保。
      猜你喜欢
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2014-02-06
      • 2013-06-29
      • 2023-04-05
      • 2013-10-12
      • 2012-02-01
      • 2012-05-06
      相关资源
      最近更新 更多