Нужен надёжный способ извлечения информации из exe файлов.
Т.е. автор, компания, название, язык.версию
Также у некоторых программ есть в свойствах Сводка и Цифровая подпись.
Ещё вопрос: можно ли извлечь что-нибудь из выше сказанного из MSI файлов
GetFileVersionSize работает не на всех exe
21.06.07 19:18: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Robo.Burned пишет:
> Нужен надёжный способ извлечения информации из exe файлов.
VersionInfo resource вам поможет на Win32.
Posted via RSDN NNTP Server 2.1 beta
Здравствуйте, Robo.Burned, Вы писали:
RB>Искал в гугле VersionInfo resource.
искать надо так:
site:microsoft.com versioninfo
первая линк гула.
RB>Помогите, пожалуйста поподробнеее, желательно хоть с каплей кода.
Примерно так:
#include <stdio.h>
#include <windows.h>
typedef struct t_L
{
WORD wLanguage;
WORD wCodePage;
} L;
int wmain(int argc, wchar_t *argv[])
{
DWORD size;
void *buff;
int verSize, productNameSize, i;
wchar_t tmp[1024], *productName;
L *verTrans;
size = GetFileVersionInfoSize(argv[1], NULL);
if (size > 0) {
buff = malloc(size);
if (buff != NULL)
{
if (GetFileVersionInfo(argv[1], 0, size, buff) != 0)
{
if (VerQueryValue(buff, L"\\VarFileInfo\\Translation",
(LPVOID*)&verTrans, &verSize))
{
for (i = 0; i < verSize / sizeof(L); i++)
{
wprintf(L"Found translation: lang=%d, cp=%d\n",
verTrans[i].wLanguage,
verTrans[i].wCodePage);
swprintf(tmp, 1024, L"\\StringFileInfo\\%04x%04x\\ProductName",
verTrans[i].wLanguage,
verTrans[i].wCodePage);
if (VerQueryValue(buff, tmp, &productName, &productNameSize))
{
wprintf(L"Product name: {%s}\n", productName);
}
}
}
}
free(buff);
}
}
return 0;
}
... << RSDN@Home 1.2.0 alpha rev. 679>>
Здравствуйте, Alex Kirhenshtein, Вы писали:
AK>Примерно так:
AK>AK>#include <stdio.h>
AK>#include <windows.h>
AK>typedef struct t_L
AK>{
AK> WORD wLanguage;
AK> WORD wCodePage;
AK>} L;
AK>int wmain(int argc, wchar_t *argv[])
AK>{
AK> DWORD size;
AK> void *buff;
AK> int verSize, productNameSize, i;
AK> wchar_t tmp[1024], *productName;
AK> L *verTrans;
AK> size = GetFileVersionInfoSize(argv[1], NULL);
AK> if (size > 0) {
AK> buff = malloc(size);
AK> if (buff != NULL)
AK> {
AK> if (GetFileVersionInfo(argv[1], 0, size, buff) != 0)
AK> {
AK> if (VerQueryValue(buff, L"\\VarFileInfo\\Translation",
AK> (LPVOID*)&verTrans, &verSize))
AK> {
AK> for (i = 0; i < verSize / sizeof(L); i++)
AK> {
AK> wprintf(L"Found translation: lang=%d, cp=%d\n",
AK> verTrans[i].wLanguage,
AK> verTrans[i].wCodePage);
AK> swprintf(tmp, 1024, L"\\StringFileInfo\\%04x%04x\\ProductName",
AK> verTrans[i].wLanguage,
AK> verTrans[i].wCodePage);
AK> if (VerQueryValue(buff, tmp, &productName, &productNameSize))
AK> {
AK> wprintf(L"Product name: {%s}\n", productName);
AK> }
AK> }
AK> }
AK> }
AK> free(buff);
AK> }
AK> }
AK> return 0;
AK>}
AK>
Я так понял, что для использования
GetFileVersionInfoSize нужно подключить библиотеку
Ver.dll
Я пробовал так
#pragma comment(lib, "ver")
Программа компилируется без ошибок.
При запуске программы сообщение :
Приложение C:\ ... \VER.dll не является образом программы для Windows NT Проверьте назначение установочного диска
Пробовал иначе:
в свойствах проекта Linker\Input\Additional dependencies писал ver.lib
Результат тот-же.
Может нужно искать Ver.dll под XP?
Здравствуйте, Robo.Burned, Вы писали:
RB>Я так понял, что для использования GetFileVersionInfoSize нужно подключить библиотеку Ver.dll
Странно MSDN пишет version.dll и Version.lib