ฉันจะตั้งค่าข้อมูลเวอร์ชันสำหรับ. exe, .dll ที่มีอยู่ได้อย่างไร?


114

ในขั้นตอนการสร้างของเราฉันจำเป็นต้องตั้งค่าข้อมูลเวอร์ชันสำหรับไบนารีที่คอมไพล์ทั้งหมดของเรา ไบนารีบางตัวมีข้อมูลเวอร์ชันอยู่แล้ว (เพิ่มในเวลาคอมไพล์) และบางส่วนไม่มี

ฉันต้องการใช้ข้อมูลต่อไปนี้:

  • ชื่อ บริษัท
  • ประกาศลิขสิทธิ์
  • ชื่อผลิตภัณฑ์
  • รายละเอียดสินค้า
  • เวอร์ชันไฟล์
  • เวอร์ชันผลิตภัณฑ์

แอ็ตทริบิวต์เหล่านี้ทั้งหมดถูกระบุโดยบิลด์สคริปต์และต้องใช้หลังจากคอมไพล์ นี่คือไบนารีมาตรฐาน (ไม่ใช่แอสเซมบลี) ที่คอมไพล์ด้วย C ++ Builder 2007

ฉันจะทำเช่นนี้ได้อย่างไร?


สำหรับสิ่งที่ใช้ResourceHacker ? วิธีการตั้งค่างาน? ในสิ่งที่มีปัญหาใช้UpdateResourceฟังก์ชั่นถ้างานอัพเดตเวอร์ชั่นใน pe ที่มีอยู่
RbMm

ลองนี้: alternativeto.net/software/xn-resource-editorผมคิดว่ามีเครื่องมือวิศวกรรมย้อนกลับทำเช่นนี้
i_thamary

คำตอบ:


60

แม้ว่าจะไม่ใช่กระบวนการแบตช์ แต่ Visual Studio ยังสามารถเพิ่ม / แก้ไขทรัพยากรไฟล์

เพียงแค่ใช้ File-> Open-> File บน. EXE หรือ. DLL สิ่งนี้มีประโยชน์สำหรับการแก้ไขข้อมูลเวอร์ชันหลังการสร้างหรือเพิ่มลงในไฟล์ที่ไม่มีทรัพยากรเหล่านี้ให้เริ่มต้นด้วย


8
สิ่งนี้ทำงานได้อย่างสมบูรณ์เมื่อฉันลองใช้ สำหรับไฟล์ที่ไม่มีข้อมูลเวอร์ชันโดยสมบูรณ์: หลังจากเปิด DLL ใน Visual Studio แล้วให้ไปที่แก้ไข> เพิ่มทรัพยากร> เวอร์ชันแล้วคลิกใหม่ จากนั้นในแท็บเวอร์ชันใหม่เปลี่ยน FILEVERSION และ PRODUCTVERSION, CompanyName และอื่น ๆ บันทึกไฟล์เท่านี้คุณก็พร้อมแล้ว!
twasbrillig

2
@UweBaemayr คำตอบที่คุณยกมาฉันต้องการถามเช่นเดียวกับที่เราสามารถทำให้เป็นอัตโนมัติได้เหมือนกับที่ฉันสร้างโพสต์เดียวกันและฉันต้องการทำให้เป็นอัตโนมัติ แต่อย่างไร?
SteveScm

1
สำหรับ Delphi win32 dll เก่าของฉันสิ่งนี้ใช้ไม่ได้ แม้ว่าข้อมูล dll จะมีการเปลี่ยนแปลงอย่างถูกต้อง แต่เมื่อเรียกใช้การตรวจสอบสติสัมปชัญญะคุณพบว่ามันเสียหาย
sthiers

3
ลองสิ่งนี้ (เพิ่มข้อมูลเวอร์ชัน) บน Windows 8, VS 2015 และทุกอย่างทำได้ดีใน Windows Explorer ยกเว้น ... ไฟล์ปฏิบัติการจะไม่เริ่มทำงานอีกต่อไป
Liviu

37

ไม่เหมือนกับคำตอบอื่น ๆ โซลูชันนี้ใช้ซอฟต์แวร์ฟรีทั้งหมด

ประการแรกสร้างไฟล์ที่เรียกว่าResources.rcดังนี้:

