Ошибка поиска файла в GetFileVersionInfo???
От: Fresh_den  
Дата: 26.07.07 06:30
Оценка:
Коллеги, добрый день! Наткнулся на один очень странный момент. Если расположить два файла с одинковым именем, но разными версиями (это ocx, имеется в виду поле Product Version) — один в текущем каталоге, а второй — в каком-то другом, то последовательность действий "1) CHDir(другой каталог) 2) GetFileVersionInfo" приводит к тому, что мне возвращается значение для файла, лежавшего в каталоге запуска приложения, а не в текущем каталоге! Пишу на Delphi5 (к сож.).

Файлы тут:
C:\MyProject\Project1.exe
C:\MyProject\My_Favorite_OCX.ocx (ProductVersion = 6.66)
C:\bin\My_Favorite_OCX.ocx (ProductVersion = 1.00)

Делал это:
procedure TForm1.Button1Click(Sender: TObject);
var
  FileHandle: Cardinal;
  InfoSize: Integer;
  Size: Cardinal;
  P, Value: Pointer;
  InfoString: String;
  InfoTypeString: String;
  TranslationStr: String;
  FileInformationStr: String;
  VersionInfoData: PChar;
  Dummy: Integer;
begin
    CHDir('..\bin');
    InfoString:='';
    InfoSize:=GetFileVersionInfoSize(PChar('My_Favorite_OCX.ocx'),FileHandle);
    if InfoSize > 0 then
      begin
       GetMem(VersionInfoData,InfoSize);
       if GetFileVersioninfo(PChar('My_Favorite_OCX.ocx'),0,InfoSize,VersionInfoData) then
          begin
            if VerQueryValue(VersionInfoData,'\VarFileInfo\Translation',P, Size) then
               TranslationStr := IntToHex(MakeLong(HiWord(Longint(P^)), LoWord(Longint(P^))), 8)
            else
               TranslationStr := '';
            InfoTypeString:='\ProductVersion';
            FileInformationStr:='\StringFileInfo\'+TranslationStr+InfoTypeString;
            if VerQueryValue(VersionInfoData,PChar(FileInformationStr),Value,Size) then
               InfoString:=StrPas(PChar(Value));
          end;
       FreeMem(VersionInfoData);
      end;
    Dummy := Application.MessageBox(PChar(InfoString), ' ', IDOK); //тут выводится 6.66
end;


Кто-нибудь может понять, в чем тут подвох??
Re: Ошибка поиска файла в GetFileVersionInfo???
От: v_a_n_e_k  
Дата: 26.07.07 06:42
Оценка:
Здравствуйте, Fresh_den, Вы писали:

F_>Коллеги, добрый день! Наткнулся на один очень странный момент. Если расположить два файла с одинковым именем, но разными версиями (это ocx, имеется в виду поле Product Version) — один в текущем каталоге, а второй — в каком-то другом, то последовательность действий "1) CHDir(другой каталог) 2) GetFileVersionInfo" приводит к тому, что мне возвращается значение для файла, лежавшего в каталоге запуска приложения, а не в текущем каталоге! Пишу на Delphi5 (к сож.).


F_>Файлы тут:

F_>C:\MyProject\Project1.exe
F_>C:\MyProject\My_Favorite_OCX.ocx (ProductVersion = 6.66)
F_>C:\bin\My_Favorite_OCX.ocx (ProductVersion = 1.00)

F_>Делал это:

