【问题标题】:Can I Write Version Information API For Both CHAR And WCHAR?我可以为 CHAR 和 WCHAR 编写版本信息 API 吗?
【发布时间】:2015-04-25 00:44:31
【问题描述】:

我还没有达到我的目标。

GetFileVersionInfoSize() 与其他两个函数 GetFileVersionInfo()VerQueryValue() 一起工作正常。我想为其添加更多功能以使其完整。

我已将其编码为在 WCHAR 上运行,并且想知道让它在 CHAR 上运行是否有意义?

有没有一种方法可以让我编写一次代码,然后两者都可以使用?

另外,有没有办法枚举 \\StringFileInfo\\lang-codepage\\* 的内容?

DWORD GetFileVersionInfo3(const TCHAR *pszFilePath, std::vector<std::pair<std::wstring, std::wstring>> *lplist)
{
    DWORD               dwSize = 0;
    BYTE                *pbVersionInfo = NULL;
    VS_FIXEDFILEINFO    *pFileInfo = NULL;
    UINT                puLenFileInfo = 0;

    dwSize = GetFileVersionInfoSize(pszFilePath, NULL);
    if (dwSize == 0)
    {
        printf("\nError in GetFileVersionInfoSize: %d\n", GetLastError());
        return 1;
    }

    pbVersionInfo = new BYTE[dwSize];
    memset(pbVersionInfo, '\0', dwSize);

    if (!GetFileVersionInfo(pszFilePath, 0, dwSize, pbVersionInfo))
    {
        printf("\nError in GetFileVersionInfo: %d\n", GetLastError());
        delete[] pbVersionInfo;
        return 1;
    }

    if (!VerQueryValue(pbVersionInfo, TEXT("\\"), (LPVOID*)&pFileInfo, &puLenFileInfo))
    {
        printf("\nError in VerQueryValue: %d\n", GetLastError());
        delete[] pbVersionInfo;
        return 1;
    }

    if (!VerQueryValue(pbVersionInfo, TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, &puLenFileInfo))
    {
        printf("\nError in VerQueryValue: %d\n", GetLastError());
        return 1;
    }

    std::vector<std::wstring>::iterator itr;
    std::vector<std::wstring> wlist;
    wlist.clear();
    wlist.push_back(L"FileDescription");
    wlist.push_back(L"InternalName");
    wlist.push_back(L"OriginalFilename");
    wlist.push_back(L"CompanyName");
    wlist.push_back(L"FileVersion");
    wlist.push_back(L"ProductName");
    wlist.push_back(L"ProductVersion");
    wlist.push_back(L"LegalCopyright");

    char fileEntry[1024];
    for (int i = 0; i < (puLenFileInfo / sizeof(struct LANGANDCODEPAGE)); i++)
    {
        sprintf_s(fileEntry, 1024, "\\StringFileInfo\\%04x%04x\\",
        lpTranslate[i].wLanguage,
        lpTranslate[i].wCodePage);

        lplist->push_back(std::pair<std::wstring, std::wstring>(L"File: ", pszFilePath));

        std::string s1(fileEntry);
        for (itr = wlist.begin(); itr != wlist.end(); itr++)
        {
            std::wstring item = *itr;
            std::wstring wstr;
            wstr.append(s1.begin(), s1.end());
            wstr.append(item);
            LPVOID lpBuffer = NULL;
            UINT   dwBytes = 0;
            bool bRes = VerQueryValue(pbVersionInfo, wstr.c_str(), (LPVOID*)&lpBuffer, &dwBytes);
            if (!bRes)
            {
                continue;
            }
            LPTSTR wsResult;
            wsResult = (LPTSTR)lpBuffer;
            lplist->push_back(std::pair<std::wstring, std::wstring>(item, wsResult));
        }
    }

    return 0;
}

【问题讨论】:

  • 枚举StringFileInfo 应该作为一个单独的问题提出。

标签: winapi character-encoding version


【解决方案1】:

由于您使用的是TCHAR,因此请使用std:::basic_string&lt;TCHAR&gt; 而不是std::wstring 进行匹配。否则,删除TCHAR 并使用WCHAR 处理所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2013-03-21
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多