VS_VERSION_INFO VERSIONINFO
    FILEVERSION    1,0,0,0
    PRODUCTVERSION 1,0,0,0
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904b0"
        {
            VALUE "CompanyName",        "ACME Inc.\0"
            VALUE "FileDescription",    "MyProg\0"
            VALUE "FileVersion",        "1.0.0.0\0"
            VALUE "LegalCopyright",     "© 2013 ACME Inc. All Rights Reserved\0"
            VALUE "OriginalFilename",   "MyProg.exe\0"
            VALUE "ProductName",        "My Program\0"
            VALUE "ProductVersion",     "1.0.0.0\0"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x409, 1200
    }
}

จากนั้นใช้GoRCเพื่อรวบรวมเป็น.resไฟล์โดยใช้:

GoRC /fo Resources.res Resources.rc

(ดูความคิดเห็นของฉันด้านล่างสำหรับกระจกเงาGoRC.exe)

จากนั้นใช้Resource Hackerในโหมด CLI เพื่อเพิ่มลงใน.exe:

ResHacker -add MyProg.exe, MyProg.exe, Resources.res,,,

แค่นั้นแหละ!


1
@CharlesB ฉันสังเกตเห็นตัวเอง แต่มันเป็นลิงค์ที่ถูกต้อง ดูเหมือนมีคนลืมจ่ายเงินโฮสต์เว็บ! นี่คือไบนารีฉันได้สะท้อนไปยังบัญชี Assembla สาธารณะของฉัน: assembla.com/code/danny-beckett/subversion/nodes/13/GoRC.exe
Danny Beckett

3
คุณยังสามารถใช้ Microsoft Resource Compilerแทน GoRC สามารถใช้ได้กับ Windows SDK
Holistic Developer

ยกนิ้วให้ Resource Hacker ฉันใช้มันตามคำตอบนี้และเป็นโปรแกรมที่ยอดเยี่ยมและยอดเยี่ยม (ไม่มีความเกี่ยวข้องกับโปรแกรมหรือผู้ผลิต ;-)
user2109254

@UweKeim ฉันไม่ได้ใช้มันมาสักพักแล้ว แต่ฉันค่อนข้างแน่ใจว่ามันจำเป็น
Danny Beckett

6
ดูเหมือนว่าบรรทัดคำสั่งมีการเปลี่ยนแปลงเล็กน้อย: ResourceHacker.exe -open Source.dll -save Changed.dll -action addoverwrite -resource Version.resนอกจากนี้ ResourceHacker ยังสามารถรวบรวมไฟล์. rc ได้ด้วยตัวเอง:ResourceHacker.exe -open Version.rc -save Version.res -action compile
Yusuf TarıkGünaydın

23

หรือคุณสามารถตรวจสอบStampVerฟรีแวร์สำหรับไฟล์ exe / dll Win32
จะเปลี่ยนเฉพาะไฟล์และเวอร์ชันผลิตภัณฑ์แม้ว่าจะมีทรัพยากรเวอร์ชันอยู่แล้วก็ตาม ไม่สามารถเพิ่มทรัพยากรเวอร์ชันได้หากไม่มีอยู่


19

rceditเป็นญาติใหม่และทำงานได้ดีจากบรรทัดคำสั่ง: https://github.com/atom/rcedit

$ rcedit "path-to-exe-or-dll" --set-version-string "Comments" "This is an exe"
$ rcedit "path-to-exe-or-dll" --set-file-version "10.7"
$ rcedit "path-to-exe-or-dll" --set-product-version "10.7"

นอกจากนี้ยังมีโมดูล NPMที่ห่อหุ้มจาก JavaScript และงาน Gruntในกรณีที่คุณใช้ Grunt


5
โปรดทราบว่า rcedit สามารถแก้ไขได้เฉพาะทรัพยากรที่มีอยู่เท่านั้นไม่สามารถแทรกทรัพยากรใหม่ได้
Bevan Collins

2
ใช้ไม่ได้กับไฟล์เก็บถาวร 7zip sfx: / เพียงแค่ตัดส่วนที่เก็บ 7zip ออก
Mgamerz

1
ลองทำเช่นนี้ทำให้ไม่สามารถโหลดไฟล์ได้เมื่ออยู่ในไดเรกทอรีเดียวกันและดูเหมือนว่าเครื่องมืออาจขึ้นอยู่กับการกำหนดค่าโฮสต์
Arijoon

