Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 10:51   #1
RageGod
Пользователь
 
Регистрация: 08.05.2012
Сообщений: 35
По умолчанию Смена Информации о файле

Столкнулся с проблемой изменения информации о файле (компания, версия, дата создания).
Найти рабочий пример так и не удалось.
Сегодня наткнулся на этот код:

Код:
function ReplaceFileInformation(FileName: String; Section: WideString; wsValue: PWideChar): Boolean;
type
PLangAndCodePage = ^TLangAndCodePage;
TLangAndCodePage = packed record
wLanguage: Word;
wCodePage: Word;
end;

function MAKELANGID(sPrimaryLanguage : Word;
sSubLanguage : Word) : Word;
begin
result := (sSubLanguage shl 10) or
sPrimaryLanguage;
end;

var
Size, Unused: DWORD;
VerData: PByte;
Value: Pointer;
Len, VerLen, I: UINT;
Translate: PLangAndCodePage;
KeyName: WideString;
FileVersion: LPWSTR;
hUpdate: THandle;
begin
Result:= FALSE;
Size := GetFileVersionInfoSize(PChar(FileName), Unused);
if Size <> 0 then
begin
GetMem(VerData, Size);
try
if GetFileVersionInfo(PChar(FileName), 0, Size, VerData) then
begin
Value := nil;
Len := 0;
VerQueryValue(VerData, '\', Value, Len);

with PVSFixedFileInfo(Value)^ do
begin
dwFileVersionMS := MAKELONG(1, 1);
dwFileVersionLS := MAKELONG(1, 1);
end;

Value := nil;
Len := 0;
VerQueryValue(VerData, '\VarFileInfo\Translation', Value, Len);

Translate := PLangAndCodePage(Value);
for I := 0 to (Len div SizeOf(TLangAndCodePage)) - 1 do
begin
// Вместо FileVersion может быть любой другой параметр
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) + IntToHex(Translate^.wCodePage, 4) + '\'+ Section;

Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
FileVersion := PWideChar(Value);
ZeroMemory(FileVersion, VerLen * SizeOf(WideChar));
// Ниже меняем данные
wsprintfW(FileVersion, wsValue); // Вот тут меняем версию
end;

Inc(Translate);
end;

hUpdate := BeginUpdateResource(PChar(FileName), FALSE);
if hUpdate <> 0 then
begin
Result := UpdateResource(hUpdate,
RT_VERSION,
MAKEINTRESOURCE(VS_VERSION_INFO),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
VerData,
Size);
EndUpdateResource(hUpdate, not Result);
end;
end;
finally
FreeMem(VerData);
end;
end;
end;
Пытаюсь использовать так:
Код:
procedure TForm2.Button2Click(Sender: TObject);
begin
if not ReplaceFileInformation('D:\exeinfoPE.exe','FileDescription','BULKA') then ShowMessage('Error');
end;
но тогда просто выбивает ошибку, 'Error'
Возможно кто-то знает, как исправить?
(Если нужно, у меня Windows 7 x64)
RageGod вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ввод данных и сохранение информации в файле MS Word ( Delphi ) BIGGYpo Помощь студентам 7 14.03.2012 01:21
Проблема с корректным сохранением в файле информации. MonteCristo Visual C++ 0 29.09.2011 20:33
Сохранение информации в файле и считывание из него Draips Помощь студентам 3 28.12.2010 18:45
Смена информации о версии exe STRELOK-2007 Общие вопросы Delphi 1 09.04.2010 14:48