首先我把自己做的ACTIVEX控件和其需要调用的dll一起打包成cab然后将其发布在internet上,客户端打开我的网页时,会自动下载cab
控件保存在Downloaded Program Files下,dll保存在system32下我的问题是,一旦客户端不小心把system32下的dll删除了,再次打开网页时,由于本地有控件就不会来下载cab,这时控件就加载dll失败,请问这个问题怎么解决呢?谢谢

解决方案 »

  1.   

    1.在你的控件启动部分检查dll的完整性。这一部需要一些技巧,不能引用你的dll.如果发现不完整,就卸载自己。这样用户刷新的时候会重新下载。2.把你的dll动态loadlib.或在控件中发现差dll就去urldownloadfile.
      

  2.   

    顶一下,顺便问一下,你那个授权是怎么做的
    为什么,我开的发提示没有得到ROOT 信任,怎么处理的
    这个setup.inf 没有错吧version] 
    signature="$CHINA$"
    AdvancedINF=2.0  [Add.Code]
    activex.ocx= activex.ocx
    MSVCRT.DLL= MSVCRT.DLL
    MFC42.DLL= MFC42.DLL
    OLEPRO32.DLL= OLEPRO32.DLL[msvcrt.dll]
       FileVersion=6,0,8168,0     
       hook=mfc42installer
    [mfc42.dll]
       FileVersion=6,0,8168,0
       hook=mfc42installer
    [olepro32.dll]
       FileVersion=5,0,4261,0
       hook=mfc42installer
    [mfc42installer]
       file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab
       run= % EXTRACT_DIR % \mfc42.exe[activex.ocx]
    file-win32-x86=thiscab   
    clsid={0BEDCDD4-9798-4E9A-B76E-80580680BDAF}   
    FileVersion=1,0,0,1   
    RegisterServer=yes   
      

  3.   

    system32下的东西一般不太会有人主动删除的,可以参考1楼的做法,或者在加载dll失败的时候给出提示信息,让用户手动下载dll.
      

  4.   

    我的方法是控件在生成的是时候,也就是OnCreat的时候来检查dll是否可用,其实就是1楼的完整性啦。int CATCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
        if ( COleControl::OnCreate( lpCreateStruct ) == -1 ) return -1;    pr = NULL;               //pr是dll中的类
        HRESULT hr = pr.CreateInstance( __uuidof( t2 ) );  //如果dll存在这个类创建对象的时候肯定是成功的,否则就要失败
        if( FAILED( hr ) || pr == NULL)
        {
            FireDllFail( );    //检查如果dll中类的对象创建失败,说明dll有问题,立马向外接口发送一个dll失败事件
            return 0;          //我是通过这个方法来得到dll状态是否良好的。
        }
    }
      

  5.   

    如何发布ActiveX控件