ทำงานร่วมกับต้นขั้ว 7zS.sfx ซึ่งเป็นส่วนแรกที่มี VERSIONINFO อยู่ภายในที่คุณใช้เพื่อเชื่อมต่อไฟล์เก็บถาวรแบบแยกตัวเองเข้าด้วยกัน คุณยังสามารถเปลี่ยนชื่อ 7zS.sfx ใน 7zS.exe ด้วยตนเองและแก้ไขได้ใน Visual Studio แต่เนื่องจากหมายเลขเวอร์ชันมีการเปลี่ยนแปลงสำหรับทุกบิลด์คุณจึงต้องการไฟล์แบตช์ที่มีคำสั่ง rcedit อยู่ภายในเพื่อตั้งค่า
AndresRohrAtlasInformatik

1
เครื่องมือนี้น่ารังเกียจมากโปรดดูข้อบกพร่องนี้ก่อนที่จะนำไปใช้กับไบนารีของคุณ: github.com/electron/rcedit/issues/51
Brun

14

อะไรประมาณนี้

verpatch /va foodll.dll %VERSION% %FILEDESCR% %COMPINFO% %PRODINFO% %BUILDINFO%

มีให้ที่นี่พร้อมแหล่งข้อมูลทั้งหมด


Verpatch ดูเหมือนจะสร้างทรัพยากรเวอร์ชันผลิตภัณฑ์ที่ไม่ดีสำหรับฉัน (โดยใช้/va /pvตัวเลือก) รุ่นปรากฏอย่างถูกต้องใน Windows Explorer VerQueryValueแต่ตัวละครสุดท้ายที่ขาดหายไปเมื่อดึงในรหัสด้วย เพื่อแก้ไขทรัพยากรที่ไม่ดีฉันทำสิ่งนี้: (1) โหลด DLL ใน Resource Hacker (2) ดูทรัพยากรเวอร์ชัน (3) คอมไพล์ (แก้ไขบางอย่างแล้วเปลี่ยนกลับเพื่อเปิดใช้งานปุ่ม) (4) บันทึก
dan-gph

verpatch ใช้งานได้ดีสำหรับ DLL ทั้งรุ่น x64 และ x86 บนกล่อง dev ของฉันอย่างไรก็ตามในโครงการสร้าง apveyor มันใช้งานได้กับ x64 เท่านั้นและไม่ได้ทำอะไรเลยกับ dll x86 - ไม่มีข้อผิดพลาดเช่นกัน! คำแนะนำใด ๆ ที่อาจเกิดขึ้น? ฉันเห็นในบันทึกของ appveyor ว่าคำสั่ง verpatch กำลังดำเนินการไม่มีข้อผิดพลาดและ dll ไม่ได้รับการแทนที่อย่างใดและในที่สุดก็ไม่มีการประทับเวอร์ชัน สำหรับ x64 ทุกอย่างทำงานได้ดีในทุกสถานการณ์ กรุณาแจ้งเบาะแสใด ๆ
Ovi

@ Ovi-Wan Kenobi: ฉันไม่รู้ว่า apveyor คืออะไร แต่ตามคำอธิบายของคุณดูเหมือนว่าฉันจะเป็นปัญหาเกี่ยวกับ apveyor มากกว่า ที่แย่ที่สุดถ้าเป็นไปได้เตรียมตัวให้พร้อมสำหรับการดีบักในสภาพแวดล้อม apveyor หรือไม่ ...
filofel

11

มีเครื่องมือนี้ChangeVersion [1]

รายการคุณสมบัติ (จากเว็บไซต์):

  • อินเทอร์เฟซบรรทัดคำสั่ง
  • รองรับไฟล์. EXE, .DLL และ. RES
  • อัปเดต FileVersion และ ProductVersion ตามเวอร์ชันมาสก์
  • เพิ่ม / เปลี่ยน / ลบสตริงคีย์เวอร์ชัน
  • ปรับแฟล็กไฟล์ (debug, special, private ฯลฯ )
  • อัปเดตไฟล์โครงการ (.bdsproj | .bpr | .bpk | .dproj)
  • เพิ่ม / เปลี่ยนไอคอนแอปพลิเคชันหลัก
  • ใช้ไฟล์ ini พร้อมการกำหนดค่า
  • รองรับ Windows Vista (ต้องการระดับความสูง)
  • ง่ายต่อการรวมเข้ากับสภาพแวดล้อมการสร้างอย่างต่อเนื่อง

การเปิดเผยข้อมูลทั้งหมด: ฉันรู้จักผู้ชายที่เขียนเครื่องมือนี้ฉันเคยทำงานกับเขา แต่นี่ก็หมายความว่าฉันรู้ว่าเขาสร้างซอฟต์แวร์ที่มีคุณภาพ)


