Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Информация о файле 
:(
    Опции темы
Akella
  Дата 20.9.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Как получить полную информацию о файле? smile smile
В DRKB есть примеры, но этого мало.
Мне нужна такая информация, которая хранится в таких полях, как InternalName, FileDiscription, LegalCopyright, OriginalFileName, ProductName.
Короче откройте опции проекта в Delphi и всё увидите сами.
PM MAIL   Вверх
Snowy
Дата 20.9.2005, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



PM MAIL   Вверх
Akella
Дата 21.9.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Что я делаю не так

Код

//объявляем
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;//<- Пустота
..

PM MAIL   Вверх
Snowy
Дата 21.9.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Потому, что файл либо не существует, либо у него нет сведений о версии и т.п.
Сейчас у себя проверил на delphi32.exe - все работает.
P.S. стоит соптимизировать код.
PM MAIL   Вверх
Akella
Дата 21.9.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



может, я неверно читаю данные из этой процедуры?

Код

//так читаю
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;//<- Пустота (точка останова срабатывает)
..



Это сообщение отредактировал(а) dsergey - 21.9.2005, 12:23
PM MAIL   Вверх
Akella
Дата 21.9.2005, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Вроде, всё работает, спасибо, ошибка была у меня.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.