Как я могу изменить описание другого исполняемого файла, товарные знаки и т. д. с помощью программного обеспечения, напиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу изменить описание другого исполняемого файла, товарные знаки и т. д. с помощью программного обеспечения, напи

Сообщение Anonymous »

Предпочтительно 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»