15,471
社区成员
发帖
与我相关
我的任务
分享
const WCHAR *Var::s_szKey = L"Translation";
int Var::FromBuffer(LPVOID pVerBuffer, int nBufLen)
{
if(pValue)
{
delete []pValue;
pValue = NULL;
}
int nOffset = 0;
nOffset = VerHead::FromBuffer(pVerBuffer, nBufLen - nOffset);
if(nOffset)
{
nOffset = AlignOffset(nOffset);
if(wValueLength)
{
pValue = new BYTE[wValueLength];
memmove(pValue, ((LPBYTE)pVerBuffer) + AlignOffset(nOffset), wValueLength);
}
nOffset = wLength;
}
return nOffset;
}
int Var::SaveToBuffer(LPVOID pVerBuffer, int nBufLen)
{
int nLen = UpdateSize();
int nOffset = 0;
if(wLength <= nBufLen)
{
nOffset = 0;
nOffset = VerHead::SaveToBuffer(pVerBuffer, nBufLen);
nOffset = AlignOffset(nOffset);
if(pValue)
{
memmove((LPBYTE)pVerBuffer + AlignOffset(nOffset), pValue, wValueLength);
}
nOffset += wValueLength;
}
assert(nLen == nOffset);
UNREFERENCED_PARAMETER(nLen);
return nOffset;
}
int Var::UpdateSize(void)
{
const int nItemCount = 1; // waring: the language array size, here assume a value
wValueLength = sizeof(DWORD) * nItemCount;
wLength = (WORD)(AlignOffset(VerHead::UpdateSize()) + wValueLength);
return wLength;
}
const WCHAR *VarFileInfo::s_szKey = L"VarFileInfo";
int VarFileInfo::FromBuffer(LPVOID pVerBuffer, int nBufLen)
{
std::vector<Var *>::iterator pStart = m_vVar.begin();
for(; pStart != m_vVar.end(); ++pStart)
{
delete *pStart;
}
m_vVar.clear();
int nOffset = 0;
nOffset = VerHead::FromBuffer(pVerBuffer, nBufLen - nOffset);
if(nOffset)
{
int nLen = 0;
nOffset = AlignOffset(nOffset);
do
{
Var *pVar = new Var;
nLen = pVar->FromBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
if(0 == nLen)
{
delete pVar;
pVar = NULL;
break;
}
nOffset += AlignOffset(nLen);
m_vVar.push_back(pVar);
}while(nOffset < (int)wLength);
}
return nOffset;
}
int VarFileInfo::SaveToBuffer(LPVOID pVerBuffer, int nBufLen)
{
int nLen = UpdateSize();
int nOffset;
nOffset = VerHead::SaveToBuffer(pVerBuffer, nBufLen);
std::vector<Var *>::iterator pStart = m_vVar.begin();
for(; pStart != m_vVar.end(); ++pStart)
{
nOffset = AlignOffset(nOffset);
nOffset += (*pStart)->SaveToBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
}
assert(nLen == nOffset);
UNREFERENCED_PARAMETER(nLen);
return nOffset;
}
int VarFileInfo::UpdateSize(void)
{
wLength = 0;
wValueLength = 0;
if(!m_vVar.empty())
{
int nValueLen = 0;
std::vector<Var *>::iterator pStart = m_vVar.begin();
for(; pStart != m_vVar.end(); ++pStart)
{
nValueLen = AlignOffset(nValueLen);
nValueLen += (*pStart)->UpdateSize();
}
wLength = (WORD)(AlignOffset(GetVerHeadSize()) + nValueLen);
}
return wLength;
}
const WCHAR *VersionInfo::s_szKey = L"VS_VERSION_INFO";
int VersionInfo::FromBuffer(LPVOID pVerBuffer, int nBufLen)
{
VS_FIXEDFILEINFO fixedFileInfo = {0};
m_FixedFileInfo = fixedFileInfo;
int nOffset = 0;
nOffset = VerHead::FromBuffer(pVerBuffer, nBufLen - nOffset);
if(nOffset) // got VerHead correctly
{
if(wValueLength) // VS_FIXEDFILEINFO exsit
{
nOffset = AlignOffset(nOffset);
m_FixedFileInfo = *(VS_FIXEDFILEINFO *)((LPBYTE)pVerBuffer + nOffset);
nOffset += wValueLength;
if(m_FixedFileInfo.dwSignature != s_dwFixedFileInfoSignature) // invalide signature
{
m_FixedFileInfo = fixedFileInfo;
VerHead::FromBuffer(NULL, 0);
nOffset = 0;
return nOffset;
}
}
int nLen = 0;
VerHead verHead;
nOffset = AlignOffset(nOffset);
do
{
nLen = verHead.FromBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
if(0 == nLen)
{
m_strFileInfo.FromBuffer(NULL, 0);
m_varFileInfo.FromBuffer(NULL, 0);
nOffset = 0;
break;
}
if(0 == m_strFileInfo.Is_szKey(verHead.pszKey))
{
nLen = m_strFileInfo.FromBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
}
else if(0 == m_varFileInfo.Is_szKey(verHead.pszKey))
{
nLen = m_varFileInfo.FromBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
}
nOffset += AlignOffset(nLen);
}
while(nOffset < (int)wLength);
}
return nOffset;
}
int VersionInfo::SaveToBuffer(LPVOID pVerbuffer, int nBufLen)
{
int nLen = UpdateSize();
if(nBufLen < nLen)
{
return 0;
}
memset(pVerbuffer, 0, nLen);
int nOffset = 0;
nOffset = VerHead::SaveToBuffer(pVerbuffer, nBufLen);
if(wValueLength)
{
nOffset = AlignOffset(nOffset);
*(VS_FIXEDFILEINFO *)((LPBYTE)pVerbuffer + nOffset) = m_FixedFileInfo;
nOffset += wValueLength;
}
nOffset = AlignOffset(nOffset);
nOffset += m_strFileInfo.SaveToBuffer((LPBYTE)pVerbuffer + nOffset, nBufLen - nOffset);
nOffset = AlignOffset(nOffset);
nOffset += m_varFileInfo.SaveToBuffer((LPBYTE)pVerbuffer + nOffset, nBufLen - nOffset);
nOffset = AlignOffset(nOffset);
assert(nLen == nOffset);
return nOffset;
}
BOOL VersionInfo::AddString(LPCWSTR pszKeyName, LPCWSTR pszValue)
{
return m_strFileInfo.AddString(pszKeyName, pszValue);
}
int VersionInfo::UpdateSize(void)
{
int wLen = 0;
if(m_FixedFileInfo.dwSignature == s_dwFixedFileInfoSignature)
{
wValueLength = sizeof(m_FixedFileInfo);
wLen = AlignOffset(GetVerHeadSize()) + wValueLength;
}
wLen = AlignOffset(wLen);
wLen += m_strFileInfo.UpdateSize();
wLen = AlignOffset(wLen);
wLen += m_varFileInfo.UpdateSize();
wLength = (WORD)AlignOffset(wLen);
return wLength;
}
int Test_VerInfo(void)
{
int nRet = 0;
const int nBufLen = 1024 * 8;
char verBuffer_1[nBufLen] = {0};
char verBuffer_2[nBufLen] = {0};
VersionInfo *pVerInfo = new VersionInfo;
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
int nResSize = SizeofResource(NULL, hRsrc);
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
LPVOID lpVersion = LockResource(hGlobal);
//memmove(verBuffer_1, lpVersion, nResSize);
//DWORD dwHandle = 0;
////ULONG uVerLen = GetFileVersionInfoSizeEx(0, 0, &dwHandle);
////GetFileVersionInfoEx(0, argv[0], dwHandle, nBufLen, verBuffer_2);
//ULONG uVerLen = GetFileVersionInfoSize(argv[0], &dwHandle);
//GetFileVersionInfo(argv[0], dwHandle, uVerLen, verBuffer_2);
nRet = pVerInfo->FromBuffer(lpVersion, nBufLen);
nRet = pVerInfo->SaveToBuffer(verBuffer_1, nBufLen);
//nRet = pVerInfo->FromBuffer(verBuffer_1, nBufLen);
////nRet = pVerInfo->GetLength();
////nRet = pVerInfo->SaveToBuffer(verBuffer_1, nBufLen);
memcpy(verBuffer_2, lpVersion, nResSize);
int a = 0;
for(int i = 0; i < nRet; ++i)
{
if(verBuffer_1[i] != verBuffer_2[i])
{
++a;
}
}
UnlockResource(lpVersion);
FreeResource(hGlobal);
pVerInfo->AddString(L"Comments", L"hello");
//pVerInfo->RemoveString(L"Comments");
delete pVerInfo;
_CrtDumpMemoryLeaks();
return 0;
}
// Temp06.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//#include "resource.h"
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include <crtdbg.h>
#include <windows.h>
#include <assert.h>
#include "VersionInfo.h"
#pragma comment(lib, "Version.lib")
int VerHead::FromBuffer(PVOID pVerHead, int nBufLen)
{
if(pszKey)
{
delete []pszKey;
pszKey = NULL;
}
if(NULL == pVerHead) // zero the structure
{
wLength = GetVerHeadSize();
wValueLength = 0;
wType = 0;
pszKey = NULL;
return 0;
}
int nOffset = 0;
wLength = *(PWORD)((LPBYTE)pVerHead + nOffset);
if((wLength <= nBufLen)
&& (wLength > sizeof(wLength) + sizeof(wValueLength) + sizeof(wType) + sizeof(WCHAR)))
{
nOffset += sizeof(wLength);
wValueLength = *(PWORD)((LPBYTE)pVerHead + nOffset);
nOffset += sizeof(wValueLength);
wType = *(PWORD)((LPBYTE)pVerHead + nOffset);
nOffset += sizeof(wValueLength);
int nKeyLen = lstrlenW((LPCWSTR)((LPBYTE)pVerHead + nOffset)) + 1;
pszKey = new WCHAR[nKeyLen];
lstrcpyW(pszKey, (LPCWSTR)((LPBYTE)pVerHead + nOffset));
nOffset += nKeyLen * sizeof(WCHAR);
}
if(0 == nOffset)
{
wLength = GetVerHeadSize();
wValueLength = 0;
wType = 0;
pszKey = NULL;
}
return nOffset;
};
int VerHead::SaveToBuffer(PVOID pVerHead, int nBufLen)
{
UpdateSize();
int nOffset = 0;
int nKeyLen = lstrlenW(pszKey) + 1;
if((UINT)nBufLen >= sizeof(wLength) + sizeof(wValueLength) + sizeof(wType) + nKeyLen * sizeof(WCHAR))
{
nOffset = 0;
*(PWORD)((LPBYTE)pVerHead + nOffset) = wLength;
nOffset += sizeof(wLength);
*(PWORD)((LPBYTE)pVerHead + nOffset) = wValueLength;
nOffset += sizeof(wValueLength);
*(PWORD)((LPBYTE)pVerHead + nOffset) = wType;
nOffset += sizeof(wType);
lstrcpyW((LPWSTR)((LPBYTE)pVerHead + nOffset), pszKey);
nOffset += nKeyLen * sizeof(WCHAR);
}
return nOffset;
}
//
//String::String(LPCWSTR pszKeyName) : pValue(NULL)
//{
// WORD wKeyLen = (WORD)(lstrlenW(pszKeyName) + 1);
// pszKey = new WCHAR[wKeyLen];
// lstrcpyW(pszKey, pszKeyName);
// wLength += wKeyLen * sizeof(WCHAR);
//}
String::String(LPCWSTR pszKeyName, LPCWSTR pszValue) : pValue(NULL)
{
WORD wKeyLen = (WORD)(lstrlenW(pszKeyName) + 1);
WORD wValueLen = (WORD)(lstrlenW(pszValue) + 1);
pszKey = new WCHAR[wKeyLen];
lstrcpyW(pszKey, pszKeyName);
pValue = (LPWORD)new WCHAR[wValueLen];
lstrcpyW((LPWSTR)pValue, pszValue);
UpdateSize();
}
int String::FromBuffer(LPVOID pVerBuffer, int nBufLen)
{
if(pValue)
{
delete []pValue;
pValue = NULL;
}
int nOffset = 0;
nOffset = VerHead::FromBuffer(pVerBuffer, nBufLen - nOffset);
if(nOffset) // got the VerHead correctly
{
nOffset = AlignOffset(nOffset);
if(wValueLength)
{
pValue = new WORD[wValueLength];
memmove(pValue, ((LPBYTE)pVerBuffer) + nOffset, wValueLength * sizeof(WCHAR));
}
nOffset = wLength;
}
return nOffset;
}
int String::SaveToBuffer(LPVOID pVerBuffer, int nBufLen)
{
int nLen = UpdateSize();
int nOffset = 0;
if(wLength <= nBufLen)
{
nOffset = 0;
nOffset = VerHead::SaveToBuffer(pVerBuffer, nBufLen);
if(pValue)
{
nOffset = AlignOffset(nOffset);
memmove((LPBYTE)pVerBuffer + nOffset, pValue, wValueLength * sizeof(WCHAR));
}
nOffset = wLength;
}
assert(nLen == nOffset);
UNREFERENCED_PARAMETER(nLen); // for toggole the warring message when release
return nOffset;
}
int String::UpdateSize(void)
{
wLength = 0;
wValueLength = 0;
if(pValue)
{
wValueLength = (WORD)((lstrlen((LPCWSTR)pValue) + 1));
wLength = (WORD)(AlignOffset(GetVerHeadSize()) + wValueLength * sizeof(WCHAR));
}
return wLength;
}
LPWORD String::SetValue(LPCWSTR pszValue)
{
WORD wNewValueLen = 0;
if(pValue)
{
delete []pValue;
}
wNewValueLen = (WORD)(lstrlenW(pszValue) + 1);
pValue = new WORD[wNewValueLen];
lstrcpyW((LPWSTR)pValue, pszValue);
wLength += -wValueLength + wNewValueLen;
wValueLength = wNewValueLen;
return pValue;
}
int StringTable::FromBuffer(LPVOID pVerBuffer, int nBufLen)
{
std::vector<String *>::iterator pStart = m_vString.begin();
for(; pStart != m_vString.end(); ++pStart)
{
delete *pStart;
}
m_vString.clear();
int nOffset = 0;
nOffset = VerHead::FromBuffer(pVerBuffer, nBufLen - nOffset);
if(nOffset)
{
int nLen = 0;
nOffset = AlignOffset(nOffset);
do
{
String *pString = new String;
nLen = pString->FromBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
if(0 == nLen)
{
delete pString;
pString = NULL;
break;
}
nOffset += AlignOffset(nLen);
m_vString.push_back(pString);
}while(nOffset < (int)wLength);
}
return nOffset;
}
int StringTable::SaveToBuffer(LPVOID pVerBuffer, int nBufLen)
{
int nLen = UpdateSize();
int nOffset;
nOffset = VerHead::SaveToBuffer(pVerBuffer, nBufLen);
nOffset = AlignOffset(nOffset);
std::vector<String *>::iterator pStart = m_vString.begin();
for(; pStart != m_vString.end(); ++pStart)
{
nOffset = AlignOffset(nOffset);
nOffset += (*pStart)->SaveToBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
}
assert(nLen == nOffset);
UNREFERENCED_PARAMETER(nLen);
return wLength;
}
int StringTable::UpdateSize(void)
{
wLength = 0;
wValueLength = 0;
int nValueLen = 0;
if(!m_vString.empty())
{
std::vector<String *>::iterator pStart = m_vString.begin();
for(; pStart != m_vString.end(); ++pStart)
{
nValueLen = AlignOffset(nValueLen);
nValueLen += (*pStart)->UpdateSize();
}
wLength = (WORD)(AlignOffset(GetVerHeadSize()) + nValueLen);
}
return wLength;
}
String *StringTable::FindStringByName(LPCWSTR pszStrName)
{
String *pStrRet = NULL;
std::vector<String *>::iterator pStart = m_vString.begin();
for(; pStart != m_vString.end(); ++pStart)
{
if(0 == lstrcmpiW((*pStart)->pszKey, pszStrName))
{
pStrRet = *pStart;
break;
}
}
return pStrRet;
}
//String *StringTable::FindStringByValue(LPCWSTR pszValue)
//{
// String *pStrRet = NULL;
// std::vector<String *>::iterator pStart = m_vString.begin();
// for(; pStart != m_vString.end(); ++pStart)
// {
// if(0 == lstrcmpiW((LPCWSTR)(*pStart)->pValue, pszValue))
// {
// pStrRet = *pStart;
// break;
// }
// }
// return pStrRet;
//}
BOOL StringTable::AddString(LPCWSTR pszKeyName, LPCWSTR pszValue)
{
BOOL bRet = FALSE;
std::vector<String *>::iterator pStart = m_vString.begin();
for(; pStart != m_vString.end(); ++pStart)
{
if(0 == lstrcmpiW((*pStart)->pszKey, pszKeyName))
{
(*pStart)->SetValue(pszValue);
bRet = TRUE;
break;
}
}
if(!bRet)
{
String *pStr = new String(pszKeyName, pszValue);
m_vString.push_back(pStr);
bRet = TRUE;
}
return bRet;
}
//
//BOOL StringTable::RemoveString(LPCWSTR pszKeyName)
//{
// std::vector<String *>::iterator pStart = m_vString.begin();
// for(; pStart != m_vString.end(); ++pStart)
// {
// if(0 == lstrcmpiW((*pStart)->pszKey, pszStrName))
// {
// pStrRet = *pStart;
// break;
// }
// }
//}
//
const WCHAR *StringFileInfo::s_szKey = L"StringFileInfo";
//
int StringFileInfo::FromBuffer(LPVOID pVerBuffer, int nBufLen)
{
std::vector<StringTable *>::iterator pStart = m_vStrTable.begin();
for(; pStart != m_vStrTable.end(); ++pStart)
{
delete *pStart;
}
m_vStrTable.clear();
int nOffset = 0;
nOffset = VerHead::FromBuffer(pVerBuffer, nBufLen - nOffset);
if(nOffset)
{
nOffset = AlignOffset(nOffset);;
do
{
int nLen = 0;
StringTable *pStrTable = new StringTable;
nLen = pStrTable->FromBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
if(0 == nLen)
{
delete pStrTable;
pStrTable = NULL;
break;
}
m_vStrTable.push_back(pStrTable);
nOffset += nLen;
}while(nOffset < (int)wLength);
}
return wLength;
}
int StringFileInfo::SaveToBuffer(LPVOID pVerBuffer, int nBufLen)
{
int nLen = UpdateSize();
int nOffset;
nOffset = VerHead::SaveToBuffer(pVerBuffer, nBufLen);
nOffset = AlignOffset(nOffset);
std::vector<StringTable *>::iterator pStart = m_vStrTable.begin();
for(; pStart != m_vStrTable.end(); ++pStart)
{
nOffset = AlignOffset(nOffset);
nOffset += (*pStart)->SaveToBuffer((LPBYTE)pVerBuffer + nOffset, nBufLen - nOffset);
}
assert(nLen == nOffset);
UNREFERENCED_PARAMETER(nLen);
return nOffset;
}
int StringFileInfo::UpdateSize(void)
{
wLength = 0;
int nValueLen = 0;
if(!m_vStrTable.empty())
{
wValueLength = 0;
std::vector<StringTable *>::iterator pStart = m_vStrTable.begin();
for(; pStart != m_vStrTable.end(); ++pStart)
{
nValueLen = AlignOffset(nValueLen);
nValueLen += (*pStart)->UpdateSize();
}
wLength = (WORD)(AlignOffset(GetVerHeadSize()) + nValueLen);
}
return wLength;
}
BOOL StringFileInfo::AddString(LPCWSTR pszKeyName, LPCWSTR pszValue)
{
BOOL bRet = FALSE;
std::vector<StringTable *>::iterator pStart = m_vStrTable.begin();
for(; pStart != m_vStrTable.end(); ++pStart)
{
String *pStr = (*pStart)->FindStringByName(pszKeyName);
if(pStr)
{
bRet = (*pStart)->AddString(pszKeyName, pszValue);
break;
}
}
if(!bRet && !m_vStrTable.empty()) // not found and string table not empty
{
bRet = m_vStrTable[0]->AddString(pszKeyName, pszValue);
}
return bRet;
}
// VersionInfo.h
#pragma once
#include <vector>
class VerHead // common head for version structure
{
public:
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR *pszKey;
protected:
static const UINT uAlignBoundary = 4; // 32-bit boundary
ULONG AlignOffset(ULONG uOffset){ULONG u = (uOffset / uAlignBoundary) * uAlignBoundary; if(u < uOffset){u += uAlignBoundary;} return u;}
public:
VerHead() : wLength(sizeof(VerHead)), wValueLength(0), wType(0), pszKey(NULL){}
virtual ~VerHead(){ if(pszKey) delete []pszKey;};
virtual int FromBuffer(PVOID pVerHead, int nBufLen);
virtual int SaveToBuffer(PVOID pVerHead, int nBufLen);
virtual int UpdateSize(void){ return GetVerHeadSize();}
virtual WORD GetVerHeadSize(void){int nLen = 0; if(pszKey) nLen = lstrlenW(pszKey) + 1; return (WORD)(sizeof(wLength) + sizeof(wValueLength) + sizeof(wType) + nLen * sizeof(WCHAR));}
};
class String : public VerHead
{
public:
LPWORD pValue;
public:
String() : pValue(NULL){}
//String(LPCWSTR pszKeyName);
String(LPCWSTR pszKeyName, LPCWSTR pszValue);
virtual ~String(){if(pValue) delete []pValue;}
virtual int FromBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int SaveToBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int UpdateSize(void);
//virtual int GetLength(void){return AlignOffset(VerHead::GetLength()) + (lstrlenW((LPCWSTR)pValue) + 1) * sizeof(WCHAR); };
LPWORD SetValue(LPCWSTR pszValue);
};
class StringTable : public VerHead
{
public:
std::vector<String *> m_vString;
public:
StringTable(){}
virtual ~StringTable(){while(!m_vString.empty()){delete m_vString.back(); m_vString.pop_back();}}
virtual int FromBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int SaveToBuffer(LPVOID pVerBuffer, int nBufLen);
//virtual int GetLength(void);
virtual int UpdateSize(void);
String *FindStringByName(LPCWSTR pszStrName);
//String *FindStringByValue(LPCWSTR pszValue);
BOOL AddString(LPCWSTR pszKeyName, LPCWSTR pszValue);
BOOL RemoveString(LPCWSTR pszKeyName);
};
class StringFileInfo : public VerHead
{
public:
static const WCHAR *s_szKey;
std::vector<StringTable *> m_vStrTable;
public:
StringFileInfo(){}
virtual ~StringFileInfo(){while(!m_vStrTable.empty()){delete m_vStrTable.back(); m_vStrTable.pop_back();}};
virtual int FromBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int SaveToBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int Is_szKey(WCHAR *pszKey){return lstrcmpW(s_szKey, pszKey);}
virtual int UpdateSize(void);
BOOL AddString(LPCWSTR pszKeyName, LPCWSTR pszValue);
BOOL RemoveString(LPCWSTR pszKey);
};
class Var : public VerHead
{
public:
static const WCHAR *s_szKey;
virtual int Is_szKey(WCHAR *pszKey){return lstrcmpW(s_szKey, pszKey);}
public:
LPBYTE pValue;
public:
Var() : pValue(NULL) {}
virtual ~Var(){if(pValue) delete []pValue;};
virtual int FromBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int SaveToBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int UpdateSize(void);
};
class VarFileInfo : public VerHead
{
public:
std::vector<Var *> m_vVar;
public:
static const WCHAR *s_szKey;
virtual int Is_szKey(WCHAR *pszKey){return lstrcmpW(s_szKey, pszKey);}
public:
VarFileInfo(){}
virtual ~VarFileInfo(){while(!m_vVar.empty()){delete m_vVar.back(); m_vVar.pop_back();}};
virtual int FromBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int SaveToBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int UpdateSize(void);
};
class VersionInfo : public VerHead
{
private:
static const WCHAR *s_szKey;
virtual int Is_szKey(WCHAR *pszKey){return lstrcmpW(s_szKey, pszKey);}
public:
static const DWORD s_dwFixedFileInfoSignature = 0xFEEF04BD;
VS_FIXEDFILEINFO m_FixedFileInfo;
StringFileInfo m_strFileInfo;
VarFileInfo m_varFileInfo;
public:
VersionInfo(){VS_FIXEDFILEINFO vs_info = {0}; m_FixedFileInfo = vs_info;}
virtual ~VersionInfo(){};
virtual int FromBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int SaveToBuffer(LPVOID pVerBuffer, int nBufLen);
virtual int UpdateSize(void);
BOOL AddString(LPCWSTR pszKeyName, LPCWSTR pszValue);
BOOL RemoveString(LPCWSTR pszKeyName);
};