代码之家  ›  专栏  ›  技术社区  ›  Harvey

可以将vs_版本信息添加到非exe文件中吗?

  •  2
  • Harvey  · 技术社区  · 15 年前

    我的Windows同事问我是否可以修改我的非Windows二进制文件,以便在Windows下检查它们的“属性”时,它们可以看到一个“版本”选项卡,类似于为Visual Studio编译的exe显示的选项卡。

    具体来说,我有一些gzip二进制文件,我想知道是否可以修改它们来满足这个需求。如果有更好的方法,那也没关系。

    有没有办法让我的二进制文件看起来像是exe文件?

    我尝试简单地将vs_version_info块从notepad.exe添加到我的一个二进制文件的末尾,希望Windows扫描该块,但它不起作用。

    我尝试编辑关于作者、主题、修订等的其他信息,这些信息不会修改文件,只会创建另一个数据分叉(什么是Windows术语?)在ntfs中的文件。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Brian R. Bondy    15 年前

    Windows不支持它,因为每个文件类型都有自己的文件格式。但这并不意味着你不能完成它。存储在dll和exes中的资源是文件格式的一部分。

    向用户显示:

    如果希望向用户显示此信息,最好使用属性页外壳扩展来完成。您将创建一个外观相似的页面,但不会使用完全相同的页面。有一个非常好的多部分 tutorial on shell extensions ,包括以该链接开头的属性页。

    实际存储资源的位置:

    您可以将资源存储到单独的 alternate data stream 在同一个文件上。这将使原始文件流在磁盘上没有损坏,并且不会导致其主文件大小发生更改。

    备用数据流允许多个数据流与文件名相关联。每个流都由冒号标识 : 在文件名和标识符的末尾。

    例如,您可以通过执行以下操作来创建它们:

    记事本测试.txt:adsname1
    记事本测试.txt:adsname2
    记事本test.txt

    获取正常的win32 API工作:

    如果你想要正常的API工作,你必须 intercept the Win32 APIs :loadLibraryEx、findResource、loadResource和lockResource。但这可能不值得麻烦,因为您已经创建了自己的属性页。

        2
  •  0
  •   jdigital    15 年前

    在缺少shell扩展的情况下,无法想到任何方法来执行此操作。我过去采用的方法是一个单独的“普查”程序,它知道如何从任何类型的文件中读取版本信息。

    通过使用一个将zip文件转换为自解压zip的程序,可以将zip文件转换为exe文件(我知道WinZip这样做了,很可能还有免费的实用程序来实现这一点; here's one that came up on a search 但我还没试过呢)。一旦你有了一个exe,你就应该能够使用像 Resource Hacker 更改版本信息。

        3
  •  0
  •   Dingo    15 年前

    这行不通。要么Windows必须知道每种文件格式,要么在附加了版本信息的情况下不会干扰任何文件格式。

        4
  •  0
  •   Shay Erlichmen    15 年前

    不,资源节只能在内部 PE (可移植可执行文件;exe、dll、sys)。
    它不仅仅是将数据放入文件中,还有一个表指向文件头中的数据。

    如果您有NTFS驱动器,可以使用 NTFS stream to store custom properties 这样,二进制文件的联系人将保持不变,但您需要使用自定义外壳扩展来显示流的内容。