1. 程式人生 > >ActiveX控制元件在IE中不能顯示的解決方案

ActiveX控制元件在IE中不能顯示的解決方案

Q:

VC6生成MFC ActiveX,使用htm呼叫,

CLASSID="CLSID:12342234-3234-4234-5234-623472348234"

CODEBASE="testocx.cab#version=1,0,0,1"

在WinXPSp1上,http://www.smth.org/,ok

在WinXPSp2/2k3SP1/Vista上,http://www.smth.org/,紅X

在WinXPSp2/2k3SP1/Vista上,file:///C:/ActiveX.htm,ok

A:

ActiveX在遠端IE頁面上執行,需要實現安全介面。

在ATL寫的ActiveX中,用IObjectSafety。

http://support.microsoft.com/kb/168371/en-us

在MFC寫的ActiveX中,直接修改登錄檔。

http://support.microsoft.com/kb/161873/en-us

mfc實現的ocx,要在app實現檔案中包括兩個檔案:

#include <comcat.h> 
#include <objsafe.h> 
// 本控制元件的CLSID,登錄檔用 
const GUID CDECL CLSID_SafeItem ={ 0x12342234, 0x3234, 0x4234, 
                      { 0x52,0x34,0x62,0x34,0x72,0x34,0x82,0x34 } }; 
// 版本控制 
const WORD _wVerMajor = 1; 
// 次版本號 
const WORD _wVerMinor = 0; 
實現 
// CTestApp::InitInstance - DLL initialization 
BOOL CTestApp::InitInstance() { 
    return COleControlModule::InitInstance(); 
} 
// CTestApp::ExitInstance - DLL termination 
int CTestApp::ExitInstance() { 
    return COleControlModule::ExitInstance(); 
} 
// 建立元件種類 
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription) { 
    ICatRegister* pcr = NULL ; 
    HRESULT hr = S_OK ; 
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); 
    if (FAILED(hr)) return hr; 
    // Make sure the HKCR\Component Categories\{..catid...} 
    // key is registered. 
    CATEGORYINFO catinfo; 
    catinfo.catid = catid; 
    catinfo.lcid = 0x0409 ; // english 
    // Make sure the provided description is not too long. 
    // Only copy the first 127 characters if it is. 
    int len = wcslen(catDescription); 
    if (len>127) len = 127; 
    wcsncpy(catinfo.szDescription, catDescription, len); 
    // Make sure the description is null terminated. 
    catinfo.szDescription[len] = ’\0’; 
    hr = pcr->RegisterCategories(1, &catinfo); 
    pcr->Release(); 
    return hr; 
} 
// 註冊元件種類 
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid) { 
    // Register your component categories information. 
    ICatRegister* pcr = NULL ; 
    HRESULT hr = S_OK ; 
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); 
    if (SUCCEEDED(hr)) { 
      // Register this category as being "implemented" by the class. 
      CATID rgcatid[1]; 
      rgcatid[0] = catid; 
      hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid); 
    } 
    if (pcr != NULL) pcr->Release(); 
    return hr; 
} 
// 解除安裝元件種類 
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid) { 
    ICatRegister* pcr = NULL ; 
    HRESULT hr = S_OK ; 
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, 
            NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); 
    if (SUCCEEDED(hr)) { 
      // Unregister this category as being "implemented" by the class. 
      CATID rgcatid[1] ; 
      rgcatid[0] = catid; 
      hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid); 
    } 
    if (pcr != NULL) pcr->Release(); 
    return hr; 
} 
// DllRegisterServer - Adds entries to the system registry 
STDAPI DllRegisterServer(void) { 
    HRESULT hr; 
    AFX_MANAGE_STATE(_afxModuleAddrThis); 
    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid)) 
        return ResultFromScode(SELFREG_E_TYPELIB); 
    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE)) 
        return ResultFromScode(SELFREG_E_CLASS); 
    // 標記控制元件初始化安全. 
    // 建立初始化安全元件種類 
    hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!"); 
    if (FAILED(hr)) return hr; 
    // 註冊初始化安全 
    hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing); 
    if (FAILED(hr)) return hr; 
    // 標記控制元件指令碼安全 
    // 建立指令碼安全元件種類 
    hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!"); 
    if (FAILED(hr)) return hr; 
    // 註冊指令碼安全元件種類 
    hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting); 
    if (FAILED(hr)) return hr; 
    return NOERROR; 
} 
// DllUnregisterServer - Removes entries from the system registry 
STDAPI DllUnregisterServer(void) { 
    HRESULT hr; 
    AFX_MANAGE_STATE(_afxModuleAddrThis); 
    if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor)) 
        return ResultFromScode(SELFREG_E_TYPELIB); 
    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) 
        return ResultFromScode(SELFREG_E_CLASS); 
    // 刪除控制元件初始化安全入口. 
    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing); 
    if (FAILED(hr)) return hr; 
    // 刪除控制元件指令碼安全入口 
    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting); 
    if (FAILED(hr)) return hr; 
    return NOERROR; 
} 

