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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

    dwBufferSize = 0;

    initialize ();
} // QBuffer::deallocate

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

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

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

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

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

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


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

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

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