首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C++生成器获取版本信息条目

如何使用C++生成器获取版本信息条目
EN

Stack Overflow用户
提问于 2018-11-30 17:51:41
回答 2查看 1.2K关注 0票数 1

How to get version info的线程显示了获取FileVersion的代码,我需要获得其他值,包括我自己添加到VersionInfo表中的一些值。

如何让他们使用C++Builder 10.2 (东京)?

我以前在C++Builder 6.0中使用VerQueryValue方法获得它们,但是它在类型上引发了太多的异常。

我不知道如何将代码更改为C++Builder 10.2。

Bellow是我使用的实际代码:

class.h

代码语言:javascript
复制
struct TransArray
{
    WORD LanguageID, CharacterSet;
};
DWORD VerInfo, VerSize;
HANDLE MemHandle;
LPVOID MemPtr, BufferPtr;
UINT BufferLength;
TransArray *Array;
char QueryBlock[255];
String FFileVersion ;

class.cpp

代码语言:javascript
复制
// this one of the methods which have errors
String __fastcall TAppVersion::GetFileVersion(void)
{
    String Result ;
    BufferPtr = NULL ;

    // Get the product version.
    wsprintf(QueryBlock, "\\StringFileInfo\\%04x%04x\\FileVersion",
                    Array[0].LanguageID, Array[0].CharacterSet);
    VerQueryValue(MemPtr, QueryBlock, &BufferPtr, &BufferLength);

    if(BufferPtr) Result = (char *)BufferPtr;

    return(Result);
}
//---------------------------------------------------
__fastcall TAppVersion::TAppVersion()
{
    FFileName = Application->ExeName ;
    VerSize = GetFileVersionInfoSize(FFileName.c_str(), &VerInfo);
    if (VerSize > 0) {
        MemHandle = GlobalAlloc(GMEM_MOVEABLE, VerSize);
        MemPtr = GlobalLock(MemHandle);
        GetFileVersionInfo(FFileName.c_str(), VerInfo, VerSize, MemPtr);
        VerQueryValue(MemPtr, "\\VarFileInfo\\Translation", &BufferPtr,
                                &BufferLength);
        Array = (TransArray *)BufferPtr;

        FFileVersion = GetFileVersion();
    }
}
//-----------------------------------------------
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-03 21:15:33

您的代码错误地混合了ANSI和UNICODE逻辑。VerQueryValue()是一个预处理宏,它分别根据是否定义了VerQueryValueW()VerQueryValueA()映射到UNICODE。您的代码假定使用了VerQueryValueA(),但情况并不总是这样。在现代版本的C++Builder中,默认情况下将使用VerQueryValueW()

尝试更像这样的东西:

代码语言:javascript
复制
struct TransArray
{
    WORD LanguageID, CharacterSet;
};

DWORD VerInfo, VerSize;
LPVOID MemPtr, BufferPtr;
UINT BufferLength;
TransArray *Array;
String FFileName, FFileVersion;

...

#include <tchar.h>

