Пользовательское поле в версии файла в проекте C++

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

Спасибо Джон

1 ответ

Решение

Вы можете добавить дополнительные поля к информации о версии в вашем файле.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);
Другие вопросы по тегам