Пользовательское поле в версии файла в проекте C ++ - PullRequest
2 голосов
/ 26 мая 2011

Привет, есть ли способ создать настраиваемое поле в версии файла для проекта C ++.Чтобы мы могли видеть эти поля вместе с версией файла, названием компании и т. Д. Я хотел бы создать такие поля, как revision = 1000 Customization = OEM1.

Спасибо, Джон

1 Ответ

3 голосов
/ 26 мая 2011

Вы можете добавить дополнительные поля к информации о версии в вашем .rc файле.Вы не можете добавить числовые поля, но вы можете добавить локализованные строковые поля.Я никогда не пытался сделать это с помощью графического интерфейса, но я знаю, что вы можете сделать это, изменив файл напрямую.

В Visual C ++ щелкните правой кнопкой мыши свой файл .rc и нажмите «Просмотреть код».Где-то там вы найдете раздел, который начинается с:

BLOCK "StringFileInfo"

Этот блок, вероятно, имеет только один подблок:

BLOCK "0409904b0"

Это число является числовой версией локалидескриптор для en_us.Этот блок содержит несколько записей VALUE, таких как:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...