Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Информация о файле


Автор: Akella 20.9.2005, 16:01
Как получить полную информацию о файле? smile smile
В DRKB есть примеры, но этого мало.
Мне нужна такая информация, которая хранится в таких полях, как InternalName, FileDiscription, LegalCopyright, OriginalFileName, ProductName.
Короче откройте опции проекта в Delphi и всё увидите сами.

Автор: Snowy 20.9.2005, 16:37
http://forum.vingrad.ru/index.php?showtopic=45370

Автор: Akella 21.9.2005, 11:57
Что я делаю не так

Код

//объявляем
Type
  TFileInfo = Record
    CompanyName      : String;
    FileDescription  : String;
    FileVersion      : String;
    InternalName     : String;
    LegalCopyright   : String;
    LegalTradeMarks  : String;
    OriginalFileName : String;
    ProductName      : String;
    ProductVersion   : String;
    Comments         : String;
  end;


почему-то возвращает пустые значения
Код

function TfmPass.xGetExeFileInfo(sAppName:string):TFileInfo;
type
  PTransBuffer = ^TTransBuffer;
  TTransBuffer = array[1..4] of smallint;
var
  iAppSize, iLenOfValue : DWord;
  pcBuf,pcValue         : PChar;
  VerSize               : DWord;
  pTrans                : PTransBuffer;
  TransStr              : string;
  fvip                  : pointer;
  ft                    : TFileTime;
  st                    : TSystemTime;
  i:Integer;
  Res : String;
  sl : TStringList;
  const
  AK47 : array [0..9] of string = ('CompanyName','FileDescription','FileVersion',
                                   'InternalName','LegalCopyright', 'LegalTradeMarks',
                                   'OriginalFileName','ProductName',
                                   'ProductVersion','Comments' );
begin
     Result.CompanyName      := '';
     Result.FileDescription  := '';
     Result.FileVersion      := '';
     Result.InternalName     := '';
     Result.LegalCopyright   := '';
     Result.LegalTradeMarks  := '';
     Result.OriginalFileName := '';
     Result.ProductName      := '';
     Result.ProductVersion   := '';
     Result.Comments         := '';

  // get version information values
  iAppSize:= GetFileVersionInfoSize(PChar(sAppName),// pointer to filename string
                                    iAppSize);      // pointer to variable to receive zero
   // if GetFileVersionInfoSize is successful
  if iAppSize > 0 then
  begin
      pcBuf := AllocMem(iAppSize);
      GetFileVersionInfo(PChar(sAppName),              // pointer to filename string
                         0,                            // ignored
                         iAppSize,                     // size of buffer
                         pcBuf);                       // pointer to buffer to receive file-version info.

      VerQueryValue(pcBuf, '\', fvip, iLenOfValue);
      VerQueryValue(pcBuf, PChar('\VarFileInfo\Translation'),pointer(ptrans), verSize);
      TransStr:= IntToHex(ptrans^[1], 4) + IntToHex(ptrans^[2], 4);

      for i:=0 to 9 do
      begin
        Case i of
          0: if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
               Result.CompanyName := pcValue;
          1: if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
               Result.FileDescription := pcValue;
          2: if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
               Result.FileVersion := pcValue;
          3:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
              Result.InternalName := pcValue;
          4:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
               Result.LegalCopyright  :=  pcValue;
          5:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
              Result.LegalTradeMarks :=pcValue;
          6:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
             Result.OriginalFileName := pcValue;
          7:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
             Result.ProductName := pcValue;
          8:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
              Result.ProductVersion := pcValue;
          9:if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' + AK47[i] ), Pointer(pcValue),iLenOfValue) then
              Result.Comments := pcValue;
        end;//case
      end;
      FreeMem(pcBuf,iAppSize);
  end;
end;

Добавлено @ 12:06
Код

//так читаю
Var
 FI : TFileInfo;
begin
  if not FileExists(FileName) then exit;
  try
      FI := xGetExeFileInfo(FileName);
      Image            := TImage.Create(fmPass);
      Image.Name       := 'Image'+IntToStr(iName);
      Image.Parent     := fmPass;
      Image.Picture.Icon.Handle := ExtractIcon(Application.Handle, PChar(FileName), 0);
      Image.Top        := T;
      Image.Left       := L;
      Image.Height     := h;//Image.Picture.Icon.Height;
      Image.Width      := w;//Image.Picture.Icon.Width;
      Image.Hint       := FI.ProductName;//<- Пустота
..

Автор: Snowy 21.9.2005, 12:19
Потому, что файл либо не существует, либо у него нет сведений о версии и т.п.
Сейчас у себя проверил на delphi32.exe - все работает.
P.S. стоит соптимизировать код.

Автор: Akella 21.9.2005, 12:22
может, я неверно читаю данные из этой процедуры?

Код

//так читаю
Var
 FI : TFileInfo;
begin
  if not FileExists(FileName) then exit;
  try
      FI := xGetExeFileInfo(FileName);
      Image            := TImage.Create(fmPass);
      Image.Name       := 'Image'+IntToStr(iName);
      Image.Parent     := fmPass;
      Image.Picture.Icon.Handle := ExtractIcon(Application.Handle, PChar(FileName), 0);
      Image.Top        := T;
      Image.Left       := L;
      Image.Height     := h;//Image.Picture.Icon.Height;
      Image.Width      := w;//Image.Picture.Icon.Width;
      Image.Hint       := FI.ProductName;//<- Пустота (точка останова срабатывает)
..


Автор: Akella 21.9.2005, 12:33
Вроде, всё работает, спасибо, ошибка была у меня.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)