/*
功能:获取文件版本信息.
说明:要使用此函数必需在程序中加入
#pragma comment(lib, "Version.lib")
----------------------------------------------------------------------------
参数:szSrcfn=程序文件名
*/
void GetProductVersion(char* szSrcfn)
{
WORD nVer[4];
DWORD dwVerHnd= 0;
DWORD dwVerInfoSize = GetFileVersionInfoSize((LPSTR)szSrcfn, &dwVerHnd);
if(dwVerInfoSize)
{
//可以读取文件信息
//注释部分是另外一种方法,不太清楚那几个函数的用法,以后慢慢看
//HANDLE hMem;
//LPVOID lpvMem;
unsigned int uInfoSize = 0;
VS_FIXEDFILEINFO * pFileInfo;
//hMem= GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
//lpvMem= GlobalLock(hMem);
//GetFileVersionInfo((LPSTR)szSrcfn, dwVerHnd, dwVerInfoSize, lpvMem);
//VerQueryValue(lpvMem, (LPTSTR)_T("//"), (void**)&pFileInfo, &uInfoSize);
char *VerData = new char[dwVerInfoSize];
GetFileVersionInfo((LPSTR)szSrcfn, dwVerHnd, dwVerInfoSize, (void*)VerData);
VerQueryValue((void*)VerData, (LPTSTR)_T("//"), (void**)&pFileInfo, &uInfoSize);
//如果版本为1.2.3.4,那么nVer[0]=1, nVer[1]=2, nVer[2]=3, nVer[3]=4
nVer[0] = HIWORD(pFileInfo->dwFileVersionMS);
nVer[1] = LOWORD(pFileInfo->dwFileVersionMS);
nVer[2] = HIWORD(pFileInfo->dwFileVersionLS);
nVer[3] = LOWORD(pFileInfo->dwFileVersionLS);
delete [] VerData;
//GlobalUnlock(hMem);
//GlobalFree(hMem);
}
}
//下面是FindFirstFile,FileNextFile的用法
//函数作用:替换一个文件中的版本信息(遍历目录),实际例子:更新WOW中UI的版本信息
void ChangeVersion(char *Path, int VerSion)
{
string PathUI = Path;
PathUI += "//";
HANDLE hFile;
WIN32_FIND_DATA FileData;
list<string> DirectoryList;
//把目录下的所有子目录加入DirectoryList中
DirectoryList.push_back(PathUI);
for(list<string>::const_iterator i=DirectoryList.begin(); i!=DirectoryList.end(); ++i)
{
char pathTemp[MAX_PATH] = {0};
strcpy(pathTemp, i->c_str());
strcat(pathTemp, "*.*");
hFile = FindFirstFile(pathTemp, &FileData);
if(hFile != INVALID_HANDLE_VALUE)
{
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //目录
{
if(strcmp(FileData.cFileName, ".") && strcmp(FileData.cFileName, ".."))
{
string DirectoryName = FileData.cFileName;
DirectoryList.push_back(*i + DirectoryName + "//");
}
}
while(FindNextFile(hFile, &FileData))
{
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(strcmp(FileData.cFileName, ".") && strcmp(FileData.cFileName, ".."))
{
string DirectoryName = FileData.cFileName;
DirectoryList.push_back(*i + DirectoryName + "//");
}
}
}
}
}
//查找子目录下的.toc文件
for(i=DirectoryList.begin(); i!=DirectoryList.end(); ++i)
{
char pathTemp[MAX_PATH] = {0};
strcpy(pathTemp, i->c_str());
strcat(pathTemp, "*.toc");
hFile = FindFirstFile(pathTemp, &FileData);
if(hFile != INVALID_HANDLE_VALUE)
{
//处理文件,不能直接替换文件里的内容,所以只能把文件全部读出来,修改后在全部写入
FILE *fp;
string FileName = i->c_str();
FileName += FileData.cFileName;
fp = fopen(FileName.c_str(), "r");
if(NULL == fp)
{
MessageBox(NULL, "不能读取toc文件", "更新失败", MB_OK);
break;
}
fseek(fp, 0, SEEK_END);
int length = ftell(fp);
char *s = new char[length+1];
memset(s, 0, sizeof(char)*(length+1));
fseek(fp, 0, SEEK_SET);
fread(s, length, 1, fp);
fclose(fp);
char *p = strstr(s, "## Interface: ");
p += 14;
//替换版本号
char sWowVer[5];
itoa(VerSion, sWowVer, 10);
for(int j=0; j<4; j++)
{
*p = sWowVer[j];
p++;
}
fp = fopen(FileName.c_str(), "w");
if(NULL == fp)
{
MessageBox(NULL, "不能写入toc文件", "更新失败", MB_OK);
break;
}
fputs(s, fp);
fclose(fp);
delete [] s;
}
}
}