Ламер (редкий) |
Отправлено: 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
|
было-бы замечательно если бы ты зарегистрировался и не плодил посты, это раз а во-вторых вот, дарю:
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
|
Ну разве это много кода? еще велосипеды люблю . а подключать допустим к консольной проге RxLib совершенно не к чему, да у оконной размер увеличивать лишними прибамбасами тоже не надо.
Asher-шайтан, на минуту но опередил
Отредактировано 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 читал.
Я вообще не пойму от куда он эту левую строку вызова взял
|
|
Георгий |
Отправлено: 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 написанный на апи, его можно подключить отдельно, можно посмореть исходники. Все проблемы такого рода возникают из-за бездарно сделанного борландом способа сборки файлов при котором к проекту лепится все, что находится в пэкедже классов и компонентов при использовании его незначительной части.
|
|