2011-05-26 43 views
2

嗨 有沒有辦法在C++項目的文件版本中創建一個自定義字段。以便我們可以看到這些字段以及文件版本,公司名稱等。我想創建字段,如 revision = 1000 定製= OEM1 。C++項目文件版本中的自定義字段

感謝 約翰

回答

3

您可以添加額外的字段到您的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