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 будет хранить копию — ничего не должно падать...