C++项目文件版本中的自定义字段
问题描述:
嗨 有没有办法在C++项目的文件版本中创建一个自定义字段。以便我们可以看到这些字段以及文件版本,公司名称等。我想创建字段,如 revision = 1000 定制= OEM1 。C++项目文件版本中的自定义字段
感谢 约翰
答
您可以添加额外的字段到您的rc文件的版本信息。您不能添加数字字段,但可以添加本地化的字符串字段。我从来没有试图用GUI来做这件事,但我知道你可以通过直接更改文件来做到这一点。
在Visual C++中,右键单击您的.rc文件并单击“查看代码”。某处在那里,你会发现,开头段:
BLOCK "StringFileInfo"
这可能阻止只有一个子块:
BLOCK "0409904b0"
这个数字是语言环境描述符EN_US的数字版本。该模块包含了几个值项,如:
VALUE "FileVersion", "1, 0, 0, 0"
VALUE "OriginalFilename", "MyProjectName"
您可以添加您想在此部分中的任何领域,它会显示在属性对话框中可执行文件的版本选项卡上。
如果您需要能够在运行时读取这些值,你可以都使用GetFileVersionInfo是这样的:
wchar_t myModululeName[MAX_PATH];
GetModuleFileName(NULL,myModuleName,MAX_PATH);
DWORD dummy;
DWORD versionSize=GetFileVersionInfoSize(myModuleName,&dummy);
//I don't remember why I added extra space to these
void * versionInfo=malloc(versionSize+10);
GetFileVersionInfo(myModuleName,0,versionSize+1,versionInfo);
//This part is optional
//The VS_FIXEDFILEINFO contains information from the non-localized parts of
//the "StringFileInfo" block in the .rc file
VS_FIXEDFILEINFO * fixedFileInfo;
UINT fixedFileSize;
VerQueryValue(versionInfo,L"\\",(void **)(&fixedFileInfo),&fixedFileSize);
//This will retrieve the local codes that are defined in the StringFileInfo block
WORD * translationTable;
UINT translationSize;
VerQueryValue(verionInfo,L"\\VarFileInfo\\Translation",(void **)(&translationTable),&translationTableSize);
//This always uses the first locale, you could examine translationTable
//if you need to for other codes
wchar_t mySpecialQuery[128];
sprintf_s(mySpecialQuery,L"\\StringFileInfo\\%04x%04x\\MySpecialVersionInfo",translationTable[0],translationTable[1]);
wchar_t * mySpecialValue;
UINT mySpecialValueSize;
VerQueryValue(versionInfo,mySpecialQuery,(void **)(&mySpecialValue),&mySpecialValueSize);
//you can now do whatever you need to do with mySpecialValue, including using _wtoi()
//and query for more values
free(versionInfo);
感谢该做的 – John 2011-05-26 15:27:04
对我的作品后,我固定2个错误 - IronMensan,你得到这个代码编译?请参阅“翻译[Table?] Size”,并且我必须去掉字符串前面的“L”。 – 2014-01-07 04:09:24
@TimCooper我认为这与我的实际代码之间的变化很少。 'MySpecialVersionInfo'而不是一个更有意义的字符串等等。我现在不在这家公司,所以我没有访问代码来比较。 “L”将文字标记为宽字符串,如果您需要它们,则取决于您的构建设置。 – IronMensan 2014-01-07 16:00:33