[1]ลิงก์ถูกใช้งานแล้ว ดูเหมือนว่าจะมีรุ่นที่มิเรอร์ที่download.cnet.com


@Gareth ฉันเพิ่มลิงค์มิเรอร์ นอกจากนี้ฉันสงสัยว่าคำตอบนี้มีคุณค่าโดยไม่มีการอ้างอิงการทำงานใด ๆ
Wolf

5
ลิงก์ที่สองส่งผลให้เครื่องมือหมดอายุ"Change Version v2012.9.6.0 - (C)2007-2012 The-Software-Box.com This trial version has expired"
Preet Sangha

2
เมื่อเรียกใช้ในบรรทัดคำสั่งจะมีข้อความ "Change Version v2012.9.6.0 - (C) 2007-2012 The-Software-Box.com เวอร์ชันทดลองนี้หมดอายุแล้ว"
RDeveloper

10

ฉันกำลังทำมันโดยไม่มีเครื่องมือเพิ่มเติม ฉันเพิ่งเพิ่มไฟล์ต่อไปนี้ในโปรเจ็กต์แอพ Win32 ของฉัน

ไฟล์ส่วนหัวหนึ่งไฟล์ซึ่งกำหนดค่าคงที่บางส่วนเกินกว่าที่เราจะนำมาใช้ซ้ำในไฟล์ทรัพยากรของเราและแม้แต่ในโค้ดโปรแกรม เราต้องดูแลไฟล์เดียวเท่านั้น ขอบคุณทีมงาน Qt ที่แสดงให้ฉันเห็นถึงวิธีการทำในโปรเจ็กต์ Qt ตอนนี้มันทำงานบนแอพ Win32 ของฉันด้วย

---- [version.h] ----

#ifndef VERSION_H
#define VERSION_H

#define VER_FILEVERSION             0,3,0,0
#define VER_FILEVERSION_STR         "0.3.0.0\0"

#define VER_PRODUCTVERSION          0,3,0,0
#define VER_PRODUCTVERSION_STR      "0.3.0.0\0"

#define VER_COMPANYNAME_STR         "IPanera"
#define VER_FILEDESCRIPTION_STR     "Localiza archivos duplicados"
#define VER_INTERNALNAME_STR        "MyProject"
#define VER_LEGALCOPYRIGHT_STR      "Copyright 2016 ipanera@gmail.com"
#define VER_LEGALTRADEMARKS1_STR    "All Rights Reserved"
#define VER_LEGALTRADEMARKS2_STR    VER_LEGALTRADEMARKS1_STR
#define VER_ORIGINALFILENAME_STR    "MyProject.exe"
#define VER_PRODUCTNAME_STR         "My project"

#define VER_COMPANYDOMAIN_STR       "www.myurl.com"

#endif // VERSION_H

---- [MyProjectVersion.rc] ----

#include <windows.h>
#include "version.h"

VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",        VER_COMPANYNAME_STR
            VALUE "FileDescription",    VER_FILEDESCRIPTION_STR
            VALUE "FileVersion",        VER_FILEVERSION_STR
            VALUE "InternalName",       VER_INTERNALNAME_STR
            VALUE "LegalCopyright",     VER_LEGALCOPYRIGHT_STR
            VALUE "LegalTrademarks1",   VER_LEGALTRADEMARKS1_STR
            VALUE "LegalTrademarks2",   VER_LEGALTRADEMARKS2_STR
            VALUE "OriginalFilename",   VER_ORIGINALFILENAME_STR
            VALUE "ProductName",        VER_PRODUCTNAME_STR
            VALUE "ProductVersion",     VER_PRODUCTVERSION_STR
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END

2
แค่สงสัย; คุณหยุด windows ไม่ให้เขียนทับไฟล์. rc ของคุณทุกครั้งที่คุณเปลี่ยนกล่องโต้ตอบหรือแก้ไขทรัพยากรใด ๆ ในโครงการได้อย่างไร ฉันเคยเห็นบทความแบบนี้มาสองสามบทความแล้วและดูเหมือนว่ามันจะใช้งานได้ถ้าคุณไม่ต้องเปลี่ยนทรัพยากรอีกเลยซึ่งจะทำให้เกิดการสร้างอัตโนมัติโดย IDE
shawn1874

@ shawn1874 - รวมบรรทัด#include <windows.h>ในresource.hไฟล์ที่เพิ่มโดยอัตโนมัติ ไฟล์นั้นไม่ได้สร้างขึ้นใหม่ (สังเกตที่ด้านบนของไฟล์. rc จะระบุว่าเป็นรหัสที่สร้างขึ้นและสามารถแก้ไขได้ในตัวออกแบบ)
CJBS

