Глава 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];