Версия файла
Народ подскажите как можно версию файла определить? Что-то поиском поискал ничего хорошего не нашел!
Смотри MSDN "Version Information", в частности функцию GetFileVersionInfo.
Смотря какого файла :)
в частности с расширением exe!
GetFileVersionInfo
вот что нашел по этой функции:
KeyName = "Comment" || "ProductName" || "InternalName" ||"OriginalFilename" || "CompanyName" || "FileVersion" || ...
*/
AnsiString __fastcall TMainForm::VersionInfoString (AnsiString FileName, AnsiString KeyName)
{
AnsiString Info("UNKNOWN");
char
* buff(0),
* info(0);
DWORD
null,
size(GetFileVersionInfoSize(FileName.c_str(), &null));
if (size)
{
buff = new char [ size ];
if (GetFileVersionInfo(FileName.c_str(), 0, size, buff))
{
unsigned int len;
unsigned short * lang;
if (VerQueryValue(buff, "\\VarFileInfo\\Translation",
(void **)&lang, &len))
VerQueryValue(buff, (AnsiString("\\StringFileInfo\\") +
IntToHex(lang[0], 4) + IntToHex(lang[1], 4) + "\\" +
KeyName).c_str(), (void **)&info, &len);
Info = info;
}
}
delete [] buff;
return Info;
}
или нужно сначала файл скачать.
вот что нашел по этой функции:
KeyName = "Comment" || "ProductName" || "InternalName" ||"OriginalFilename" || "CompanyName" || "FileVersion" || ...
*/
AnsiString __fastcall TMainForm::VersionInfoString (AnsiString FileName, AnsiString KeyName)
{
AnsiString Info("UNKNOWN");
char
* buff(0),
* info(0);
DWORD
null,
size(GetFileVersionInfoSize(FileName.c_str(), &null));
if (size)
{
buff = new char [ size ];
if (GetFileVersionInfo(FileName.c_str(), 0, size, buff))
{
unsigned int len;
unsigned short * lang;
if (VerQueryValue(buff, "\\VarFileInfo\\Translation",
(void **)&lang, &len))
VerQueryValue(buff, (AnsiString("\\StringFileInfo\\") +
IntToHex(lang[0], 4) + IntToHex(lang[1], 4) + "\\" +
KeyName).c_str(), (void **)&info, &len);
Info = info;
}
}
delete [] buff;
return Info;
}
----
А как насчет GetFileVersionInfoSize?
/*Windows 95/98/Me: The short path form of the specified file name must be less than 126 characters.
*/
И че с эти делать? Какие есть альтернативы?
И еще такая проблема нарисовалась: когда получаешь язык \\VarFileInfo\\Translation, то он может оказаться каким-то "левым"(типа незарегистрированным). И все - дальше я не могу достать информацию. Хотя она там точно есть. Может кто в курсе?
а по FTP узнать версию файла можно :) ?
или нужно сначала файл скачать.
Ну, найди список команд FTP и посмотри, есть ли там подходящие.
А лучше, если уж для себя делаешь обновлялку :) , то давай файлу на ftp имя с указанием версии,например: mycoolapp_2_0_1_1.exe
А лучше, если уж для себя делаешь обновлялку :) , то давай файлу на ftp имя с указанием версии,например: mycoolapp_2_0_1_1.exe
Вот это да, сегодня столько советов по этому поводу получил, начиная от маркерных файлов, до вот ентого :) спасибо конечно.
И еще такая проблема нарисовалась: когда получаешь язык \\VarFileInfo\\Translation, то он может оказаться каким-то "левым"(типа незарегистрированным). И все - дальше я не могу достать информацию. Хотя она там точно есть. Может кто в курсе?
Я использую класс TVersionInfo из библиотеки RX. Там есть все нужные свойства. При этом достаточно одного файла, совсем не обязательно всю библиотеку использовать.
Я использую класс TVersionInfo из библиотеки RX. Там есть все нужные свойства. При этом достаточно одного файла, совсем не обязательно всю библиотеку использовать.
Я вообще-то пишу на MSVС++. А из RX'a реально "выдрать" этот TVersionInfo? И на каких условиях он распростроняется? А то меня это сильно беспокоит(проект комерческий и приходится все соблюдать).
Я вообще-то пишу на MSVС++. А из RX'a реально "выдрать" этот TVersionInfo? И на каких условиях он распростроняется? А то меня это сильно беспокоит(проект комерческий и приходится все соблюдать).
RX бесплатный. Только вот насчет VC не знаю - файл на паскале. С++Билдер его будет компилить, он понимает паскалевские файлы, а VC вроде нет.
Версию по ftp можно узнать с помощью FtpFindFirstFile
спасибо
RX бесплатный. Только вот насчет VC не знаю - файл на паскале. С++Билдер его будет компилить, он понимает паскалевские файлы, а VC вроде нет.
OK. Спаибо. Если станет совсем тяжко, буду разбираться. Но не могли бы Вы проверить как работает RX с файлами у которых Language==0x0 и CharacterSet(CodePage)==0x0. Т.к. если у него с этим проблемы, то и рабираться не стоит. Надеюсь Вас не затруднит моя просьба.
OK. Спаибо. Если станет совсем тяжко, буду разбираться. Но не могли бы Вы проверить как работает RX с файлами у которых Language==0x0 и CharacterSet(CodePage)==0x0. Т.к. если у него с этим проблемы, то и рабираться не стоит. Надеюсь Вас не затруднит моя просьба.
Глянул исходник класса - константы неизвестного языка и неизвестной кодовой страницы там присутствуют. Так что, думаю, работать будут постольку, поскольку сама система с ними работает :)
А как именно работают проверить не могу, т.к. не знаю где взять такой файл. Если есть, могу набросать тестовый проект.
Глянул исходник класса - константы неизвестного языка и неизвестной кодовой страницы там присутствуют. Так что, думаю, работать будут постольку, поскольку сама система с ними работает :)
А как именно работают проверить не могу, т.к. не знаю где взять такой файл. Если есть, могу набросать тестовый проект.
Одним из таких файлов является WinRar(так же видел пару инсталях аськи) - посмотрел уже несколько вариантов - одно и тоже. Вот только мне кажется я начал понимать в чем дело. Буду пробовать.
PS Сиба за ответы. Я первый раз решил что-то в форуме спросить(до этого просто читал) и был приятно удивлен... а то часто видишь - надо челу что-то он спрашивает-спрашивает...