如何获得该软件的版本?

时间:2010-04-09 10:55:08

标签: c++ windows registry

我正在努力获取计算机上安装的软件版本。我已经实现了读取注册表的Uninstall配置单元的逻辑,但我观察到一些软件在注册表的Uninstall配置单元中没有版本条目。但我想展示这些软件的版本。

有人可以在这方面帮助我吗?

4 个答案:

答案 0 :(得分:4)

向Windows注册表提供软件版本是自愿的。如果您正在查看的软件开发人员选择不在那里显示版本或者根本不知道这种可能性,我无法将您指向他选择使用或注意的任何其他位置。实际上,该软件甚至可能没有版本号/名称。

答案 1 :(得分:3)

问问自己:如果不在注册表中,软件的版本详细信息还有哪些?如果它在注册表以外的其他位置可用,请询问我们是否可以使用C ++获取该详细信息。我想这可能是解决问题的更好方法。


添加了以下信息,因为OP正在寻找文件版本

查看以下代码是否可以为您提供帮助。

CString GetFileVersionInfo(CString strFile, CString strProperty)
{
    int rc;
    UINT nLen;
    DWORD nSize;
    DWORD dwHandle = 0;
    CString strBuffer;
    CString strValue;
    CString strBlock;
    void *lpPropertyBuffer;

    struct LANGANDCODEPAGE
    {
      WORD wLanguage;
      WORD wCodePage;
    } *lpTranslate;

    nSize = GetFileVersionInfoSize(strFile.GetBuffer(strFile.GetLength()), &dwHandle);
    ::GetFileVersionInfo(strFile.GetBuffer(strFile.GetLength()), 0, nSize, strBuffer.GetBuffer(nSize));

    // Read the list of languages and code pages.
    if (VerQueryValue(strBuffer.GetBuffer(strBuffer.GetLength()), "\\VarFileInfo\\Translation", (LPVOID *) &lpTranslate, &nLen))
    {
        strBlock.Format("\\StringFileInfo\\%04x%04x\\%s",
            lpTranslate->wLanguage,
            lpTranslate->wCodePage,
            strProperty);
        rc = VerQueryValue(strBuffer.GetBuffer(strBuffer.GetLength()), strBlock.GetBuffer(nSize), &lpPropertyBuffer, &nLen);
        if (rc != 0 && nLen > 0)
        {
            strncpy(strValue.GetBuffer(nLen + 1), (char *) lpPropertyBuffer, nLen);
            strValue.ReleaseBuffer(nLen);
        }
    }

    return strValue;
}

链接时的用户版本.lib,您可能需要winver.h进行编译。你可以像这样调用这个函数

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        AfxMessageBox(GetFileVersionInfo("shell32.dll", "ProductVersion"));
    }

    return nRetCode;
}

答案 2 :(得分:1)

我想看一下文件版本信息。您可能会发现this article对“添加/删除程序”对话框如何获取其信息非常有用。

答案 3 :(得分:0)

如果软件开发人员选择不在Uninstall信息中添加版本信息,那么就没有可靠的方法来获取它

您可以尝试查找应用程序的安装位置。但即使你有路径,应用程序也可以包含几个.exe文件,这些文件可以有不同的版本和产品名称。如果将DLL添加到候选列表中以获取版本信息,则结果变得更难以预测。