atl實現的ocx,在宣告檔案CTestCtl.h中:

class CTestCtl : 
    .... , 
    public IObjectSafetyImpl<CTestCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA> 
{ 
... 
BEGIN_COM_MAP(CTestCtl) 
COM_INTERFACE_ENTRY(IObjectSafety) 
END_COM_MAP() 
... 
} 

或者:

BEGIN_CATEGORY_MAP(CTestCtl)    
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)    
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)    
END_CATEGORY_MAP()

相關推薦

layer.open使用時間控制元件laydate失敗的解決方案

今天有個需要,使用者進入頁面的時候,彈出一個彈窗,彈窗中選擇一個時間,彈窗大概是這樣的: 我的思路是,先在頁面寫好彈窗內容,然後使用lay.open設定content即可: <div id="layopen"> 時間:<inpu

ActiveX控制元件全屏顯示

(一) 第一種方式,轉載 思路: 雙擊窗體 1。把嵌入在ActiveX裡有窗體“跳”出來 2。隱藏工作列 再次雙擊和上面相反,又回到了這個ActiveX裡去了 bool m_bFullScreen=false; HWND m_hWndParent; void CFfD

手勢與控制元件事件衝突的解決方案

在日常的開發中我們可能會遇到手勢與UI控制元件事件出現衝突造成監聽事件混亂的情況,其實解決方案非常簡單。在這裡我用點選手勢與UICollectionView的item點選事件作為案例對此方法做一下簡單的介紹。比如有如下案例: 圖中下邊綠色的為UIColle

ActiveX控制元件IE不能顯示解決方案

Q: VC6生成MFC ActiveX,使用htm呼叫, CLASSID="CLSID:12342234-3234-4234-5234-623472348234" CODEBASE="testocx.cab#version=1,0,0,1" 在WinXPSp1上,ht

Android+HTML 針對android一個控制元件TextView文字顏色、大小不同的解決方案

tvPrice.setText((Html.fromHtml("<font color= '#FF0000'>"+"¥" + "<big>"+"示例文字"+"</big&

WebView控制元件載入網頁顯示速度慢的究極解決方案

可以看到在載入完最後一個JS指令碼之後,對DOM元素的渲染和處理就花了8秒,然後執行了AJAX方法載入外部頁面又花了2、3秒,最後才會觸發onPageFinished顯示頁面。再往後由於程式中設定了setBlockNetworkImage(false),所以開始載入外部圖片。(如果不控制這個引數,圖片載入會在

Android的WebView控制元件載入網頁顯示速度慢的究極解決方案

       Android客戶端中混搭HTML頁面,會出現雖然HTML內容載入完成,標題也正常顯示,但是整個網頁需要等到近5秒(甚至更多)時間才會顯示出來。研究了很久,搜遍了國外很多網站,也看過PhoneGap的程式碼,一直無解。        一般人堆WebView的加速,都是建議先用webVi

IE的安全設定設成“啟用,執行,下載activeX控制元件”程式控制的實現的原理

(1)IE的安全屬性設定是放置在登錄檔的以下位置的: HKEY_USERS\UserName\Software\Microsoft\Windows\CurrentVersion\Internet Se

單機情況下,IE瀏覽器訪問activeX控制元件出現紅叉問題的解決

本人也是剛接觸activeX控制元件,自己通過vs2010編寫了幾個簡單的例子,經測試工具測試過都可以用,在html檔案新增之後如果雙擊檔案用IE開啟,會有載入控制元件之類的提示,但是在瀏覽器中輸入url地址訪問時,在頁面中會出現一個紅叉,修改IE的設定也沒用。本文要解決的

static控制元件動態透明顯示的完美解決方案

  在有背景圖片的對話方塊中,static控制元件的透明顯示是一個非常普通的問題。   常用的解決辦法可以通過過載OnCtlColor函式設定背景透明,再返回一個空畫刷來解決。   [cpp] view plaincopy   01.if(nCtlColor == CTLC

為什麼修改了ie級別裡的activex控制元件為啟用後,還是無法下載,顯示還是ie級別設定太高?

如果下載外掛時下載不了,這樣設定,開啟IE選工具/Internet 選項/安全/自定義級別/設定中的ActiveX控制元件自動提示“禁用”。 對標記為可安全執行指令碼ActiveX控制元件執行指令碼“啟用” 對沒有標記為安全的ActiveX初始化和指令碼執行“啟用”(下載外掛

java設定JFrame或者JPanel的佈局為空的時候,出現控制元件不能顯示問題的解決

最近在寫一個壓縮演算法,用到了java.swing。也遇到了控制元件不能顯示的問題,現總結如下:1. JFrame和JPanel都是容器,必須在在裡面新增子容器和控制元件之前設定佈局為null,不然控制元件是新增不進去的。2.如果是很小的矩形框,可能是JFrame未指定大小。

[轉]寫的activex控制元件IE中彈出安全警告的解決辦法~ (可用,強,致敬)

//在控制元件標頭檔案中加入:  DECLARE_INTERFACE_MAP()  BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety)  STDMETHOD(GetInterfaceSafetyOptions)(REFII

QTP錄製後彈出框一個或多個ActiveX控制元件無法顯示解決方法

  錄製一段指令碼程式碼,在專家檢視視窗中編輯錄制的指令碼程式碼時,會碰到彈出一個對話視窗,提示為“當前安全設定禁止執行該頁中的ActiveX 控制元件,因此,該頁可能無法正常顯示”類似的東西,而在人工操作時卻沒有這樣的現象。(如圖)        問題主要出在於QTP設定本身,之所以在編輯錄制好的指

VS2008 在IE 除錯 ActiveX控制元件

不知道是不是微軟的粗心大意,VS2008中竟然沒有ActiveX控制元件測試容器。 幸好需要在IE中測試控制元件,就不需要那個測試容器啦。 1. 生產測試控制元件的HTML: <HTML><HEAD><TITLE>Test</TIT

vc2010mfc/com選單、控制元件等漢字顯示為問號或亂碼的解決方法

在vc2008中建立基於mfc的project。在嚮導的Application type頁面中如果在resource language選項中選擇“英語(美國)”(圖一),那麼在project中的設定選單或者控制元件(如button)上的漢字會最終顯示為“?”。有幾個漢字就

IE除錯ActiveX控制元件的相關設定(無法啟動除錯資訊,找不到Microsoft Internet Explorer的解決方法)

    設定VS2010 通過IE8 除錯ATL的ActiveX控制元件的步驟如下: (1)      設定專案屬性 通過選單項 “專案—》你的專案屬性”如下圖: (2)      在彈出的屬性頁對話方塊中選中“配置屬性—》除錯”,在右邊填入下列引數: 命令     :C:/ProgramFil

VS2008 新增ActiveX控制元件除錯工具

       編寫ActiveX控制元件時,可以用自帶的Active X control test container來測試activex控制元件,這在VisualStudio 6及vs2005裡面是可以方便查

VB6.0如何設定COM元件ActiveX控制元件的CLSID值

http://ajxfxb.blog.163.com/blog/static/56675086200911181118562/ VB中如何設定COM元件和ActiveX控制元件的CLSID值   2009-12-18 11:01:08| &nbs

使用ActiveX控制元件開啟IE瀏覽器

        事情是這樣的,客戶讓做一個單點登入的功能,但是另一個系統和我們公司的系統部署在同一個伺服器上,導致在同一個瀏覽器使用JS原生程式碼window.open(url);開啟該瀏覽器的新標籤頁,會導致我們的系統登陸ses