zoukankan      html  css  js  c++  java
  • 如何判断是否安装了VC RUNTIME

      先得说下GUID,它是Globally Unique Identifier的简称,中文翻译为“全球唯一标示符”,在Windows系统中也称之为Class ID,缩写为CLSID。对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件,Windows都会分配一个唯一表示它的ID代码。CLSID是一个128位的随机数,为了确保它的随机性,避免重复,它的算法主要是从两个方面入手:

      1. 一部分数字来自于系统网卡的序列号,由于每一个网卡的MAC地址都不一样,因此产生的ID也就会有差异。

      2. 另外一部分数字来自于系统的当前时间。

      有人计算过按照上面两种方式得到ID的随机性,得出的结论是:即使一台电脑每秒产生10000000个CLSID,也可以保证3240年不会重复。

      在注册表中展开HKEY_CLASSES_ROOTCLSID,在CLSID分支下面就可以看到很多的ID,这些ID对应的都是系统里面不同的程序,文件,系统组件等

      CLSID象人身份证一样,是个类的唯一标识

      id是唯一的标识,class则不是~class可以作为ID的样式或属性的补充!

      class是对某种类型的对象定义变量和方法的原型

      ID身份 (identification, identity)

      ID是英文IDentity的缩写,ID是身份标识号码的意思,就是一个序列号,也叫帐号,是一个编码,而且是唯一的.

      为了避免冲突,微软使用GUID作为CLSID,有生成GUID的函数,主要是根据当时的时间、机器地址等信息动态产生,理论上可保证全球唯一。

    常见组件类对应的CLSID

      我的文档:450D8FBA-AD25-11D0-98A8-0800361B1103

      我的电脑:20D04FE0-3AEA-1069-A2D8-08002B30309D

      网上邻居:208D2C60-3AEA-1069-A2D7-08002B30309D

      回收站:645FF040-5081-101B-9F08-00AA002F954E

      Internet Explorer:871C5380-42A0-1069-A2EA-08002B30309D

      控制面板:21EC2020-3AEA-1069-A2DD-08002B30309D

      拨号网络/网络连接 :992CFFA0-F557-101A-88EC-00DD010CCC48

      任务计划 :D6277990-4C6A-11CF-8D87-00AA0060F5BF

      打印机(和传真):2227A280-3AEA-1069-A2DE-08002B30309D

      历史文件夹:7BD29E00-76C1-11CF-9DD0-00A0C9034933

    恶意广告插件CLSID:

      上面说到电脑上所有的的软件都有CLSID,那么恶意插件也有。比如下面的:

      伪造IE浏览器:871C5380-42A0-1069-A2EA-08002B303099

      如果你怀疑自己的电脑是否中了伪造IE浏览器恶意广告插件,进入注册表,发现有这段CLSID,那么就肯定中了。

    生成GUID的C++代码(CLISID的生成)

      //--生成GUID的代码

      //--相关程序/微软guidgen.exe

      #include <objbase.h>

      #include <stdio.h>

      //--生成GUID

      const char* newGUID()

      {

       static char buf[64] = {0};

       GUID guid;

       if (S_OK == ::CoCreateGuid(&guid))

       {

        _snprintf(buf, sizeof(buf)

        , "{X-X-x-XX-XXXXXX}"

        , guid.Data1 , guid.Data2 , guid.Data3 , guid.Data4[0], guid.Data4[1]

        , guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]

        , guid.Data4[6], guid.Data4[7] );

       }

       return (const char*)buf;

      }

      int main(int argc, char* argv[])

      {

       //--COM

       CoInitialize(NULL);

       printf(newGUID());

       printf(" ");

       //--COM

       CoUninitialize();

       return 0;

      }

    在进行判断是否安装了VC RUNTIME时,需要读取 SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/UNINSTALL,查看是否包括相应的项:

    vc2005库的CLSID

    Visual C++ 2005 runtime files
    Visual C++ 2005 (x86) - {A49F249F-0C91-497F-86DF-B2585E8E76B7}
    Visual C++ 2005 (x64) - {6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}
    Visual C++ 2005 (ia64)- {03ED71EA-F531-4927-AABD-1C31BCE8E187}
    Visual C++ 2005 SP1 runtime files
    Visual C++ 2005 SP1 (x86) - {7299052B-02A4-4627-81F2-1818DA5D550D}
    Visual C++ 2005 SP1 (x64) - {071C9B48-7C32-4621-A0AC-3F809523288F}
    Visual C++ 2005 SP1 (ia64)- {0F8FB34E-675E-42ED-850B-29D98C2ECE08}
    Visual C++ 2005 SP1 ATL Security Update runtime files
    Visual C++ 2005 SP1 ATL (x86) - {837B34E3-7C30-493C-8F6A-2B0F04E2912C}

    Visual C++ 2005 SP1 ATL (x64) - {6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}
    Visual C++ 2005 SP1 ATL (ia64) - {85025851-A784-46D8-950D-05CB3CA43A13}

    再补充一下vc2008库的CLSID

    Microsoft Visual C++ 2008 (x86) {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
    Microsoft Visual C++ 2008 (x64) {350AA351-21FA-3270-8B7A-835434E766AD}
    Microsoft Visual C++ 2008 (IA64){2B547B43-DB50-3139-9EBE-37D419E0F5FA}

    Microsoft Visual C++ 2008 SP1 (x86) {9A25302D-30C0-39D9-BD6F-21E6EC160475}

    Microsoft Visual C++ 2008SP1 (x86)  {86CE1746-9EFF-3C9C-8755-81EA8903AC34}
    Microsoft Visual C++ 2008 SP1 (x64) {8220EEFE-38CD-377E-8595-13398D740ACE}
    Microsoft Visual C++ 2008 SP1 (IA64){5827ECE1-AEB0-328E-B813-6FC68622C1F9}

        其实这仅仅是一方面,在很多时候检查某个插件是否已经安装的方法都是采用注册表判断GUID的,比如说在使用Installshield做安装脚本的时候就是这样,例如:
    //第三方插件支持
    MessageBox("系统现在检测是否需要安装插件,请稍等!", WARNING);
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
    if (RegDBKeyExist("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475}")< 0) then      
    if (RegDBKeyExist("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{86CE1746-9EFF-3C9C-8755-81EA8903AC34}")< 0) then      
      if(LaunchAppAndWait(SRCDIR^"******\插件\vcredist_x86.exe","", LAAW_OPTION_WAIT)<0)then
         if( FindFile(SRCDIR^"program files\**软件\插件","vcredist_x86.exe",svResult)=0 ) then   
             MessageBox("系统检测到没有安装插件,现在要进行安装!", WARNING);
             LaunchAppAndWait( SRCDIR^"program files\***软件\插件\vcredist_x86.exe","",NOWAIT );
         endif;     
      endif;
     endif;  
    endif;

    http://blog.sina.com.cn/s/blog_711092660100odtn.html

  • 相关阅读:
    (Java实现) 洛谷 P1106 删数问题
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1106 删数问题
    目测ZIP的压缩率
  • 原文地址:https://www.cnblogs.com/findumars/p/5538837.html
Copyright © 2011-2022 走看看