F_>
F_>procedure TForm1.Button1Click(Sender: TObject);
F_>var
F_>  FileHandle: Cardinal;
F_>  InfoSize: Integer;
F_>  Size: Cardinal;
F_>  P, Value: Pointer;
F_>  InfoString: String;
F_>  InfoTypeString: String;
F_>  TranslationStr: String;
F_>  FileInformationStr: String;
F_>  VersionInfoData: PChar;
F_>  Dummy: Integer;
F_>begin
F_>    CHDir('..\bin');
F_>    InfoString:='';
F_>    InfoSize:=GetFileVersionInfoSize(PChar('My_Favorite_OCX.ocx'),FileHandle);
F_>    if InfoSize > 0 then
F_>      begin
F_>       GetMem(VersionInfoData,InfoSize);
F_>       if GetFileVersioninfo(PChar('My_Favorite_OCX.ocx'),0,InfoSize,VersionInfoData) then
F_>          begin
F_>            if VerQueryValue(VersionInfoData,'\VarFileInfo\Translation',P, Size) then
F_>               TranslationStr := IntToHex(MakeLong(HiWord(Longint(P^)), LoWord(Longint(P^))), 8)
F_>            else
F_>               TranslationStr := '';
F_>            InfoTypeString:='\ProductVersion';
F_>            FileInformationStr:='\StringFileInfo\'+TranslationStr+InfoTypeString;
F_>            if VerQueryValue(VersionInfoData,PChar(FileInformationStr),Value,Size) then
F_>               InfoString:=StrPas(PChar(Value));
F_>          end;
F_>       FreeMem(VersionInfoData);
F_>      end;
F_>    Dummy := Application.MessageBox(PChar(InfoString), ' ', IDOK); //тут выводится 6.66
F_>end;
F_>


F_>Кто-нибудь может понять, в чем тут подвох??


Привет. Попробуй передавать в функции вместо имени файла его полный путь.
Удачи
Re[2]: Ошибка поиска файла в GetFileVersionInfo???
От: Fresh_den  
Дата: 26.07.07 06:46
Оценка:
Здравствуйте, v_a_n_e_k, Вы писали:

F_>>Кто-нибудь может понять, в чем тут подвох??


___>Привет. Попробуй передавать в функции вместо имени файла его полный путь.

___>Удачи

Спасибо, но меня интересует именно поведение этой функции. Обойти это я, ясное дело, могу.
Re[3]: Ошибка поиска файла в GetFileVersionInfo???
От: Сергей Мухин Россия  
Дата: 26.07.07 08:37
Оценка:
Здравствуйте, Fresh_den, Вы писали:

F_>Здравствуйте, v_a_n_e_k, Вы писали:


F_>>>Кто-нибудь может понять, в чем тут подвох??


___>>Привет. Попробуй передавать в функции вместо имени файла его полный путь.

___>>Удачи

F_>Спасибо, но меня интересует именно поведение этой функции. Обойти это я, ясное дело, могу.


а MSDN для кого писан?

lptstrFilename
[in] Pointer to a null-terminated string that specifies the name of the file of interest. If a full path is not specified, the function uses the search sequence specified by the LoadLibrary function.
---
С уважением,
Сергей Мухин
Re[4]: Ошибка поиска файла в GetFileVersionInfo???
От: Fresh_den  
Дата: 26.07.07 09:12
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Fresh_den, Вы писали:


F_>>Здравствуйте, v_a_n_e_k, Вы писали:


F_>>>>Кто-нибудь может понять, в чем тут подвох??


___>>>Привет. Попробуй передавать в функции вместо имени файла его полный путь.

___>>>Удачи

F_>>Спасибо, но меня интересует именно поведение этой функции. Обойти это я, ясное дело, могу.


СМ>а MSDN для кого писан?


СМ>lptstrFilename

СМ>[in] Pointer to a null-terminated string that specifies the name of the file of interest. If a full path is not specified, the function uses the search sequence specified by the LoadLibrary function.

Спасибо, но я не понял, каким образом функция LoadLibrary "определяет последовательность поиска" — у нее только один параметр — имя подключаемой dll... (прошу прощения, у меня MSDN недоступен, к сожалению)
Re[5]: Ошибка поиска файла в GetFileVersionInfo???
От: Сергей Мухин Россия  
Дата: 26.07.07 10:06
Оценка:
Здравствуйте, Fresh_den, Вы писали:

