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
vc2010中mfc/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