Re[4]: Программно изменить коментрарии к версии
От: Аноним  
Дата: 24.08.06 08:49
Оценка:
Здравствуйте, McQwerty, Вы писали:

S>>Возникло несколько вопросов.

S>>1. Что за класс базовый класс VObject у VVersionInfo и VCommonVersionInfo?
MQ>Обычный базовый класс "всего". Можно игнорировать...
S>>2. Не понятнно что тип QBuffer у переменной VCommonVersionInfo::m_Value. Я реализовал этот тип так
MQ>Это просто буфер на н-цать байт. В отличии от восстановленного варианта содержит копию данных
S>>
MQ>    class QBuffer
MQ>    {
MQ>    public:
MQ>        QBuffer ();
MQ>        QBuffer (DWORD dwSize);
MQ>        QBuffer (QBuffer& aBuffer);
MQ>        QBuffer (LPBYTE lpData, DWORD dwSize);
MQ>        virtual ~QBuffer ();

MQ>    public:
MQ>        VOID Allocate (DWORD dwSize);
MQ>        VOID Assign (LPBYTE lpData, DWORD dwSize);
MQ>        VOID Set (LPBYTE lpData, DWORD dwSize);

MQ>    public:
MQ>        LPBYTE Get () const;
MQ>        DWORD Size () const;

MQ>    protected:
MQ>        VOID allocate (LPBYTE lpData, DWORD dwSize);
MQ>        VOID deallocate ();
MQ>        VOID initialize ();

MQ>    private:
MQ>        LPBYTE lpBuffer;
MQ>        DWORD dwBufferSize;
MQ>    }; // QBuffer


MQ>VOID QBuffer::initialize ()
MQ>{
MQ>    lpBuffer = NULL;
MQ>    dwBufferSize = 0;
MQ>} // QBuffer::initialize

MQ>QBuffer::QBuffer ()
MQ>{
MQ>    initialize ();
MQ>    allocate (NULL, 0);
MQ>} // QBuffer::QBuffer

MQ>QBuffer::QBuffer (DWORD dwSize)
MQ>{
MQ>    initialize ();
MQ>    allocate (NULL, dwSize);
MQ>} // QBuffer::QBuffer

MQ>QBuffer::QBuffer (QBuffer& aBuffer)
MQ>{
MQ>    initialize ();
MQ>    allocate (aBuffer. Get (), aBuffer. Size ());
MQ>} // QBuffer::QBuffer

MQ>QBuffer::QBuffer (LPBYTE lpData, DWORD dwSize)
MQ>{
MQ>    initialize ();
MQ>    allocate (lpData, dwSize);
MQ>} // QBuffer::QBuffer

MQ>QBuffer::~QBuffer ()
MQ>{
MQ>    deallocate ();
MQ>} // QBuffer::~QBuffer

MQ>VOID QBuffer::allocate (LPBYTE lpData, DWORD dwSize)
MQ>{
MQ>    deallocate ();

MQ>    if (dwSize)
MQ>    {
MQ>        lpBuffer = (LPBYTE) GlobalAlloc (GPTR, dwSize);

MQ>        if (lpBuffer)
MQ>        {
MQ>            if (lpData)
MQ>                CopyMemory (lpBuffer, lpData, dwSize);

MQ>            dwBufferSize = dwSize;
MQ>        }
MQ>        else
MQ>            dwBufferSize = 0;
MQ>    }
MQ>} // QBuffer::allocate

MQ>VOID QBuffer::deallocate ()
MQ>{
MQ>    if (lpBuffer)
MQ>    {
MQ>        GlobalFree ((HGLOBAL) lpBuffer);
MQ>        lpBuffer = NULL;
MQ>    }

MQ>    dwBufferSize = 0;

MQ>    initialize ();
MQ>} // QBuffer::deallocate

MQ>LPBYTE QBuffer::Get () const { return lpBuffer; }
MQ>DWORD QBuffer::Size () const { return dwBufferSize; }

MQ>VOID QBuffer::Allocate (DWORD dwSize)
MQ>{
MQ>    allocate (NULL, dwSize);
MQ>} // QBuffer::Allocate

MQ>VOID QBuffer::Assign (LPBYTE lpData, DWORD dwSize)
MQ>{
MQ>    allocate (lpData, dwSize);
MQ>} // QBuffer::Assign

MQ>VOID QBuffer::Set (LPBYTE lpData, DWORD dwSize)
MQ>{
MQ>    deallocate ();
MQ>    lpBuffer = lpData;
MQ>    dwBufferSize = dwSize;
MQ>} // QBuffer::Set
S>>

S>>3. Не знаю что такое VArray поэтому вместо
S>> typedef VArray <VVersionInfo*> VChilds;
S>> использовал vector из STL
S>> typedef std::vector<VVersionInfo*> VChilds;
S>> Надеюсь это тоже не отразилось на функциональности
MQ>Вполне подойдёт...

S>>4. Для того что бы заработало дополнил ваш код из примера.


S>> При этом при попытке выполнить

S>> pFixed->dwProductVersionMS = pFixed->dwProductVersionMS + 0x00010001;//m_dwVersionMS;
S>> Появляется окно с Accecc Violation
S>> Я думаю что это связано с тем что слишком рано выполняется FreeLibrary. Но даже если выполнить закрытие библиотеки после всех операций все равно происходит что-то не очень понятное. После обновления ресурса сам файл остается неизменным но в том же каталоге появляется новый с именем RCXxxx.TMP
S>> Последние три xxx в имени файла это шестнадцатиричное число, которое каждый раз изменяется на новое. Если этот файл переименовать в exe то он не запускается.

MQ>Падает из-за обращения к памяти, ранее принадлежавшей выгруженной библиотеке. Если QBuffer будет хранить копию — ничего не должно падать...


У Вас есть функции для замены.
А как добавить новый комментарий к версии файла?
Существует ли реализация этой футкции?
Если есть сообщите пожалуйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.