Предпочтительно C++, он должен работать для всех программ без исключения. Мне следует автоматизировать и уменьшить размер программы, поэтому, пожалуйста, не отдавайте предпочтение Resource Hacker или dll. Однако, если вы не можете придумать другой метод, вы можете написать его, я бы скорее немного увеличил размер, чем не нашел бы никакого способа. Он должен изменить всю информацию, содержащуюся в FileVersionInfo.
Я попробовал Windows API, но он просто удалил информацию о версии, а не изменил ее. Я попробовал dll под названием "DSofile", она даже не удалила информацию о версии. Вот пример кода.
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr BeginUpdateResource(string pFileName, [MarshalAs(UnmanagedType.Bool)] bool bDeleteExistingResources);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UpdateResource(IntPtr hUpdate, IntPtr lpType, IntPtr lpName, ushort wLanguage, byte[] lpData, uint cbData);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EndUpdateResource(IntPtr hUpdate, [MarshalAs(UnmanagedType.Bool)] bool fDiscard);
private static IntPtr StringToIntPtr(string s)
{
return Marshal.StringToHGlobalUni(s);
}
public static bool UpdateVersionResource(string filePath, string resourceName, string newValue)
{
IntPtr handle = BeginUpdateResource(filePath, false);
if (handle == IntPtr.Zero)
{
Console.WriteLine($"Error opening file for update: {resourceName}");
return false;
}
// Create the structure for the version info resource
var versionInfo = new VS_VERSIONINFO
{
Length = (ushort)(Marshal.SizeOf(typeof(VS_VERSIONINFO)) + (newValue.Length + 1) * 2),
ValueLength = (ushort)(newValue.Length + 1),
Type = 1,
Key = "VS_VERSION_INFO",
Value = newValue
};
int size = Marshal.SizeOf(versionInfo);
IntPtr buffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(versionInfo, buffer, false);
byte[] data = new byte[size];
Marshal.Copy(buffer, data, 0, size);
Marshal.FreeHGlobal(buffer);
IntPtr type = new IntPtr(16); // RT_VERSION
IntPtr name = new IntPtr(1); // VS_VERSION_INFO
ushort language = 1033; // English (US)
bool result = UpdateResource(handle, type, name, language, data, (uint)data.Length);
if (!result)
{
Console.WriteLine($"Error updating resource: {resourceName}");
EndUpdateResource(handle, true);
return false;
}
if (!EndUpdateResource(handle, false))
{
Console.WriteLine($"Error finishing update: {resourceName}");
return false;
}
return true;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct VS_VERSIONINFO
{
public ushort Length;
public ushort ValueLength;
public ushort Type;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string Key;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Value;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... tc-with-an
Как я могу изменить описание другого исполняемого файла, товарные знаки и т. д. с помощью программного обеспечения, напи ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение