Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как читать из любого ЕХЕ файла данные... [D6, WinXP]


Dennis S ©   (2005-09-06 13:54:00) 

Конкретно вот эти:
Product Version: (здесь интересующие данные)
Company Name: (здесь интересующие данные)
Internal Name: (здесь интересующие данные)
Original Filename: (здесь интересующие данные)
такие строки тоже есть Description, Version, Copyright, Product...

Вообще какие-либо данные о версии файла...
Существует ли стандартная функция?


Dennis S   (2005-09-06 18:07:00) [1]

2 Big Joe
Спасибо, но я уже писал, что с Version уже разобрался...

2 kami
Вот это то, что я искал... :))
Универсальный ответ...
Огромное спасибо.


Big Joe   (2005-09-06 15:07:00) [2]

А это ?

function GetVersion: string;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;
begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do
  begin
    Result := IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;

procedure Form1.Button1Click(Sender: TObject);
begin
  label1.Caption := GetVersion;
end;


Dennis S   (2005-09-06 15:03:00) [3]

2 Big Joe
Спасибо, но в твоём случае выдаётся инфа о пользователе файла, определяя текущего пользователя и тд...

Мне же нужна толко та инфа, которая зашита в самих ЕХЕ файлах...
То, что можно выставить в VersionInfo при компиляции файла.


kami   (2005-09-06 14:57:00) [4]

Есть, называется GetFileVersionInfo
Пример - из TvFileVersionInfo :
var
 VerBuf: PChar;
 VerSize: Integer;
 VerBufValue: Pointer;
 VerBufLen: Cardinal;
 VerHandle: Cardinal;
 VerKey: string;
//===============================================================
function GetInfo(const aKey: string): string;
 begin
   Result := '';
   VerKey := Format('\StringFileInfo\%.4x%.4x\%s',
     [LoWord(Integer(VerBufValue^)),
     HiWord(Integer(VerBufValue^)), aKey]);
   if VerQueryValue(VerBuf, PChar(VerKey), VerBufValue, VerBufLen) then
     Result := StrPas(VerBufValue);
 end;

 function QueryValue(const aValue: string): string;
 begin
   Result := '';
   // obtain version information about the specified file
   if GetFileVersionInfo(PChar(sAppNamePath), VerHandle, VerSize, VerBuf) and
     // return selected version information
     VerQueryValue(VerBuf, '\VarFileInfo\Translation', VerBufValue, VerBufLen) then
     Result := GetInfo(aValue);
 end;
//====================================================
VerSize := GetFileVersionInfoSize(PChar(sAppNamePath), VerHandle);
   if VerSize > 0 then
   begin
     VerBuf := AllocMem(VerSize);
     try
         CompanyName      := QueryValue('CompanyName');
         FileDescription  := QueryValue('FileDescription');
         FileVersion      := QueryValue('FileVersion');
         InternalName     := QueryValue('InternalName');
         LegalCopyRight   := QueryValue('LegalCopyRight');
         LegalTradeMarks  := QueryValue('LegalTradeMarks');
         OriginalFileName := QueryValue('OriginalFileName');
         ProductName      := QueryValue('ProductName');
         ProductVersion   := QueryValue('ProductVersion');
         Comments         := QueryValue('Comments');
         SpecialBuildStr  := QueryValue('SpecialBuild');
         PrivateBuildStr  := QueryValue('PrivateBuild');
     finally
       FreeMem(VerBuf, VerSize);
     end


Big Joe   (2005-09-06 14:50:00) [5]

Прочитать владельца...

function GetFileOwner(FileName: string;
 var Domain, Username: string): Boolean;
var
 SecDescr: PSecurityDescriptor;
 SizeNeeded, SizeNeeded2: DWORD;
 OwnerSID: PSID;
 OwnerDefault: BOOL;
 OwnerName, DomainName: PChar;
 OwnerType: SID_NAME_USE;
begin
 GetFileOwner := False;
 GetMem(SecDescr, 1024);
 GetMem(OwnerSID, SizeOf(PSID));
 GetMem(OwnerName, 1024);
 GetMem(DomainName, 1024);
 try
   if not GetFileSecurity(PChar(FileName),
     OWNER_SECURITY_INFORMATION,
     SecDescr, 1024, SizeNeeded) then
     Exit;
   if not GetSecurityDescriptorOwner(SecDescr,
     OwnerSID, OwnerDefault) then
     Exit;
   SizeNeeded := 1024;
   SizeNeeded2 := 1024;
   if not LookupAccountSID(nil, OwnerSID, OwnerName,
     SizeNeeded, DomainName, SizeNeeded2, OwnerType) then
     Exit;
   Domain := DomainName;
   Username := OwnerName;
 finally
   FreeMem(SecDescr);
   FreeMem(OwnerName);
   FreeMem(DomainName);
 end;
 GetFileOwner := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Domain, Username: string;
begin
 GetFileOwner('YourFile.xyz', domain, username);
 ShowMessage(username + '@' + domain);
end;


CHES   (2005-09-06 14:37:00) [6]

Не надо в нете искать, когда в help-e есть

procedure TForm1.Button1Click(Sender: TObject);
const
 InfoNum = 10;
 InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription',
   'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks',
   'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
 S: string;
 n, Len, i: DWORD;
 Buf: PChar;
 Value: PChar;
begin
 S := Application.ExeName; // Путь к файлу информация о котором интересует
 n := GetFileVersionInfoSize(PChar(S), n);
 if n > 0 then
 begin

   Buf := AllocMem(n);
   Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(n));
   GetFileVersionInfo(PChar(S), 0, n, Buf);
   for i := 1 to InfoNum do
     if VerQueryValue(Buf, PChar('StringFileInfo\040904E4\' + InfoStr[i]),
       Pointer(Value), Len) then
       Memo1.Lines.Add(InfoStr[i] + ' = ' + Value);
   FreeMem(Buf, n);
 end
 else
   Memo1.Lines.Add('No version information found');
end;


Dennis S   (2005-09-06 14:36:00) [7]

Как получить всё ОСТАЛЬНОЕ? 8(


Dennis S   (2005-09-06 14:34:00) [8]

Вот нашёл в iNET-е кое-что....
Выдаёт версию файла (проверенно)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
function GetFileVersion(const FileName: string): string;
type
 PDWORD = ^DWORD;
 PLangAndCodePage = ^TLangAndCodePage;
 TLangAndCodePage = packed record
   wLanguage: WORD;
   wCodePage: WORD;
 end;
 PLangAndCodePageArray = ^TLangAndCodePageArray;
 TLangAndCodePageArray = array[0..0] of TLangAndCodePage;
var
 loc_InfoBufSize: DWORD;
 loc_InfoBuf: PChar;
 loc_VerBufSize: DWORD;
 loc_VerBuf: PChar;
 cbTranslate: DWORD;
 lpTranslate: PDWORD;
 i: DWORD;
begin
 Result := '';
 if (Length(FileName) = 0) or (not Fileexists(FileName)) then
   Exit;
 loc_InfoBufSize := GetFileVersionInfoSize(PChar(FileName), loc_InfoBufSize);
 if loc_InfoBufSize > 0 then
 begin
   loc_VerBuf := nil;
   loc_InfoBuf := AllocMem(loc_InfoBufSize);
   try
     if not GetFileVersionInfo(PChar(FileName), 0, loc_InfoBufSize, loc_InfoBuf)
       then
       exit;
     if not VerQueryValue(loc_InfoBuf, '\\VarFileInfo\\Translation',
       Pointer(lpTranslate), DWORD(cbTranslate)) then
       exit;
     for i := 0 to (cbTranslate div SizeOf(TLangAndCodePage)) - 1 do
     begin
       if VerQueryValue(
         loc_InfoBuf,
         PChar(Format(
         'StringFileInfo\0%x0%x\FileVersion', [
         PLangAndCodePageArray(lpTranslate)[i].wLanguage,
           PLangAndCodePageArray(lpTranslate)[i].wCodePage])),
           Pointer(loc_VerBuf),
         DWORD(loc_VerBufSize)
         ) then
       begin
         Result := loc_VerBuf;
         Break;
       end;
     end;
   finally
     FreeMem(loc_InfoBuf, loc_InfoBufSize);
   end;
 end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо