不好意思~打擾大家了!  ^_^因為最近的工作也是被分派到要弄MFC 的 activex,
可是卻遇到一個問題,就是在本機的時候(D:\home\fan.htm),activex都可正常運行,可看到activex所產生的圖,但是若網址是打http://127.0.0.1/...這種的,圖就無法顯現,會出現紅色叉叉。
在網路上找了好久,程式也有加上安全接口(const CATID CLSID_SafeItem =
{0x36299202, 0x9ef, 0x4abf,{ 0xad, 0xb9, 0x47, 0xc5, 0x99, 0xdb, 0xe7, 0x78}};....),但問題卻還是存在,不見有好的解決方法。最後不好意思只能來這請教大家。謝謝! ^^

解决方案 »

  1.   

    把安全级别设置为中,与acticex有关的选项全部启用就可以了
      

  2.   

    很可能是依赖的 MFC库 文件没有打包
      

  3.   

    回yyliuyang~
        恩恩~我有把安全級別設過了,也有把activex有關的選項啟動了,可還是不行耶回wshcdr~
        請問依赖的 MFC库 文件是指什麼呢?
         我用的是同一台機器測,差別只是一個是C:\ 在本機直接讀的(可以執行),而另一種則是http://讀的(不能執行)。如果需要看原始碼,請看http://140.114.71.160/~yitfan/rabbit.rar謝謝大家幫忙! ^_^
      

  4.   

    我也是这个问题啊 ,用IE提示安装后再用greenbrowser打开可以显示,但是用IE就不能显示
      

  5.   

    你添加安全接口的时候是不是继承IObjectSafetyImpl,用下面这种方法实现?
    class   ATL_NO_VTABLE   CYourClass   :   //从IObjectSafetyImpl派生   
      public   IObjectSafetyImpl<CYourClass,INTERFACESAFE_FOR_UNTRUSTED_CALLER   |   INTERFACESAFE_FOR_UNTRUSTED_DATA>   
      {   
      BEGIN_COM_MAP(CChatObj)   
      COM_INTERFACE_ENTRY(IObjectSafety)//添加映射   
      END_COM_MAP()   
      }   
      

  6.   

    回xyz378704~
       恩~路徑確認無誤耶~這就是怪的地方了~一直找不出問題~ 
       謝謝回文喔! ^_^
      

  7.   

    回fjndzwc~
      我的網頁就是簡單的html耶!
      至於安全接口那個我是參考http://www.codeproject.com/KB/COM/CompleteActiveX.aspx,
      這個網頁裡Building a Safe ActiveX Control去設的。
      可是就是http://的時候,activex就不能運行。這是為什麼呢?
      

  8.   

    你的问题是,似乎ACTIVEX没有被安装
      

  9.   

    回fjndzwc~
      恩恩~好好~ㄧ定ㄧ定喔!回xyz378704~
      是沒有安裝到嘛?可是我打完http://127.0.0.1/rabbit.htm後,
      檢查電腦裡,確實是有下載到rabbit control的,這樣不表示有安裝嘛?
      那要怎樣才能讓她真的有安裝呢?  謝謝回復喔! ^_^
      

  10.   

    下载和安装是2会事,确定是否安装,可以查看注册表中是否有对应的classid
      

  11.   

    你可以手动注册一下 regsvr32 xx.ocx再调用
      

  12.   

    回xyz378704~
       所以我的.ocx連手動註冊都失敗嘛?
       所以是我編譯的程式碼有誤嘛?
       謝謝回文喔~ ^_^
      

  13.   

    回xyz378704~ 
      我檢查了所下載的rabbit control所顯示的狀態是已安裝,
      且顯示的classid和我網頁寫的也都一樣。
      
      謝謝回文喔! ^_^
      

  14.   

    如果注册失败,需要检查组件的依赖项,看看是否有依赖的DLL没有正确安装,用Dependency Walker工具来检查
      

  15.   

    回jameshooo~
      不好意思~那你可以下載我的程式碼~在你的電腦跑跑看嗎?
      我想要測試是不是我程式有誤~
      謝謝回文喔! ^_^
      

  16.   

    http://support.microsoft.com/kb/161873/zh-cn
    参考这做安全接口
      

  17.   

    回fjndzwc~
       恩~試了耶~
       還是不行,你可以了嗎?
      

  18.   

    你的在本地运行可以的对把?
    那试了以后编译连接可以通过吗?
    你得把自己机上的注册的那个控件删了才行啊,点工具书-->internet选项->设置->查看对象,把你原来机子上的注册的控件删了默认在这个目录下C:\WINDOWS\Downloaded Program Files
      

  19.   

    实现安全接口可以这样做,
    1. 在工程中找到xxxCtrl类,在DECLARE_DYNCREATE(xxxCtrl)后面添加以下代码
    //定义IObjectSafety
    DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
    STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) ( 
    /* [in] */ REFIID riid,
    /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
    /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions
    ); STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) ( 
    /* [in] */ REFIID riid,
    /* [in] */ DWORD dwOptionSetMask,
    /* [in] */ DWORD dwEnabledOptions
    );
    END_INTERFACE_PART(ObjSafe);
    //完成定义IObjectSafety
    2. 添加头文件 #include <objsafe.h>
    3. 在实现xxxCtrl类代码中添加如下代码
    BEGIN_INTERFACE_MAP( xxxxCtrl, COleControl )
     INTERFACE_PART(xxxxCtrl, IID_IObjectSafety, ObjSafe)
    END_INTERFACE_MAP()//.............................................................................
    // IObjectSafety member functions// Delegate AddRef, Release, QueryInterfaceULONG FAR EXPORT xxxxCtrl::XObjSafe::AddRef()
    {
        METHOD_PROLOGUE(xxxxCtrl, ObjSafe)
        return pThis->ExternalAddRef();
    }ULONG FAR EXPORT xxxxCtrl::XObjSafe::Release()
    {
        METHOD_PROLOGUE(xxxxCtrl, ObjSafe)
        return pThis->ExternalRelease();
    }HRESULT FAR EXPORT xxxxCtrl::XObjSafe::QueryInterface(
        REFIID iid, void FAR* FAR* ppvObj)
    {
        METHOD_PROLOGUE(xxxxCtrl, ObjSafe)
        return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
    }const DWORD dwSupportedBits = 
      INTERFACESAFE_FOR_UNTRUSTED_CALLER |
      INTERFACESAFE_FOR_UNTRUSTED_DATA;
    const DWORD dwNotSupportedBits = ~ dwSupportedBits;//.............................................................................
    // CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions
    // Allows container to query what interfaces are safe for what. We're
    // optimizing significantly by ignoring which interface the caller is
    // asking for.
    HRESULT STDMETHODCALLTYPE 
     xxxxCtrl::XObjSafe::GetInterfaceSafetyOptions( 
      /* [in] */ REFIID riid,
            /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
            /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
    {
     METHOD_PROLOGUE(xxxxCtrl, ObjSafe) HRESULT retval = ResultFromScode(S_OK); // does interface exist?
     IUnknown FAR* punkInterface;
     retval = pThis->ExternalQueryInterface(&riid, 
         (void * *)&punkInterface);
     if (retval != E_NOINTERFACE) { // interface exists
      punkInterface->Release(); // release it--just checking!
     }
     
     // we support both kinds of safety and have always both set,
     // regardless of interface
     *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits; return retval; // E_NOINTERFACE if QI failed
    }/////////////////////////////////////////////////////////////////////////////
    // CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions
    // Since we're always safe, this is a no-brainer--but we do check to make
    // sure the interface requested exists and that the options we're asked to
    // set exist and are set on (we don't support unsafe mode).
    HRESULT STDMETHODCALLTYPE 
     xxxxCtrl::XObjSafe::SetInterfaceSafetyOptions( 
            /* [in] */ REFIID riid,
            /* [in] */ DWORD dwOptionSetMask,
            /* [in] */ DWORD dwEnabledOptions)
    {
        METHOD_PROLOGUE(xxxxCtrl, ObjSafe)
     
     // does interface exist?
     IUnknown FAR* punkInterface;
     pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
     if (punkInterface) { // interface exists
      punkInterface->Release(); // release it--just checking!
     }
     else { // interface doesn't exist
      return ResultFromScode(E_NOINTERFACE);
     } // can't set bits we don't support
     if (dwOptionSetMask & dwNotSupportedBits) { 
      return ResultFromScode(E_FAIL);
     }
     
     // can't set bits we do support to zero
     dwEnabledOptions &= dwSupportedBits;
     // (we already know there are no extra bits in mask )
     if ((dwOptionSetMask & dwEnabledOptions) !=
       dwOptionSetMask) {
      return ResultFromScode(E_FAIL);
     }        
     
     // don't need to change anything since we're always safe
     return ResultFromScode(S_OK);
    }