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); 
+0

感谢该做的 – John 2011-05-26 15:27:04

+0

对我的作品后,我固定2个错误 - IronMensan,你得到这个代码编译?请参阅“翻译[Table?] Size”,并且我必须去掉字符串前面的“L”。 – 2014-01-07 04:09:24

+0

@TimCooper我认为这与我的实际代码之间的变化很少。 'MySpecialVersionInfo'而不是一个更有意义的字符串等等。我现在不在这家公司,所以我没有访问代码来比较。 “L”将文字标记为宽字符串,如果您需要它们,则取决于您的构建设置。 – IronMensan 2014-01-07 16:00:33