ocx源碼
『壹』 VC++編寫ActiveX控制項
ActiveX這門技術棚正是通過生成「*.ocx」文件來實現的。先來了解下OCX文件,在網路上面對OCX是這樣解釋的:「.ocx是ocx控制項的擴展名,OCX 是對象類別擴充組件。如果你用過Visual Basic或者Delphi一類的可視化編程工具,那麼對控制項這個概念一定不會陌生,就是那些工具條上的小按鈕,如 EditBox,Grid,ImageBox,明帆Timer等等。每個控制項都有自己的事件、方法和屬性。使用了控制項的編程非常容易。首先,在程序的設計階段可以設置一些屬性,如大小,位置,標題(caption)等等;在程序運行階段,可以更改這些屬性,還可以針對不同的事激和雹件,調用不同的方法來實現對該控制項的控制。控制項就好像一塊塊的積木,程序要做的事只是將這些積木搭起來。控制項的最大好處是可以重復使用,甚至可以在不同的編程語言之間使用,例如你可以在 VB中嵌入用VC開發的控制項。」
裡面最後一句話比較重要,就是用VC開發的OCX控制項,你可以在其它語言裡面都能調用,這樣很好的實現了功能化組件的良好循環使用,而且還可以實現跨語言地調用(例如,你完全可以用C#調用C++開發的OCX控制項)。
下面開始介紹,如何用VC++一步步生成你想要的「*.ocx」文件。
1. 建立最簡單的ocx文件並進行調試
1.1 建立最簡單的ocx文件
VC-新建項目-MFC ActiveX WinZard
一路點擊「確定」,直到點擊「完成」。最後VC++會自動生成一些文件,這些文件就構成了ActiveX的基本模板,文件的主要結構如下:
直接編譯一下,然後在Debug目錄下面就會生成一個名為「ocxDemo.ocx」的控制項注冊文件,然後利用「regsvr32」命令就可以實現本機對此控制項的注冊,然後就可以使用本語言或者跨語言編寫程序時引用此控制項來實現相應的功能(後面將會講到)。
1.2 ocx調試方法:
VC++自帶有一個調試控制項的工具「ActiveX控制項測試容器」,通過三種方式可以打開:
1.點擊「調試」按鈕,會出現如下對話框:
然後瀏覽"C:Program FilesMicrosoft Visual StudioCommonToolsTSTCON32.EXE「
2. 系統的「開始「-》「程序」-》「Microsoft Visual C++ 6.0」-》「Microsoft Visual C++ 6.0 Tools」-》「Active Control Test Container」
3. VC++開發環境中的「工具」-》「ActiveX Control Test Container」
通過上面的任意一種方法,都可以調出下面的程序:
右擊空白區域,插入控制項,然後會彈出下面的對話框:
選中指定控制項,然後點擊確定,控制項就被載入到此工具中了,然後可以通過這個工具來看此控制項的相關事件響應等等。
2.自VC++生成的模板基礎上自定義功能
所有的自定義功能基本上都來自於「MFC ClassWizard」類向導對話框。
(「快捷鍵Ctrl+W」或者「查看」-「建立類向導」)
在「Automation」選項卡中為控制項添加方法和屬性。
在「ActiveX Events」選項卡中為控制項添加事件。
2.1 添加控制項屬性
切換到「Automation」選項卡中,點擊右邊的「Add Property」會彈出對話框:
External name:外部名稱。指此控制項被使用時,外部程序看到的屬性名稱,僅在外部引用時被使用。
Type:屬性類型。除了基本的整形等數據類型外,還有很多復雜的高級數據類型。
Variable name:變數名稱。此屬性在控制項源文件中的變數名稱,在編寫控制項源碼時使用。
Notification function:提醒函數。當此屬性被改變時,會觸發此提醒函數。
Implementation:實現方式。指屬性的三種類型:固有型,成員變數型,Get/Set方法型。固有型是指系統賦予的固有屬性,如背景色,標題;成員變數型是用戶自定義的屬性;Get/Set方法型,可能是指只能通過Get/Set方法才能獲取和改變的變數吧(這個沒研究)。
2.2 添加控制項方法
在「Automation」選項卡中,點擊右邊的「Add Method」會彈出對話框:
External name:方法外部名稱。
Internal name:方法內部名稱。
Return type:返回值類型。除了基本的整形等數據類型外,還有很多復雜的高級數據類型。
Implementation:實現方式。兩種:固有方法,自定義方法。
Parameter list:參數列表。參數名稱和參數類型:參數類型包含很多高級數據類型。
2.3 添加控制項事件
切換到「ActiveX Events」選項卡中,點擊右邊的「Add Event」會彈出對話框:
External name:事件外部名稱。
Internal name:事件內部名稱。比外部名稱多了個前綴「Fire」。
Implementation:實現方式。兩種:固有事件,自定義事件。固有事件一般是滑鼠移動,雙擊等等事件,這些事件都由系統消息觸發;自定義事件則是完全由用戶定義的一個函數,但這個函數需要用戶在源文件中調用(在內部調用,對於控制項的使用方來說,就相當於在調用的地方此事件被觸發,而內部傳入的參數,則是此事件產生的消息附帶信息)。
Parameter list:參數列表。參數名稱和參數類型:參數類型包含很多高級數據類型。
總述:通過「類向導」工具,為控制項添加屬性、方法和事件後,VC++會自動在相應的文件裡面生成代碼,比如內部方法屬性和外部方法屬性之間的映射,消息的建立,消息的聲明,等等。如果用戶要對引進行深入研究,還需要對程序的結構比較熟悉,知道各部分代碼的作用,知道哪些地方的代碼是系統自動生成的,哪些代碼需要用戶手動加入的。Visual C++開發環境雖然有很多優點,但有個缺點也很明顯,就是代碼結構比較亂,感覺沒有VS2005和後面的Visual Studio系列要好。但是由於VC6.0作為一個比較經典的開發環境,而且網上的有關C++的程序設計基本上都是基於VC6.0的,所以,有必要對其進行學習,便於自己讀懂網上的代碼並進行消化吸收。
2.4 生成ocx文件並調試
直接編譯用戶加入了自定義代碼的項目,然後在項目的Debug目錄下面會生成一個ocx文件,這個就是此控制項的注冊文件了。
控制項的調試工具仍然是「ActiveX Control Test Container」。
假設我們在控制項中加入了一個事件:固有事件——「MouseMove」滑鼠移動事件;用戶自定義事件——ocxClick事件(此事件是通過「WM_MOUSEMOVE」消息來觸發的,返回的是滑鼠當前位置的x坐標)。
運行「ActiveX Control Test Container」並插入當前控制項,當滑鼠在上面移動的時候,可以看到MouseMove產生了事件了。
同時可以通過「Control」-》「Invoke Method」來對控制項的方法進行測試,測試的方法就是你輸入參數,它返回計算結果(下面以自定義的方法funHello為例)。
3.控制項的使用方法
3.1 注冊控制項
ocx控制項的安裝方式有很多種,這里介紹最簡單的一種。
步驟:
1.將需要安裝的OCX控制項文件復制到某個目錄,例如C盤根目錄下。
2.進入開始,點擊運行。
3.在出現的框中鍵入regsvr32 C:/xxxx.ocx 。(XXXX為控制項名, C:/為目錄)
4.點擊確認後等待出現提醒注冊成功即可。
3.2 ActiveX控制項的調用
ActiveX作為一種通用的COM組件,可以被不同語言調用的。
3.2.1 通過VC++調用
利用VC6.0建立一個MFC的基本對話框應用程序
在完成程序向導後。執行下面的步驟:
1. 執行「工程」-》「添加到工程」--》「Components and Controls」。
2. 在彈出的文件瀏覽對話框中,找到Registered ActiveX Controls文件目錄下的你剛才注冊的控制項,比如「OcxDemo Control」,然後點擊「Insert」按鈕即可將此控制項添加到控制項工具條集合中。
3. 將控制項工具條上新增加的OCX控制項拖入到應用程序主窗口中。
完成上面的步驟後,就可以像使用普通控制項一樣在VC中使用此控制項了(右擊此控制項,可以查看此控制項的「事件」和「屬性」,就是你在編寫控制項源碼時的那些「外部名稱External name」)。
3.2.2 通過C#調用
其實這個才是重點,因為跨語言調用ActiveX技術最被筆者看好的地方。
用Visual Studio 2005新建一個C#.NET的Windows窗口程序,然後在工具箱面板上,右擊「選擇項」,選擇COM組件,找到你注冊的ActiveX控制項:
確定後,那個OcxDemo Control控制項就載入到工具箱裡面了。可以直接拖動這個控制項到C#.NET應用程序的主窗口上去了,然後就像使用普通控制項那樣使用此控制項了。
比如,本文中的ActiveX控制項的自定義事件中,是通過滑鼠移動來觸發,那麼在應用程序中,只要滑鼠移動到控制項上,那麼就會觸發此自定義事件,並獲取當前滑鼠位置的橫坐標。
4. 最後一些Tip
1) 在自定義控制項時,可在控制項源碼的OnDraw()函數中設置控制項的外觀(也就是控制項被拖入到應用程序中時呈現的樣子,一般默認是一個白色的方框內切橢圓的樣式)。
2) 用C#來使用ActiveX的事件時,事件所產生的數據都包含在Event變數中,只需要用個點運算符就可以取出來了。
5.展望
控制項函數的返回值類型那麼多,那麼復雜,如果要用得好,還需要對那些OLE數據類型進行好好學習,這個等今後需要時再慢慢學習吧。
『貳』 怎樣查看OCX控制項的源碼
Delphi編寫的OCX可以用DEDE反編譯器看到源碼
C或是VB做的ocx都看不到源碼的
『叄』 delphi 鎬庝箞鍔ㄦ佽皟鐢╫cx涓鐨勬柟娉
OCX 鍏跺疄璐ㄤ笂鍙浠ョ湅浣滄槸鍔ㄦ佸簱錛屽嵆瀵 dll 鏂囦歡榪涜屽姞杞借皟鐢ㄣ
閫氬父鏉ヨ達紝浣犻渶瑕佸厛鍦ㄦ搷浣滅郴緇熶腑娉ㄥ唽 ocx錛屾瘮濡傦細
regsvr32.exe/syourocx.ocx
鐒跺悗錛屽湪婧愪唬鐮閲屽彲浠ュ厛寮曞叆榪欎釜搴擄紙Component--->Import Activex Control錛夛紝鍐嶈皟鐢ㄥ嵆鍙銆
濡傛灉鏄鍔ㄦ佹敞鍐岋紝鍙浠ュ弬鑰冧互涓嬩唬鐮侊細
//娉ㄥ唽ocx
functionRegisterOCX(FileName:string):Boolean;
varOCXHand:THandle;
RegFunc:TDLLFunction;
begin
OCXHand:=LoadLibrary(PChar(FileName));
RegFunc:=GetProcAddress(OCXHand,'DllRegisterServer');
if@RegFunc<>nilthen
Result:=RegFunc=S_OK
else
Result:=False;
FreeLibrary(OCXHand);
end;
//鍗歌澆OCX
functionUnRegisterOCX(FileName:string):Boolean;
varOCXHand:THandle;
RegFunc:TDLLFunction;
begin
OCXHand:=LoadLibrary(PChar(FileName));
RegFunc:=GetProcAddress(OCXHand,'DllUnregisterServer');
if@RegFunc<>nilthen
Result:=RegFunc=S_OK
else
Result:=False;
FreeLibrary(OCXHand);
end;
//璋冪敤錛
FWord:=CreateOleObject('Word.Application');
『肆』 如何將exe文件轉換為ocx,小弟不懂啊希望說的詳細點,我是新手。多謝了!
是VC++的嗎,如果是的話,新建一個ActiveX工程,然後把EXE的所有文件拷貝到ActiveX工程中,也就是在ActiveX工程中重新建一遍,然後編譯運行就生成.ocx文件了。
『伍』 .net調用ocx文件,注冊ocx文件後不能使用其中的方法
我也遇到過這樣的問題,可能和ie的設置有關,依次點擊ie中的工具-Internet選項-安全-自定義級別 然後將Activex相關的設置都啟用,試試看