1
@CJBS ที่ไม่ตอบคำถาม. แม้ว่าอาจได้ผล แต่ก็ไม่ได้อธิบายว่าคำตอบที่โพสต์อาจทำงานอย่างไร ในคำตอบที่โพสต์ user3016543 จะรวม version.h ไว้ในไฟล์. rc โดยตรง มีหลายวิธีในการจัดการกับการเขียนทับไฟล์. rc ซึ่งฉันรู้วิธีทำ ฉันแค่ตั้งคำถามกับวิธีที่แสดงคำตอบนี้เพราะมันดูไม่เหมาะกับฉัน
shawn1874

ฉันเดาว่าวิธีนี้ใช้ได้กับเขาเพราะส่วนประกอบที่เป็นปัญหาไม่มีส่วนประกอบของไดอะล็อกดังนั้นไฟล์จึงไม่ได้รับการสร้างใหม่บ่อยหรือเคย อย่างไรก็ตามในแอปพลิเคชัน windows ที่มีทรัพยากรโต้ตอบ MFC ซึ่งจะไม่เป็นเช่นนั้น
shawn1874

1
ขอขอบคุณที่ช่วยเตือนฉันเกี่ยวกับเทคนิคที่ฉันเห็นครั้งแรกในไฟล์ทรัพยากรที่มาพร้อมกับ WinBatch Extender SDK เป็นเวลานานมากแล้วที่ฉันต้องการมันจนลืมรายละเอียดส่วนใหญ่ไป คำอธิบายของคุณทำให้ทุกอย่างกลับมา
David


6

มีเครื่องมือหลายอย่างที่กล่าวถึงโดยคำตอบที่ดีมากมายฉันจะเลือกอย่างใดอย่างหนึ่ง

แฮ็กเกอร์ทรัพยากร

ฉันดาวน์โหลดเวอร์ชันล่าสุด ( 5.1.7 ) จาก[AngusJ]: ทรัพยากร Hacker ข้อมูลที่จำเป็นทั้งหมดสามารถพบได้ในหน้านั้น (ตัวเลือกบรรทัดคำสั่งสคริปต์ ... ) ในคำแนะนำต่อไปนี้ฉันจะใช้งานไฟล์ปฏิบัติการ 2 ตัว (หนูทดลอง) ซึ่ง (ด้วยเหตุผลที่ชัดเจน) ฉันคัดลอกในcwdของฉัน:

  • ResourceHacker.exe : ฉันคิดว่ามันน่าสนใจที่จะดำเนินการเอง
  • cmake.exe : ปฏิบัติการแบบสุ่มโดยไม่มีชุดข้อมูลเวอร์ชัน (ส่วนหนึ่งของการติดตั้งv3.6.3บนเครื่องของฉัน)

ก่อนที่จะดำเนินการต่อไปฉันต้องการพูดถึงว่าResourceHackerมีเอาต์พุตเทอร์มินัลที่ตลกและชิ้นส่วนคัดลอก / วางต่อไปนี้อาจสร้างความสับสนเล็กน้อย

1. การตั้งค่า

นี่เป็นเหมือนขั้นตอนเบื้องต้นในการทำความคุ้นเคยกับสิ่งแวดล้อมเพื่อแสดงว่าไม่มีธุรกิจขี้ขลาดเกิดขึ้น ...

e:\Work\Dev\StackOverflow\q000284258> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> dir
 Volume in drive E is Work
 Volume Serial Number is 3655-6FED

 Directory of e:\Work\Dev\StackOverflow\q000284258

2019-01-28  20:09    <DIR>          .
2019-01-28  20:09    <DIR>          ..
2016-11-03  09:17         5,413,376 cmake.exe
2019-01-03  02:06         5,479,424 ResourceHacker.exe
2019-01-28  20:30               496 ResourceHacker.ini
               3 File(s)     10,893,296 bytes
               2 Dir(s)  103,723,261,952 bytes free

[prompt]> set PATH=%PATH%;c:\Install\x64\CMake\CMake\3.6.3\bin

[prompt]> .\cmake --help >nul 2>&1

[prompt]> echo %errorlevel%
0

[prompt]> .\ResourceHacker.exe -help

[prompt]>

==================================
Resource Hacker Command Line Help:
==================================

-help             : displays these abbreviated help instructions.
-help commandline : displays help for single commandline instructions
-help script      : displays help for script file instructions.




