我如何检测" Visual C ++ 2013可再发行"已安装?
以下c ++代码正确检测到2010 redist:
// Visual C++ 2010 Redist detection...
INSTALLSTATE state = pMsiProc( _T("{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}") );
if(state == INSTALLSTATE_DEFAULT)
{
// Visual C++ 2010 redist installed.
}
我希望在2013 redist中使用相同类型的代码,但无论是否安装了软件包,INSTALLSTATE都会返回INSTALLSTATE_DEFAULT。谁知道为什么?
// call MsiQueryProductStateW...
INSTALLSTATE state = pMsiProc(_T("{13A4EE12-23EA-3371-91EEEFB36DDFFF3E}"));
//
if ((state == INSTALLSTATE_DEFAULT || state == INSTALLSTATE_LOCAL)
{
// 2013 redist is installed.
}
答案 0 :(得分:1)
您是否使用x86架构?如果没有,代码就不同了:https://allthingsconfigmgr.wordpress.com/2013/12/17/visual-c-redistributables-made-simple/
答案 1 :(得分:0)
作为替代方案,您可以枚举注册表,查看以下标记的“ Displayname ”键:“Microsoft”,“Visual”,“C ++”,“Redistributable”。您可以使用以下内容来确定子键是否是您所追求的......
// search for valid tokens to indicate this is a redistributable.
resToken = name.Tokenize (_T(" "), curPos);
while (resToken != _T(""))
{
if (resToken == _T("Microsoft"))
tokenCount |= 0x01;
if (resToken == _T("Visual"))
tokenCount |= 0x02;
if (resToken == _T("C++"))
tokenCount |= 0x04;
if (resToken == _T("Redistributable"))
tokenCount |= 0x08;
resToken = name.Tokenize (_T(" "), curPos);
}
// check for matching tokens in the Display Name.
if (tokenCount == 0x0f)
{
只需在“ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall ”开始搜索,并枚举上述值的所有子键。您还需要检查32和64位的配置单元。