Здравствуйте, 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 будет хранить копию — ничего не должно падать...
У Вас есть функции для замены.
А как добавить новый комментарий к версии файла?
Существует ли реализация этой футкции?
Если есть сообщите пожалуйста.