[prompt]> echo %errorlevel%
0

อย่างที่เห็นไฟล์ปฏิบัติการนั้นใช้ได้มันทำงานได้ดีและนี่คือลักษณะของรายละเอียด (ที่เราสนใจ):

Img0-เริ่มต้น

2. ทรัพยากร

ไฟล์ทรัพยากรคือไฟล์ข้อความที่มีทรัพยากร ทรัพยากร (แบบง่าย) มี:

  • ชื่อ
  • ชนิด
  • ความคุ้มค่า

สำหรับรายละเอียดเพิ่มเติมตรวจสอบ[MS.Docs]: เกี่ยวกับแฟ้มทรัพยากร มีเครื่องมือมากมาย (กล่าวถึงในคำตอบที่มีอยู่) ที่อำนวยความสะดวกในการแก้ไขไฟล์ทรัพยากรเช่น:

  • VStudioสร้างค่าเริ่มต้นเมื่อเริ่มโปรเจ็กต์ใหม่
  • หนึ่งสามารถสร้างไฟล์ดังกล่าวด้วยตนเอง
  • แต่เนื่องจากมันเกี่ยวกับResource Hackerและ:

    • สามารถดึงทรัพยากรจากไฟล์ปฏิบัติการที่มีอยู่
    • มีทรัพยากรฝังอยู่ (ดังแสดงในภาพก่อนหน้า)

    ฉันจะใช้สำหรับขั้นตอนนี้ ( -action extract)

ถัดไปเพื่อให้ทรัพยากรถูกฝังลงใน. exe ( .dll , ... ) จะต้องคอมไพล์เป็นรูปแบบไบนารีซึ่งพอดีกับรูปแบบPE อีกครั้งมีเครื่องมือมากมายที่สามารถบรรลุเป้าหมายนี้ได้ แต่อย่างที่คุณคาดเดาได้ว่าฉันจะติดResource Hacker ( -action compile)

[prompt]> :: Extract the resources into a file
[prompt]> .\ResourceHacker.exe -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

[prompt]>

[28 Jan 2019, 20:58:03]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHacker.exe  -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\ResourceHacker.exe
Save    : e:\Work\Dev\StackOverflow\q000284258\sample.rc


Success!

[prompt]> :: Modify the resource file and set our own values
[prompt]>
[prompt]> :: Compile the resource file
[prompt]> .\ResourceHacker.exe -open .\sample.rc -save .\sample.res -action compile -log con

[prompt]>

[28 Jan 2019, 20:59:51]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHacker.exe  -open .\sample.rc -save .\sample.res -action compile -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\sample.rc
Save    : e:\Work\Dev\StackOverflow\q000284258\sample.res

Compiling: e:\Work\Dev\StackOverflow\q000284258\sample.rc
Success!

[prompt]> dir /b
cmake.exe
ResourceHacker.exe
ResourceHacker.ini
sample.rc
sample.res

ในกรณีของคุณไม่จำเป็นต้องบันทึกและแก้ไขไฟล์ทรัพยากรเนื่องจากไฟล์จะปรากฏอยู่แล้วฉันเพิ่งทำเพื่อสาธิตวัตถุประสงค์ ด้านล่างเป็นไฟล์ทรัพยากรหลังจากแก้ไขแล้ว (ก่อนที่จะคอมไพล์)

ตัวอย่าง.rc :

1 VERSIONINFO
FILEVERSION 3,1,4,1592
PRODUCTVERSION 2,7,1,8
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
    BLOCK "040904E4"
    {
        VALUE "CompanyName", "Cristi Fati\0"
        VALUE "FileDescription", "20190128 - SO q000284258 demo\0"
        VALUE "FileVersion", "3.1.4.1592\0"
        VALUE "ProductName", "Colonel Panic\0"
        VALUE "InternalName", "100\0"
        VALUE "LegalCopyright", "(c) Cristi Fati 1999-2999\0"
        VALUE "OriginalFilename", "ResHack\0"
        VALUE "ProductVersion", "2.7.1.8\0"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409 0x04E4  
}
}

3. ฝัง

นอกจากนี้ยังจะดำเนินการโดยResource Hacker ( -action addoverwrite) เนื่องจากไฟล์. exeถูกคัดลอกไปแล้วฉันจะแก้ไขทรัพยากรให้ถูกต้อง

[prompt]> .\ResourceHacker.exe -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

[prompt]>

