Глава 26. Многодокументный интерфейс___________________________787
uint32 dwSize = ::GetFileVersionInfoSize(appFName, SfvHandle);
if (dwSize) {
FVData = (void far *)new char[(uint)dwSize];
if (::GetFileVersionInfo(appFName, fvHandle, dwSize, FVData)) { // Копирование в буфер, чтобы при установленном ключе // компилятора -de (размещать строковые константы // в сегменте кода) функция VerQueryValue работала под Winl6. // Это решает проблему в ver.dll, которая записывает в строку, // указываемую subBlockName. // strcpy(subBlockName, "\\VarFileInfo\\Translation") ;
if (!::VerQueryValue(FVData, subBlockName,
(void far* far*)STransBlock, svSize)) ( delete[] FVData;
FVData = 0;
} . '. else
// Перестановка слов так, чтобы sprintf напечатала
// lang-charset в правильном формате. ,
//
*(uint32 *)TransBlock =
MAKELONG(HIWORD(*(uint32 *)TransBlock), LOWORDt*(uint32 *)TransBlock));
) } )
ProjectRCVersion::-ProjectRCVersion() {
if (FVData)
delete[] FVData;
}
bool ProjectRCVersion::GetProductName(LPSTR& prodName) {
uint vSize;
TAPointer<char> subBlockName = new char[255];
if (FVData) {
sprintf(subBlockName, "\\StringFileInfo\\%081x\\%s",
*(uint32 *)TransBlock,(LPSTR)"ProductName") ;
return FVData ? ::VerQueryValue(FVData, subBlockName,
(void far* far*)SprodName, &vSize) : false;
} else
return false; , )
bool ProjectRCVersion::GetProductVersion(LPSTR& prodVersion) {
uint vSize;
TAPointer<char> subBlockName = new char[255];