C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Информация о версии, Помогите найти ошибку
Ламер (редкий)
Отправлено: 05.03.2004, 13:58


Не зарегистрирован







out.open(argv[2]);

DWORD dwSize = GetFileVersionInfoSize(argv[1], &dwReserved);
PBYTE pbInfoBuffer = new BYTE [dwSize];
ZeroMemory((PVOID)pbInfoBuffer,dwSize);

if (pbInfoBuffer && GetFileVersionInfo(argv[1], dwReserved, dwSize, (PVOID)pbInfoBuffer))
{
char szStr[MAX_PATH];
UINT unLength;
BYTE pbTransBuffer[MAX_PATH];
char szQuery[MAX_PATH];
char szLang[MAX_PATH];

VerQueryValue((PVOID)pbInfoBuffer, "\\StringFileInfo\\Translation",
(PVOID*)pbTransBuffer, &unLength);

//pbTransBuffer возвращает какую-то фигню вроде 0xcc

VerLanguageName(LOWORD(*pbTransBuffer), szLang, MAX_PATH);

CharToOem(szLang,szLang);
cout<
//szLang возвращает Языконезависимый

_snprintf(szQuery,MAX_PATH,"\\StringFileInfo\\%04x%04x\\LegalCopyright",LOWORD(*pbTransBuffer),
HIWORD(*pbTransBuffer));
cout<
//

char* szQuery2="\\StringFileInfo\\040904e4\\FileVersion";
cout< if(!VerQueryValue(pbInfoBuffer, szQuery2, (PVOID*)&szStr, &unLength))
cout<
Asher
Отправлено: 05.03.2004, 14:16


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Ты пиши конкретно, что не работает.

Если та строка, где ты пишешь что возвращает фигню, то в соответствии с справкой там должно быть в параметрах \\VarFileInfo\\Translatioт, а не \\StringFileInfo\\Translation
далее получаешь
AnsiString CharSet = IntToHex((int)MAKELONG(*(int*)(ValueBuf+2), *(int*)ValueBuf), 8);, который подсовываешь в "\\StringFileInfo\\" + CharSet + "\\LegalCopyright"

И еще — нафига сделал VerLanguageName(LOWORD(*pbTransBuffer), szLang, MAX_PATH);? он требует всего-лишь
DWORD wLang, // Microsoft language identifier
xTrim
Отправлено: 05.03.2004, 14:23


Машинист паровоза

Группа: Участник
Сообщений: 208



было-бы замечательно если бы ты зарегистрировался и не плодил посты, это раз smile.gif а во-вторых вот, дарю:
CODE

//---------------------------------------------------------------------------
// это присказка
template <class T>
class GlobalMem
{
public:
GlobalMem(DWORD s):size(s){buf = (T) GlobalAlloc(GMEM_FIXED, size);}
~GlobalMem(){GlobalFree(buf);}
T operator()(){return buf;}
private:
T buf;
DWORD size;
};
//---------------------------------------------------------------------------
// а это сказка :)
AnsiString GetAnyAppParam(AnsiString appname,AnsiString pname)
{
// ProductName,FileVersion,LegalCopyright,CompanyName и т.д.
AnsiString ret("<Invalid parametr>");
DWORD h;
DWORD Size = GetFileVersionInfoSize(appname.c_str(), &h);
if (Size == 0) return ret;

GlobalMem<char*> buf(Size);

if (GetFileVersionInfo(appname.c_str(), h, Size, buf()) == 0) return ret;

char* ValueBuf;
UINT Len;
VerQueryValue(buf(), "\VarFileInfo\Translation", &(void *) ValueBuf, &Len);
if (Len < 4) return ret;

AnsiString CharSet = IntToHex((int)MAKELONG(*(int*) (ValueBuf + 2), *(int*) ValueBuf),8);
AnsiString fn = "\StringFileInfo\" + CharSet + "\"+pname;

if (VerQueryValue(buf(),fn.c_str(),&(void *) ValueBuf, &Len) != 0)
 ret = ValueBuf;

return ret;
}

olegenty
Отправлено: 05.03.2004, 14:30


Ветеран

Группа: Модератор
Сообщений: 2412



Так много кода... А вообще-то в RXLib есть класс TVersionInfo. Ребят, я всё понимаю, но зачем делать работу ещё раз, если всё уже давным-давно за вас сделано. Подключайте и пользуйтесь. Удобно же.
Asher
Отправлено: 05.03.2004, 14:58


Мастер участка

Группа: Модератор
Сообщений: 550



Ну так кто спорит?
один раз написал модуль о программе.
и кидай его во все проекты.
И никаких лишних библиотек.
Долой жирные программы.
xTrim
Отправлено: 05.03.2004, 14:59


Машинист паровоза

Группа: Участник
Сообщений: 208



Ну разве это много кода? еще велосипеды люблю smile.gif . а подключать допустим к консольной проге RxLib совершенно не к чему, да у оконной размер увеличивать лишними прибамбасами тоже не надо.

Asher-шайтан, на минуту но опередил wink.gif

Отредактировано xTrim — 05/03/2004, 17:04
Ламер (редкий)
Отправлено: 05.03.2004, 16:27


Не зарегистрирован







Зачем подключать RxLib, если есть Win32 API. VCL нужна прежде всего для GUI, а все остальное желательно писать на голом API.
olegenty
Отправлено: 05.03.2004, 16:35


Ветеран

Группа: Модератор
Сообщений: 2412



Класс не визуальный. А писать надо так, чтобы укладываться в срок, соблюдать требования заказчика, минимально вкладываясь материально. Остальное не важно и относится к предубеждениям. Я тоже пользуюсь API, когда критично. Замечу, критично бывает редко. У меня приятель вообще на чистом асме пишет под винды. Сорцы получаются намного больше скомпилированного кода (то если не касаясь БД). С БД работает из билдера. Ну и что?
olegenty
Отправлено: 05.03.2004, 16:38


Ветеран

Группа: Модератор
Сообщений: 2412



Вот тебе пример: ты сейчас ищешь ошибку, вто время как класс TVersionInfo прост, как три копейки. Давно бы сделал.
Asher
Отправлено: 05.03.2004, 20:09


Мастер участка

Группа: Модератор
Сообщений: 550



Привет снова.
Если бы аккуратно копировал из MSDN то таких ошибок не было-бы.
(черт, не пойму как это правильно пишется.)
Или хотя-бы справку по Builderu читал.
Я вообще не пойму от куда он эту левую строку вызова взял wink.gif
Георгий
Отправлено: 06.03.2004, 11:38


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



во бучу развели! 5го пятница ведь была — самое подходящее время чтоб 8марта отметить, а вы тут...
Долой бездумное использование макросов,
долой inline функции , по крайней мере использованные так, как в iostream
долой борьбу за скорость кода там, где скорость кода не нужна
долой экстенсивные методы повышения производительности!
Так выпьем же за красивые алгоритмы, ибо красота, по определению, не может быть хромой, толстой и не поворотливой!
olegenty
Отправлено: 06.03.2004, 15:22


Ветеран

Группа: Модератор
Сообщений: 2412



Присоединяюсь. Сегодня шкаф с сетевым оборудованием переставляли. Вот, в результате вышел в инет — всё встало пучком и работает. Щас за спиртом, и тост пошёл... ))
Gedeon
Отправлено: 09.03.2004, 10:19


Ветеран

Группа: Модератор
Сообщений: 1742



Прилеплять RxLib из-за версии к проеукту — это все равно неправильно в папке Examples\Controls Buildera есть такой компонент как VersionInfo написанный на апи, его можно подключить отдельно, можно посмореть исходники. Все проблемы такого рода возникают из-за бездарно сделанного борландом способа сборки файлов при котором к проекту лепится все, что находится в пэкедже классов и компонентов при использовании его незначительной части.

Вернуться в Вопросы программирования в C++Builder