[28 Jan 2019, 21:17:19]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHacker.exe  -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\cmake.exe
Save    : e:\Work\Dev\StackOverflow\q000284258\cmake.exe
Resource: e:\Work\Dev\StackOverflow\q000284258\sample.res

  Added: VERSIONINFO,1,1033

Success!

[prompt]> copy ResourceHacker.exe ResourceHackerTemp.exe
        1 file(s) copied.

[prompt]> .\ResourceHackerTemp.exe -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

[prompt]>

[28 Jan 2019, 21:19:29]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHackerTemp.exe  -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\ResourceHacker.exe
Save    : e:\Work\Dev\StackOverflow\q000284258\ResourceHacker.exe
Resource: e:\Work\Dev\StackOverflow\q000284258\sample.res

  Modified: VERSIONINFO,1,1033

Success!

[prompt]> del /f /q ResourceHackerTemp.*

[prompt]> dir
 Volume in drive E is Work
 Volume Serial Number is 3655-6FED

 Directory of e:\Work\Dev\StackOverflow\q000284258

2019-01-28  21:20    <DIR>          .
2019-01-28  21:20    <DIR>          ..
2016-11-03  09:17         5,414,400 cmake.exe
2019-01-03  02:06         5,479,424 ResourceHacker.exe
2019-01-28  21:17               551 ResourceHacker.ini
2019-01-28  20:05             1,156 sample.rc
2019-01-28  20:59               792 sample.res
               5 File(s)     10,896,323 bytes
               2 Dir(s)  103,723,253,760 bytes free

อย่างที่เห็นฉันต้องใช้เคล็ดลับเล็ก ๆ น้อย ๆ ( gainarie ) เพราะฉันทำไม่ได้ (อย่างน้อยฉันก็ไม่คิดว่าจะทำได้) แก้ไข. exeขณะใช้งาน

4. ทดสอบ

นี่เป็นเฟสทางเลือกเพื่อให้แน่ใจว่า:

  • ไฟล์ปฏิบัติการยังคงใช้งานได้ (ไม่ได้ยุ่งเหยิงในกระบวนการ)
  • มีการเพิ่ม / อัปเดตทรัพยากร
[prompt]> .\cmake --help >nul 2>&1

[prompt]> echo %errorlevel%
0

[prompt]> .\ResourceHacker.exe -help

[prompt]>

==================================
Resource Hacker Command Line Help:
==================================

-help             : displays these abbreviated help instructions.
-help commandline : displays help for single commandline instructions
-help script      : displays help for script file instructions.




[prompt]> echo %errorlevel%
0

และรายละเอียดของพวกเขา:

img1 สุดท้าย


@ColonelPanic: ขอบคุณ!
CristiFati

คำตอบที่ดีมาก น่าเสียดายที่ ResourceHacker ไม่ได้รับการดูแลอีกต่อไปและหน่วยความจำไม่เพียงพอเมื่อพยายามแก้ไขไฟล์ EXE ขนาดใหญ่ (ฉันได้รับข้อผิดพลาดในการพยายามเปิด exe 3GB)
Lews Therin

@LewsTherin: เวอร์ชันล่าสุด (ใช้โดยคำตอบ) คือตั้งแต่ 2019/01 ดังนั้นฉันจึงบอกว่ามันได้รับการดูแลอย่างดี ปัญหาคือว่ามันเป็น32bit คุณสามารถติดต่อผู้เขียนเพื่อขอรุ่น64 บิต (ฉันคิดว่าเนื่องจากพวกเขามีรหัสอยู่แล้วจึงไม่ยากที่จะสร้างเป็น64 บิต )
CristiFati

3

มีResource Tuner Consoleจาก Heaventools Software

Resource Tuner Console เป็นเครื่องมือบรรทัดคำสั่งที่ช่วยให้นักพัฒนาทำการแก้ไขทรัพยากรประเภทต่างๆโดยอัตโนมัติในไฟล์ปฏิบัติการ Windows 32- และ 64 บิตจำนวนมาก

ดูโดยเฉพาะในหน้าการเปลี่ยนตัวแปรเวอร์ชันและการอัปเดตข้อมูลเวอร์ชันสำหรับรายละเอียดเพิ่มเติม


3