СМ>>а MSDN для кого писан?


СМ>>lptstrFilename

СМ>>[in] Pointer to a null-terminated string that specifies the name of the file of interest. If a full path is not specified, the function uses the search sequence specified by the LoadLibrary function.

F_>Спасибо, но я не понял, каким образом функция LoadLibrary "определяет последовательность поиска" — у нее только один параметр — имя подключаемой dll... (прошу прощения, у меня MSDN недоступен, к сожалению)


не LoadLibrary ищет, а там описано процедура поиска!

Dynamic-Link Library Search Order

я не понимаю, для кого MSDN писан! там все это есть! Загляните хоть раз! там много еще интерсного!
---
С уважением,
Сергей Мухин
Re[6]: Ошибка поиска файла в GetFileVersionInfo???
От: Fresh_den  
Дата: 26.07.07 10:12
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Fresh_den, Вы писали:


СМ>>>а MSDN для кого писан?


СМ>>>lptstrFilename

СМ>>>[in] Pointer to a null-terminated string that specifies the name of the file of interest. If a full path is not specified, the function uses the search sequence specified by the LoadLibrary function.

F_>>Спасибо, но я не понял, каким образом функция LoadLibrary "определяет последовательность поиска" — у нее только один параметр — имя подключаемой dll... (прошу прощения, у меня MSDN недоступен, к сожалению)


СМ>не LoadLibrary ищет, а там описано процедура поиска!


СМ>Dynamic-Link Library Search Order


СМ>я не понимаю, для кого MSDN писан! там все это есть! Загляните хоть раз! там много еще интерсного!


Сергей, спасибо большое. Что такое MSDN я знаю, у меня сейчас закрыт доступ к некоторым сетевым ресурсам. (Кстати, фраза тогда неграмотно построена по-английски, что меня и смутило)
Re: Ошибка поиска файла в GetFileVersionInfo???
От: МЪ www.morock.narod.ru
Дата: 26.07.07 10:23
Оценка:
Здравствуйте, Fresh_den, Вы писали:


F_>C:\MyProject\My_Favorite_OCX.ocx (ProductVersion =6.66)


F_>Кто-нибудь может понять, в чем тут подвох??


Все дело в неудачном ProductVersion.
Now some men like the fishing
And some men like fowling
And some men like to hear
The cannonballs are roaring
Me — I like sleeping...
Re[7]: Ошибка поиска файла в GetFileVersionInfo???
От: Сергей Мухин Россия  
Дата: 26.07.07 10:51
Оценка:
Здравствуйте, Fresh_den, Вы писали:

СМ>>Dynamic-Link Library Search Order


СМ>>я не понимаю, для кого MSDN писан! там все это есть! Загляните хоть раз! там много еще интерсного!


F_>Сергей, спасибо большое. Что такое MSDN я знаю, у меня сейчас закрыт доступ к некоторым сетевым ресурсам. (Кстати, фраза тогда неграмотно построена по-английски, что меня и смутило)


купите DVD. Если в Питере могу отдать какую-нибудь старую версию
---
С уважением,
Сергей Мухин
Re[8]: Ошибка поиска файла в GetFileVersionInfo???
От: Fresh_den  
Дата: 26.07.07 11:07
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Fresh_den, Вы писали:


СМ>>>Dynamic-Link Library Search Order


СМ>>>я не понимаю, для кого MSDN писан! там все это есть! Загляните хоть раз! там много еще интерсного!


F_>>Сергей, спасибо большое. Что такое MSDN я знаю, у меня сейчас закрыт доступ к некоторым сетевым ресурсам. (Кстати, фраза тогда неграмотно построена по-английски, что меня и смутило)


СМ>купите DVD. Если в Питере могу отдать какую-нибудь старую версию


Сергей, я требую прекращения стеба! Не всегда ж в жизни под рукой есть msdn.com или dvd
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.