我正在努力获取安装在计算机上的软件版本。 我已经实现了读取卸载registryconfiguration单元的逻辑,但是我发现某些软件没有registry的卸载configuration单元中的版本条目。 但是我也想显示这些软件的版本。
有人能在这方面帮助我吗?
向Windows注册表提供软件版本是自愿的。 如果您正在查看的软件的开发人员选择不显示该版本或者根本不知道这种可能性,我无法指出您将选择使用或意识到的任何其他位置。 实际上,软件甚至可能没有版本号/名称。
问问自己: 如果不在注册表中,可用软件的版本详情还有哪些? 如果它在注册表以外的地方可用,请询问我们是否可以使用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; }
用户version.lib链接时,您可能需要winver.h编译。 你可以像这样调用函数
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetmoduleeHandle(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; }
我会说看看文件版本信息。 你可能会发现这篇文章对于Add / Remove Programs对话框如何获取它的信息很有用。
如果软件开发人员选择不将版本信息添加到卸载信息中,则没有可靠的方法来获取它 。
您可以尝试查找应用程序的安装位置。 但即使您有路径,应用程序也可以包含多个.exe文件,这些文件可以具有不同的版本和产品名称。 如果将DLL添加到获取版本信息的候选列表中,结果变得更加难以预测。