ไปงานปาร์ตี้สายเล็กน้อย แต่เนื่องจากฉันกำลังมองหามัน (และฉันอาจต้องหามันอีกครั้งในบางครั้ง) นี่คือสิ่งที่ฉันทำเพื่อรวมเวอร์ชันชื่อ บริษัท และอื่น ๆ ลงใน C ++ DLL ของฉันภายใต้ VS2013 Express:

  1. สร้างและแก้ไขไฟล์ dllproj.rc ตามที่ระบุไว้ก่อนหน้านี้
  2. เพิ่มบรรทัด "rc.exe dllproj.rc" เป็นขั้นตอนก่อนสร้างในโครงการ DLL
  3. เพิ่ม dllproj.res ไปยังโฟลเดอร์รีซอร์สสำหรับโปรเจ็กต์

หวังว่านี่จะช่วยได้!


3

ดังกล่าวข้างต้นคำตอบจาก @DannyBeckett ช่วยฉันมาก

ฉันใส่สิ่งต่อไปนี้ในไฟล์แบตช์และฉันวางไว้ในโฟลเดอร์เดียวกันกับที่ ResourceHacker.exe และ EXE ที่ฉันทำงานอยู่และมันใช้งานได้ดีเยี่ยม [คุณสามารถแก้ไขได้ตามความต้องการของคุณ]

    @echo off
    :start1
    set /p newVersion=Enter version number [?.?.?.?]:
    if "%newVersion%" == "" goto start1
    :start2
    set /p file=Enter EXE name [for 'program.exe' enter 'program']:
    if "%file%" == "" goto start2
    for /f "tokens=1-4 delims=." %%a in ('echo %newVersion%') do (set ResVersion=%%a,%%b,%%c,%%d)
    (
    echo:VS_VERSION_INFO VERSIONINFO
    echo:    FILEVERSION    %ResVersion%
    echo:    PRODUCTVERSION %ResVersion%
    echo:{
    echo:    BLOCK "StringFileInfo"
    echo:    {
    echo:        BLOCK "040904b0"
    echo:        {
    echo:            VALUE "CompanyName",        "MyCompany\0"
    echo:            VALUE "FileDescription",    "TestFile\0"
    echo:            VALUE "FileVersion",        "%newVersion%\0"
    echo:            VALUE "LegalCopyright",     "COPYRIGHT © 2019 MyCompany\0"
    echo:            VALUE "OriginalFilename",   "%file%.exe\0"
    echo:            VALUE "ProductName",        "Test\0"
    echo:            VALUE "ProductVersion",     "%newVersion%\0"
    echo:        }
    echo:    }
    echo:    BLOCK "VarFileInfo"
    echo:    {
    echo:        VALUE "Translation", 0x409, 1200
    echo:    }
    echo:}
    ) >Resources.rc     &&      echo setting Resources.rc
    ResourceHacker.exe -open resources.rc -save resources.res -action compile -log CONSOLE
    ResourceHacker -open "%file%.exe" -save "%file%Res.exe" -action addoverwrite -resource "resources.res"  -log CONSOLE
    ResourceHacker.exe -open "%file%Res.exe" -save "%file%Ico.exe" -action addskip -res "%file%.ico" -mask ICONGROUP,MAINICON, -log CONSOLE
    xCopy /y /f "%file%Ico.exe" "%file%.exe"
    echo.
    echo.
    echo your compiled file %file%.exe is ready
    pause

[ในฐานะบันทึกด้านข้างฉันใช้แฮ็กเกอร์ทรัพยากรเพื่อรวบรวมไฟล์ res ไม่ใช่ GoRC]


2

คุณสามารถลองดาวน์โหลดFVIEจากลิงค์ดาวน์โหลดและลองแก้ไขข้อมูลสำหรับไฟล์. exe

(หรือ)

คุณสามารถดาวน์โหลดStampVer - Win32 Version Resource Stampingจากลิงค์ดาวน์โหลด ซึ่งมีประโยชน์มากสำหรับไฟล์ windows. exe

(หรือ)

คุณสามารถใช้เครื่องมือที่เรียกว่าคำสั่งRCEDIT ดาวน์โหลดจากลิงก์ Github Sourceจากนั้นสร้างโดยใช้ Visual Studio 2015 จากนั้นคุณมีคำสั่งเฉพาะเพื่อเปลี่ยนเวอร์ชันของไฟล์. exe ดูลิงก์เอกสารสำหรับคำสั่งต่างๆที่มี


1

นี่เป็นเครื่องมือที่ดีที่สุดที่ฉันเคยเห็นในงานนี้ช่วยให้สามารถควบคุมทรัพยากรไฟล์ทั้งหมดได้อย่างเต็มที่รวม VersionInfo

ดู: ResourceEditorโดยAnders Melander


1
การดาวน์โหลดสำหรับ Resource Editor (0 ไบต์) เสีย
แจ็ค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.