轉自“http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html”。
寫得太詳細、太牛了……
VC2005從開發MFC ActiveX ocx控件到釋出到.net網站的全部過程
開篇語:最近在弄ocx控件釋出到asp.net網站上使用,就是使用者在使用過程中,自動下載下傳安裝ocx控件。(此文章也是總結了網上好多人寫的文章,我隻是彙總一下,加上部分自己的東西,在這裡感謝所有在網上發表相關内容的朋友們。)
ActiveX 控 件用于Web的過程是将控件嵌入首頁中,使用者通過浏覽器通路該首頁時,将首頁中的控件下載下傳,并在使用者機器上注冊,以後就可在使用者的浏覽器上運作。控件下載下傳 一次後就駐留在使用者本地機器上,下次再通路相同的首頁時,可不再下載下傳該控件,而是直接運作使用者本地的控件。這裡控件容器就是浏覽器,使用者不需要通過浏覽器 調用控件的屬性或方法。是以,開發面向Web的ActiveX控件比開發桌面的控件還要簡單些,所複雜的是如何将該控件很好地嵌入首頁,使使用者能正常浏 覽。下面介紹這個問題。
一. 建立 MFC ActiveX 項目
1. 打開 VS2005建立 MFC項目。這裡我們取名為“ ActiveXDemo”。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SMwATZnFWbp9CXlVHepF2ZuV2ZvwVbvN2Xzd2bsJmbj9CXt92YuM3ZvxmYuNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.jpg)
2. 輸入項目名稱為“ ActiveXDemo”和項目位置。點選“确定”按鈕,打開向導對話框。
WoSign 免費提供的時間戳服務URL: http://timestamp.wosign.com/timestamp
時間戳服務非常重要,添加時間戳後,即使您的代碼簽名證書已經過期,但由于您的代碼是在證書有效期内簽名的,則時間戳服務保證了此代碼仍然可信,最終使用者仍然可以放心下載下傳,使得即使代碼簽名證書已經過期,您也無需重簽和重新釋出已經簽名的代碼。
3. 選擇“控件設定”頁籤,具體設定可參考上圖。其它頁籤為預設設定。最後點選“完成”按鈕儲存設定。
二. 添加控件方法
VC2005會為我們自動建立好 MFC ActiveX 程式架構,我們隻要給該 ActiveX控件添加方法即可。現在我們給控件添加一個“ AddFun”方法,這個方法是将兩個數相加并傳回結果。
1. 點選“視圖”,打開“類視圖”視窗。
2. 展開“ ActiveXDemoLib”項,選中“ _DActiveXDemo”項。點選滑鼠右鍵,選擇“添加”下的“添加方法”。
3. 打開添加方法向導視窗。因為我們是添加一個加法方法,是以我們設定的傳回類型為 LONG型,方法名設為 AddFun,添加兩個 LONG類型參數 Add1, Add2。
4. 其它為預設設定,點選“完成”按鈕完成添加方法。接下來我們打開“解決方案資料總管”打開“ ActiveXDemoCtrl.cpp”檔案。
5. 打開代碼視圖,我們會發現 VC2005已經為我們添加了一個“ AddFun”方法,我們在方法内添加“ return Add1 + Add2;”語句。
三、MFC Activex 安全問題:
1、在預設環境下,編譯的MFC Activex控件,隻能在本地代碼中運作,即在http://localhost/xxx/xxx.htm中執行,而在http://127.0.0.1/xxx/xxx.htm中提示無相關屬性,需要設定其初始化和腳本運作的安全性
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實作檔案中包括兩個檔案:
在ActivexDemo.cpp 檔案中實作以下方法
代碼 #include " stdafx.h "
#include " ActivexDemo.h "
#include < comcat.h >
#include < objsafe.h >
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CActivexDemoApp theApp;
const GUID CDECL BASED_CODE _tlid =
{ 0x344B8576 , 0xAB2C , 0x4D38 , { 0xAE , 0x7 , 0x73 , 0x74 , 0x22 , 0x89 , 0x72 , 0xEA } };
const WORD _wVerMajor = 1 ;
const WORD _wVerMinor = 0 ;
// CActivexDemoApp::InitInstance - DLL 初始化
BOOL CActivexDemoApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
// TODO: 在此添加您自己的子產品初始化代碼。
}
return bInit;
}
// CActivexDemoApp::ExitInstance - DLL 終止
int CActivexDemoApp::ExitInstance()
{
// TODO: 在此添加您自己的子產品終止代碼。
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;
}
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(BASED_CODE _tlid , CATID_SafeForInitializing);
if (FAILED(hr)) return hr;
// 标記控件腳本安全
// 建立腳本安全元件種類
hr = CreateComponentCategory(CATID_SafeForScripting, L " Controls safely scriptable! " );
if (FAILED(hr)) return hr;
// 注冊腳本安全元件種類
hr = RegisterCLSIDInCategory(BASED_CODE _tlid , 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(BASED_CODE _tlid , CATID_SafeForInitializing);
if (FAILED(hr)) return hr;
// 删除控件腳本安全入口
hr = UnRegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);
if (FAILED(hr)) return hr;
return NOERROR;
}
現在控件就可以在自注冊時就注冊為安全控件了。
2、設定項目屬性 将配置類型設定成靜态庫(.lib)
3、 最後生成項目,ocx控件就産生了。
ActiveX打包與釋出
在VS2005或VS2008安裝後發現路徑**VC7\Common7\Tools\Bin\下有許多小工具,我對帶有Cert的檔案比較感興趣。經過研究,發現是有關證書和簽名的,當然,該證書未被證書認證機構認可。下面列出這些工具和我的使用心得。
1。Makecert.exe ---證書建立工具
2。Cert2Spc.exe ---發行者證書測試工具
3。Signcode.exe ---檔案簽名工具(VS2008帶的是signtool)
一、ActiveX釋出步驟
在這裡簡單說明下,打包activeX需要制作證書,具體用到makecert 、cert2spc 、signtool 這三個VS提供的工具,工具在VS檔案夾裡面,以下制作過程需要在工具所在的檔案夾下完成!
1、單擊"開始"-->"運作(R)"-->輸入"cmd"-->回車-->進入到操作的控件所在的目錄(需要将上面所說的工具,和ocx控件放到一個檔案夾下);
2、建立PVK檔案(私人密匙檔案),在指令行中輸入"makecert -sk demo demo.pvk -n CN=XXXXXXX公司",然後回車;
sk-表示主題的密鑰容器位置,ss-主題的證書存儲名稱, n-證書頒發對象,r-證書存儲位置;
3、建立CER檔案(公司證書),在指令行中輸入"makecert -sk demo.pvk demo.cer",然後回車,如圖8所示,若出現"Successed"提示,則會在E:\ demo目錄下生成demo.cer檔案;
sk-表示主題的密鑰容器位置,is-頒發者的證書存儲名稱, n-證書頒發對象,ic-頒發者的證書存儲位置,-$-授權範圍(用于代碼簽名);
4、建立SPC測試軟體出版商證明書,在指令行中輸入"cert2spc demo.cer demo.spc",然後回車;
5、建立INF檔案,用記錄本編輯以下資訊:
代碼 [ version ]
signature = " $CHICAGO$ "
AdvancedINF = 2.0
[ Add.Code ]
ActivexDemo.ocx = ActivexDemo.ocx
[ ActivexDemo.ocx ]
file-win32-x86 = thiscab
// 告訴ie到哪裡去得到這個dll,file一共包括三個部分,第一部分是file,這個永遠都是這樣的(至少目前來說);第二部分告訴聲明支援的 OS,win32表示windows,mac就是蘋果MAC OX了;第三部分是CPU類型,比如說 x86、 ppc (Power PC)、 mips或者alpha了
//其中“thiscab”是一個關鍵字,表示 CAB 包含此 DLL,也可通過指定一條絕對或相對路徑,從一個 HTTP 位置下載下傳所需的 DLL,
例如: file-win32-x86 = http://www.mysite.com/mydir/NEEDED.DLL
RegisterServer = yes
clsid = { 468E4531 -F890-47EC- 8368 -3BDA4448FF08}
//“clsid”是将要安裝的控件的 CLSID
DestDir = 11
// 它的值是dll将要存到本地硬碟的位置,如果它的值是10,則将dll放到\Windows或者\WinNT下;如果是11,則放到\Windows \System或者\WinNT\System32下;如果未指定任何 DestDir(典型情況),則代碼安裝在固定的 OCCACHE 目錄中。
FileVersion = 1 , 0 , 0 , 1
//說明了atl90.dll的版本号
6、建立CAB檔案,在指令行中輸入"cabarc -s 6144 n demo.cab atl90.dll Polygon.dll demo.inf",-s 選項表示在壓縮檔案中保留用于代碼簽名的空間,n指令指定希望建立 CAB 檔案,然後回車;
7、使用Code Signing Wizard簽署一個CAB檔案,在控制台輸入signtool signwizard 進入到signtool窗體中;
8、單擊"下一步(N)"按鈕,選擇要進行數字簽名的且已做成CAB包的檔案demo.cab檔案;
9、選擇好CAB包後單擊"下一步(N)"按鈕,在選擇想要的簽名類型裡選擇"自定議(C)"并單擊"下一步(N)"按鈕;
10、接下來單擊"從檔案選擇(F)"按鈕,選擇剛剛制作的demo.cer;
11、在單擊"下一步(N)",然後選擇"CSP中的私鑰(K)";
13、在"證書路徑中的證書"中選擇"證書路徑中的所有證書,包括根證書(C)",在"其它證書(可選)"中選擇"包括在以下PKCS #7 證書(.p7b)檔案中的證書(P):",并單擊"浏覽(R)..."按鈕選擇demo.spc檔案,選擇完後單擊"下一步(N)"按鈕;
14、接下來在彈出的"資料描述"視窗中輸入公司的名稱和網址并單擊"下一步(N)"按鈕;
15、現大部份工作都已完成,在接下來的一步當中是可選的操作,其作用隻是為CAB加入時間戳,此步驟完全可以不做,VeriSign: http://timestamp.verisign.com/scripts/timstamp.dll ;
16、完成,單擊"下一步(N)"按鈕便可來到數字簽名向導的最後一步,即操作總覽,如圖26所示,單擊"完成"按鈕便可大功告成;
下面是微軟代碼簽名證書(.pvk/.spc)簽名指南的示範
本使用指南示範如何使用WoSign代碼簽名證書來給微軟代碼簽名,Thawte和VeriSign代碼簽名證書也是使用同樣方法,隻是使用不同的時間戳URL。
使用者在線上申請代碼簽名證書時會生成證書私鑰檔案,如:myCert.pvk,而代碼簽名證書成功頒發後的證書檔案為公鑰檔案, 如:myCert.spc,又稱:軟體發行證書(Software Publishing Certificate) 。 代碼簽名證書一般都是采用公鑰和私鑰分離的兩個檔案方式,适合于 DOS 指令行方式的代碼簽名。如果您您希望把代碼簽名證書導入到Windows證書存儲區中,進而簡化簽名操作,請參考:不同證書格式轉換指南 。
WoSign代碼簽名證書的根證書鍊為: UTN-USERFirst-Object - WoSign Code Signing Authority
使用微軟的 SignCode.exe 就可以對微軟的代碼進行簽名,如果您沒有此檔案,點選 這裡 下 載。 Signcode.exe 可以使用 DOS 指令行方式實作簽名,我們推薦使用者使用數字簽名向導方式,簡單友善。請注意:如果您開發的ActiveX為IE附加元件,請先數字簽名每個CAB檔案中 的.dll和.ocx等檔案,再把這些檔案打包成.cab檔案後再數字簽名.cab檔案,以確定所有IE附加元件都被IE驗證和信任,否則會顯示“未驗證” 而可能影響正常運作。
具體簽名向導過程如下:
(1) 運作 Signcode.exe , 要求您選擇需要簽名的檔案,支援:可執行檔案 (*.exe; *.dll; *.ocx) ; Cabinet 打封包件 (*.cab) 和目錄檔案 (*.cat) ,如下圖 1 所示 ( 如: TestSign.cab) ,請注意:如果簽名的檔案已經有數字簽名,則會被新的簽名覆寫:
(2) 點選“下一步”後,如下圖 2 所示,會要求您選擇“簽名類型”,預設的“典型”簽名類型;請選擇“自定義” 簽名類型:
(3) 如下圖 3 所示,點選“從檔案選擇”簽名證書 ( 公鑰檔案 ),如: WotoneCS.spc :
(4) 點選“下一步”後,如下圖 4 所示,會要求您選擇私鑰檔案,如: WotoneCS.pvk ,其他參數不用動:
(5) 點選“下一步”後,如下圖 5 所示,會提示要求輸入私鑰密碼:
(6) 點選“下一步”後,如下圖 6 所示,會提示要求選擇雜湊演算法 ( 摘要算法、縮微圖算法 ) ,預設為 sha1 ,也可以選 md5 :
(7) 點選“下一步”後,如下圖 7 所示,選擇哪些證書包括到數字簽名中,直接點選“下一步”即可,即選擇預設的包括根證書:
(8) 如下圖 8 所示,要求填寫該簽名代碼的功能描述,推薦一定要認真填寫,因為此資訊将會在最終使用者下載下傳此代碼時顯示,有助于最終使用者了解此代碼的功能以确定是否下載下傳安 裝。第一行“描述”是指此代碼的功能文字描述,第二行“ Web 位置”則讓最終使用者點選文字描述來詳細了解此代碼的功能和使用方法等,本示範中的“ Web 位置”為WoTrust代碼簽名證書簡介頁面:
(9) 點選“下一步”後,如下圖 9 所示,選中“将時間戳添加到資料中”,請使用:
WoSign 免費提供的時間戳服務URL: http://timestamp.wosign.com/timestamp
時間戳服務非常重要,添加時間戳後,即使您的代碼簽名證書已經過期,但由于您的代碼是在證書有效期内簽名的,則時間戳服務保證了此代碼仍然可信,最終使用者仍然可以放心下載下傳,使得即使代碼簽名證書已經過期,您也無需重簽和重新釋出已經簽名的代碼。
(10) 點選“下一步”後,如下圖 10 所示,會提示已經完成數字簽名向導,點選“完成”後還會提示您輸入私鑰密碼,就完成代碼簽名證書的代碼簽名。
(11) 現在,需要使用 chktrust.exe 來查驗已經簽名的代碼, chktrust.exe 檔案已經打包在 signtool.rar 中。 進入 DOS 指令提示符,并進入已經簽名的檔案所在目錄 ( 如: d:\sign\TestCA.cab) ,鍵入指令: chktrust testcs.cab ,則會顯示實際應用時在 IE 浏覽器下載下傳頁面的情況,如下圖 11 所示,對于Win XP作業系統,會顯示軟體名稱和發行者名稱,其中軟體名稱就是您在第(8)步輸入的描述,點選此名稱就連結到您在第(8)步填寫的網址,而點選發行者名 稱,則會顯示您的簽名資訊和時間戳資訊。對于Win2000作業系統,則稍有不同,第 1 行的紅線部分就是時間戳記錄的簽名時的本地時間,請注意:此時間不是取簽名電腦的時間,而是提供時間戳服務的伺服器計算出來的簽名電腦設定的所在時區的本 地時間。第 1 行藍色文字就是在第 8 步中輸入的描述文字,點選此藍色文字就可以通路在第 8 步中輸入的 Web 描述頁面。第 2 行藍色文字則為該代碼的發行者,也就是代碼簽名證書的申請者(擁有者)( 如:深圳市沃通電子商務服務有限公司) ,點選可以檢視證書的詳細資訊;第 2 行有紅色下劃線部分顯示“發行商可靠性由 WoSign Code Signing Authority 驗證 ”就是此代碼簽名證書的證書頒發者。
12) 點選“是”或“運作”,則會提示“ TestSign.cab: Succeeded ”表示代碼 TestSign.cab 簽名驗證有效,可以放到網站上了。請注意:簽名後的CAB檔案放到網站上需要使用 object 方式。
請注意 :不能僅簽名CAB檔案,CAB包中所有DLL檔案都要先簽名後再打包,再簽名CAB檔案,否則IE浏覽器會顯示為“未驗證的發行者”而影響正常使用,甚至防毒軟體會認為是毒而被删除!如下圖所示的實際案例:
在Web頁中加入ActiveX 控件
在修改了IE的安全設定後,依然不能調用控件的方法,需要将通路的站點設定為“受信站點”,則方能正常使用控件
在<html> 和<head>之間插入
<!-- saved from url=(0017)http://localhost/ -->
則在IE視窗上方不會彈出黃色提示條 。
在 HTML頁面中使用ActiveX控件包含三個基本操作:将控件放入HTML中;将該控件下載下傳給使用者;在使用者機器上安裝該控件。如果隻是針對IE使用者,在 HTML中插入ActiveX控件就比較簡單;如果同時兼顧IE和Netscape使用者,則要做更多工作。大家知道,HTML檔案由文本和各種标志 (tags)組成,ActiveX 控件對于IE在HTML中的标志是<OBJECT>,該标記有幾個重要的參數特性,它們是:
1.ID:為控件提供一個辨別名稱,為HTML代碼提供一種通路該控件的方式。
2.CLASSID:是該控件唯一的UUID,告訴IE裝入哪個對象。如果使用已經開發好的控件,它的CLASSID可以通過調用Win95或NT下的應 用Regedit來查找。從開始菜單中運作該程式,展開HKEY_CLASSES_ROOT項,可以看到按字母順序排列的系統資料庫,找到需要使用的控件名, 例如WClnt,展開時可看到一個CLSID 檔案夾,裡面就是該控件的CLASSID。
如果是自己用VC開發控件,該UUID可以在ActiveX控件項目中的ODL(對象描述庫)檔案中找到;通過檢視控件的類資訊注釋來定位特定控件的UUID,例如,要找到CMyControl控件的UUID,則需要找到以下代碼:
// Class information for CMyControl
[uuid (051C4748-1262-11D2-87C1-00A024D948FB),
licensed,
helpstring(“CmyControl Control”), control ]
uuid後面括号中的内容就是該控件的UUID。
3.CODEBASE:如果在使用者機器上沒有控件的目前版本,該參數告訴使用者浏覽器在哪裡可找到要下載下傳的控件和最新版本号.當控件作了修改後,可以更改版本号強制使用者重新下載下傳。
4.PARAM:該标記用于設定控件的初始屬性值,它有兩個特性:Name和Value,即屬性名稱和屬性值。
此外還有一些标記,如:Width表示該控件所占的寬度,Height表示高度等,總體來說,這樣一個插入控件的HTML代碼和插入Java Applet的HTML代碼非常相似。
下面是一個嵌有ActiveX控件的HTML代碼示例:
ID=“CMyControl”
CLASSID=“clsid :051C4748-1262-11D2-87C1-00A024D948FB ”
CODEBASE=“http://www.mysite.com.cn/ocxdir/mycontrol.ocx#version=1,0,0,1”
WIDTH=400
HEIGHT=200
ALIGN=center
HSPACE=0
VSPACE=0
>
如果希望控件還 能在Netscape中運作,除了Netscape需加裝插件外,HTML也要加一些附加标記,下面的例子中EMBED段就是為Netscape加上的。 如果使用MFC開發OCX控件,則少數使用者第一次通路時除了下載下傳OCX檔案外,還要下載下傳相應的MFC DLL,下載下傳量變大,這時可将相關檔案在伺服器端打包成可以在用戶端自解壓安裝的CAB檔案。經過修改後的HTML代碼段如下:
<ALIGN=“CENTER” CLASSID=“clsid:
7BCA18C6-2178-11D2-87C1-00A024D948FB”
WIDTH=“1200” HEIGHT=“900” ID=“marquee”
CODEBASE=“http://218.168.188.188/scadaweb/
WClnt.cab#version=1,0,0,1”>
<EMBED ALIGN=“CENTER”CLASSID=“clsid:7BCA18C6- 2178-11D2-87C1-00A024D948FB”
WIDTH=“1200” HEIGHT=“900” ID=“marqueequot;”
CODEBASE=“http://218.168.188.188/scadaweb/
WClnt.OCX#version=1,0,0,1”
TYPE=“application/oleobject” >
實時動态頁面的實作方案
對實時動态頁面的要求多産生于一些要求自動更新實時資料的應用中,如電網監控、股市監測等。具體要求是:使用者隻需選取希望浏覽的圖表,但無需介入操作,該圖表就能根據實時資料不斷更新,使用者總能觀察到最新情況。
要實作上述功 能,結構上有兩種方案:一種是設定一個中介伺服器,該伺服器作為控件和背景系統資訊交流的中介;另一種是不設中介伺服器,但在提供實時資料的背景伺服器上 留出供控件通信用的資料接口,控件可以直接從背景伺服器上定時獲得目前實時資料。按資料提供方式分也有兩種:一種是由用戶端定時向伺服器送出請求,指明需 要的實時資料,伺服器收到請求後将滿足請求的動态資料發送至相應客戶;另一種是用戶端隻請求一次,伺服器端便定時将滿足請求的實時資料傳到用戶端,直到客 戶更換要顯示的圖表或停止重新整理。上述各方案都有其優點和局限,在應用中可考慮實際情況采用相應方案。
工作流程為:使用者先從Web伺服器上下載下傳包含ActiveX 控件的網頁,控件随即在客戶機上注冊運作,并通過Winsock同中介伺服器或直接同提供實時資訊的網,如股票資訊網相連接配接,定時取得動态實時資料,并刷 新顯示。在這個體系中,客戶有兩條線路獲得資訊,一條是和Web Server的連接配接,從這條線上使用者通路首頁;另一條就是控件和背景資訊網的連接配接,從這條線路上使用者可以通路實時資料。後一條線路用Winsock建立, 傳輸速度遠大于前一條線路,且控制靈活、效率高,不和首頁下載下傳争資源。通過這條線路,使用者甚至可以傳送遠端控制資訊實作遙控操作。
利用MFC開發ActiveX控件
利用VC5.0 開發的這種控件,功能可擴充性強,理論上獨立的VC5.0程式具有的功能,該控件都能實作,例如控件直接繪制浏覽器,可以使用OpenGL等圖庫,圖形圖 像功能強大。實時資料重新整理頻率理論上可達毫秒級,使用者通過滑鼠可以實作各類互動操作,如旋轉、縮放,圖2就是一幅GL圖形,并有一個縮放工具條進行縮放操 作。如果是在計算機上觀看,可以看到這幾個三維圖在不斷旋轉。
應該說,較好的開發工具可直接用API程式設計或使用ATL模闆庫,利用MFC開發ActiveX控件不是一個好的選擇,因為控件運作需要MFC DLL的支援。假如客戶機器上沒有這些類庫(這種情況很少,但确實存在),第一次下載下傳就要花費些工夫。不過對于熟悉MFC的開發員來說,這些問題相對 MFC提供的便利來說都是可以忽略的。
由于VC5.0對ActiveX控件的開發提供了許多便利,是以開發一個ActiveX控 件并不像許多人想象中的那麼困難複雜,通過VC 5.0的AppWizard,實作控件的主類從ColeControl類派生出來,該類則是CWnd的一個子類,是以你可以像對視窗類程式設計一樣對這個主類 程式設計。為了實作上面提及的功能,首先必要重載它的OnDraw函數加入需要繪制的對象,加入Winsock類(CSocket或 CAsyncSocket),以實作與後端資料伺服器的通信。如果需要用OpenGL繪制豐富多彩的立體圖,則要初始化GL環境。其他的工作就在于使用者如 何控制程式的排程,使得各功能都能正常工作且與其他部分正常通信。此外,後端伺服器程式也要增加對應于該控件的接口。
這樣的一個程式編譯通過後,就成為一個可用于Web的控件,字尾名是OCX。按照前面叙述的方法将該OCX置入首頁,基本的工作就算完成。
綜上所述,利用VC5.0開發ActiveX控件用于Web浏覽,主要有以下幾個特點:
1.采用Winsock的通信機制,速度快、控制靈活、效率高;
2.控件采用VC5.0編制,功能可擴充性很強;
4.控件第一次下載下傳雖然稍費時間,但下載下傳後即在使用者機上注冊,以後可直接調用,速度效率均好;
5.ActiveX技術是微軟發展的重中之重,且已成為目前軟體發展的潮流所向,發展空間廣闊;
6.系統采用VC開發,可以利用已有的采用C語言編制的系統,開發工作量大大減少。
Web頁面的開發主要分為三類:靜态Web頁面、半動态Web頁面以及Client端動态頁面。本文重點論述基于ActiveX Control(控件)動态實時頁面的開發。
regsvr32 netshare.ocx 注冊netshare.ocx控件
regsvr32 /u netshare.ocx 解除netshare.ocx控件的注冊