// hgsetver.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include #include static bool isLeap(int year) { if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) return true; return false; } static int getDays(int year, int month) { if (2 == month) { if (isLeap(year)) return 29; else return 28; } if (4 == month || 6 == month || 9 == month || 11 == month) { return 30; } return 31; } static int getPatchVersion() { SYSTEMTIME st; GetLocalTime(&st); int year = st.wYear; int day = st.wDay; int month = st.wMonth; int ret = year % 100; ret *= 1000; for (int i = 1; i < month; ++i) { ret += getDays(year, i); } ret += day; return ret; } int main(int argc, char* argv[]) { std::string brandFile; std::string resourceFile; std::string oemName = "OEM_HUAGAO"; std::string cpu = "x86"; for (int i = 1; i < argc; i++) { char* z = argv[i]; if (z == strstr(z, "-brandFile=")) brandFile = z + strlen("-brandFile="); else if (z == strstr(z, "-resourceFile=")) resourceFile = z + strlen("-resourceFile="); else if (z == strstr(z, "-oemName=")) oemName = z + strlen("-oemName="); else if (z == strstr(z, "-cpu=")) cpu = z + strlen("-cpu="); } printf("brandFile:%s\n", brandFile.c_str()); printf("resourceFile:%s\n", resourceFile.c_str()); printf("oemName:%s\n", oemName.c_str()); printf("cpu:%s\n", cpu.c_str()); if (brandFile.empty() || resourceFile.empty()) { return -1; } int mainVersion = 0; int subVersion = 0; int buildVersion = 0; int patchVersion = 0; FILE* fp = fopen(brandFile.c_str(), "r"); if (fp != NULL) { while (feof(fp) == 0) { char lineContent[2048] = { 0 }; if (NULL == fgets(lineContent, 2048, fp)) { continue; } if (0 == mainVersion) { char* p = strstr(lineContent, "VERSION_MAIN"); if (NULL != p) { p += strlen("VERSION_MAIN"); while (isspace(*p)) ++p; mainVersion = atoi(p); } } if (0 == subVersion) { char *p = strstr(lineContent, "VERSION_SUB"); if (NULL != p) { p += strlen("VERSION_SUB"); while (isspace(*p)) ++p; subVersion = atoi(p); } } if (0 != mainVersion && 0 != subVersion) { break; } } fclose(fp); } if (oemName == "OEM_LISICHENG") buildVersion = 14; else if (oemName == "OEM_HANWANG") buildVersion = 16; else if (oemName == "OEM_CANGTIAN") buildVersion = 18; else if (oemName == "OEM_ZHONGJING") buildVersion = 20; else if (oemName == "OEM_ZIGUANG") buildVersion = 22; else if (oemName == "OEM_DELI") buildVersion = 24; else if (oemName == "OEM_NEUTRAL") buildVersion = 26; else buildVersion = 10; buildVersion = buildVersion * 10; if (cpu == "x64") buildVersion += 1; else buildVersion += 0; buildVersion *= 100; patchVersion = getPatchVersion(); char version1[32] = { 0 }; sprintf(version1, "%d.%d.%d.%d", mainVersion, subVersion, buildVersion, patchVersion); char version2[32] = { 0 }; sprintf(version2, "%d,%d,%d,%d", mainVersion, subVersion, buildVersion, patchVersion); std::string resourceData; fp = fopen(resourceFile.c_str(), "r"); if (NULL != fp) { fseek(fp, 0, SEEK_END); long size = ftell(fp); fseek(fp, 0, SEEK_SET); char* buf = new char[size + 1]; fread(buf, 1, size, fp); buf[size] = 0; resourceData = buf; delete [] buf; fclose(fp); } if (resourceData.empty()) { return 0; } size_t offset = 0; while (1) { size_t pos = resourceData.find("0,0,0,0", offset); if (std::string::npos == pos) { break; } resourceData.replace(pos, strlen("0,0,0,0"), version2); offset = pos + strlen(version2); } offset = 0; while (1) { size_t pos = resourceData.find("0.0.0.0", offset); if (std::string::npos == pos) { break; } resourceData.replace(pos, strlen("0.0.0.0"), version1); offset = pos + strlen(version1); } fp = fopen(resourceFile.c_str(), "w"); if (NULL != fp) { fwrite(&resourceData[0], 1, resourceData.size(), fp); fclose(fp); } return 0; }