String __fastcall TAppVersion::GetFileVersion(void)
{
    String Result;

    if (MemPtr && Array)
    {
        // Get the product version.
        TCHAR QueryBlock[40];
        _stprintf(QueryBlock, _T("\\StringFileInfo\\%04x%04x\\FileVersion"), Array[0].LanguageID, Array[0].CharacterSet);
        if (VerQueryValue(MemPtr, QueryBlock, &BufferPtr, &BufferLength)) {
            Result = String(static_cast<TCHAR*>(BufferPtr), BufferLength).Trim();
        }
    }

    return Result;
}
//---------------------------------------------------
__fastcall TAppVersion::TAppVersion()
{
    MemPtr = NULL;
    Array = NULL;

    FFileName = Application->ExeName;

    DWORD Unused;
    VerSize = GetFileVersionInfoSize(FFileName.c_str(), &Unused);
    if (VerSize == 0) return;

    MemPtr = new BYTE[VerSize];
    if (GetFileVersionInfo(FFileName.c_str(), Unused, VerSize, MemPtr)) {
        if (VerQueryValue(MemPtr, TEXT("\\VarFileInfo\\Translation"), &BufferPtr, &BufferLength) {
            Array = (TransArray *) BufferPtr;
            FFileVersion = GetFileVersion();
        }
    }
}
//-----------------------------------------------
__fastcall TAppVersion::~TAppVersion()
{
    delete[] static_cast<BYTE*>(MemPtr);
}
//-----------------------------------------------

尽管实际上,在现代代码中根本不应该依赖TCHAR

代码语言:javascript
复制
struct TransArray
{
    WORD LanguageID, CharacterSet;
};

DWORD VerInfo, VerSize;
LPVOID MemPtr, BufferPtr;
UINT BufferLength;
TransArray *Array;
UnicodeString FFileName, FFileVersion;

...

UnicodeString __fastcall TAppVersion::GetFileVersion(void)
{
    UnicodeString Result;

    if (MemPtr && Array)
    {
        // Get the product version.
        WCHAR QueryBlock[40];
        swprintf(QueryBlock, L"\\StringFileInfo\\%04x%04x\\FileVersion", Array[0].LanguageID, Array[0].CharacterSet);
        if (VerQueryValueW(MemPtr, QueryBlock, &BufferPtr, &BufferLength)) {
            Result = UnicodeString(static_cast<WCHAR*>(BufferPtr), BufferLength).Trim();
        }
    }

    return Result;
}
//---------------------------------------------------
__fastcall TAppVersion::TAppVersion()
{
    MemPtr = NULL;
    Array = NULL;

    FFileName = Application->ExeName;

    DWORD Unused;
    VerSize = GetFileVersionInfoSizeW(FFileName.c_str(), &Unused);
    if (VerSize == 0) return;

    MemPtr = new BYTE[VerSize];
    if (GetFileVersionInfoW(FFileName.c_str(), Unused, VerSize, MemPtr)) {
        if (VerQueryValueW(MemPtr, L"\\VarFileInfo\\Translation", &BufferPtr, &BufferLength) {
            Array = (TransArray *) BufferPtr;
            FFileVersion = GetFileVersion();
        }
    }
}
//-----------------------------------------------
__fastcall TAppVersion::~TAppVersion()
{
    delete[] static_cast<BYTE*>(MemPtr);
}
//-----------------------------------------------
票数 3
EN

Stack Overflow用户

发布于 2018-11-30 18:18:03

不久前我玩过这个游戏。它是不完整的,我会把它叫做beta 1,但现在开始了。

标题:

代码语言:javascript
复制
class TAppVerInfo
{
public:
    __fastcall TAppVerInfo(const wchar_t* pModPath);
    __fastcall virtual ~TAppVerInfo(void);

    __property System::String LanguagesCodePage                         = {read = GetCodePage};
    __property System::String Comments[System::String LanId]            = {read = GetComments};
    __property System::String InternalName[System::String LanId]        = {read = GetInternalName};
    __property System::String ProductName[System::String LanId]         = {read = GetProductName};
    __property System::String CompanyName[System::String LanId]         = {read = GetCompanyName};
    __property System::String LegalCopyright[System::String LanId]      = {read = GetLegalCopyright};
    __property System::String ProductVersion[System::String LanId]      = {read = GetProductVersion};
    __property System::String FileDescription[System::String LanId]     = {read = GetFileDescription};
    __property System::String LegalTrademarks[System::String LanId]     = {read = GetLegalTrademarks};
    __property System::String PrivateBuild[System::String LanId]        = {read = GetPrivateBuild};
    __property System::String FileVersion[System::String LanId]         = {read = GetFileVersion};
    __property System::String OriginalFilename[System::String LanId]    = {read = GetOriginalFilename};
    __property System::String SpecialBuild[System::String LanId]        = {read = GetSpecialBuild};

protected:
    void *VerInfo;

    System::String __fastcall GetCodePage(void);
    System::String __fastcall GetComments(System::String LanId);
    System::String __fastcall GetInternalName(System::String LanId);
    System::String __fastcall GetProductName(System::String LanId);
    System::String __fastcall GetCompanyName(System::String LanId);
    System::String __fastcall GetLegalCopyright(System::String LanId);
    System::String __fastcall GetProductVersion(System::String LanId);
    System::String __fastcall GetFileDescription(System::String LanId);
    System::String __fastcall GetLegalTrademarks(System::String LanId);
    System::String __fastcall GetPrivateBuild(System::String LanId);
    System::String __fastcall GetFileVersion(System::String LanId);
    System::String __fastcall GetOriginalFilename(System::String LanId);
    System::String __fastcall GetSpecialBuild(System::String LanId);
    System::String __fastcall GetValue(const System::String& LanId, const wchar_t* pName);
};

CPP:

代码语言:javascript
复制
__fastcall TAppVerInfo::TAppVerInfo(const wchar_t* pModPath)
{
    DWORD dwUnused;
    DWORD VerInfoSize = GetFileVersionInfoSize(pModPath, &dwUnused);

    VerInfo = malloc(VerInfoSize);
    if(VerInfo)
    {
        if(0 == GetFileVersionInfo(pModPath, 0, VerInfoSize, VerInfo))
        {
            free(VerInfo);
            VerInfo = NULL;
            throw Exception(SysErrorMessage(GetLastError()));
        }
    } //040904E4
}
//---------------------------------------------------------------------------
__fastcall TAppVerInfo::~TAppVerInfo(void)
{
    if(VerInfo)
        free(VerInfo);
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetCodePage(void)
{
    System::String retVal;

    if(VerInfo)
    {
        struct LANGANDCODEPAGE
        {
            WORD wLanguage;
            WORD wCodePage;
        } *lpTranslate;
        UINT cbTranslate;
        TAutoStringList tStr(new TStringList);
        UINT i;

        VerQueryValue(VerInfo,L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate);
        for(i = 0; i < (cbTranslate/sizeof(LANGANDCODEPAGE)); i++)
            tStr->Add(System::String().sprintf(L"%04x%04x", lpTranslate[i].wLanguage, lpTranslate[i].wCodePage));
        retVal = tStr->CommaText;
    }
    return retVal;
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetComments(System::String LanId)
{
    return GetValue(LanId, L"Comments");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetInternalName(System::String LanId)
{
    return GetValue(LanId, L"InternalName");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetProductName(System::String LanId)
{
    return GetValue(LanId, L"ProductName");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetCompanyName(System::String LanId)
{
    return GetValue(LanId, L"CompanyName");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetLegalCopyright(System::String LanId)
{
    return GetValue(LanId, L"LegalCopyright");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetProductVersion(System::String LanId)
{
    return GetValue(LanId, L"ProductVersion");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetFileDescription(System::String LanId)
{
    return GetValue(LanId, L"FileDescription");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetLegalTrademarks(System::String LanId)
{
    return GetValue(LanId, L"LegalTrademarks");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetPrivateBuild(System::String LanId)
{
    return GetValue(LanId, L"PrivateBuild");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetFileVersion(System::String LanId)
{
    return GetValue(LanId, L"FileVersion");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetOriginalFilename(System::String LanId)
{
    return GetValue(LanId, L"OriginalFilename");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetSpecialBuild(System::String LanId)
{
    return GetValue(LanId, L"SpecialBuild");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetValue(const System::String& LanId, const wchar_t* pName)
{
    System::String retVal;

    if(VerInfo)
    {
        System::String aPath(System::String().sprintf(L"\\StringFileInfo\\%s\\%s", LanId.c_str(), pName));
        wchar_t *pBuf;
        UINT uLen;

        if(VerQueryValue(VerInfo, aPath.c_str(), (void**)&pBuf, &uLen))
            retVal = System::String(pBuf);
    }
    return retVal;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53562512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档