基於ATL開發ActiveX控件(第一節,簡單的Hello world)

原文鏈接:http://wmljava.iteye.com/blog/832531


     大家好,最近開始學習C++,由於工作原因需要維護和完善已有的ActiveX控件,本人對C++還是起步階段,對開發ActiveX控件更是一無所知,於是把學習控件開發的經歷記錄下來,以便自己將來的溫故和對同樣沒有學習基礎的人一個幫助。有C++開發經驗的人可以繞。知識就像一幢大樓,需要一磚一瓦的建設,閒話少敘,開始學習吧......

 

一、開發環境

     XP、Visual Studio2010。

 

      我用VC2010做爲C++的集成開發環境,Visual Studio2010也是目前最新版了。選擇最新版是有原因的,我先安裝了Visual Studio2010用了一段時間,然後在網上找的教學視頻都是基於VC6的,還有工作上遇到的一些從事C++開發的牛人用的也是VC6,於是我又下了一個VC6,但是用起來發現VC6和2010的差距好大,而且一個重要的原因是VC6推出的時候C++的標準還沒有形成,所以VC6對C++的支持有一些地方並不規範;還有一個原因,WIN7逐漸普及的同時WIN7 64位也在逐漸的走入千家萬戶,我們單位新配的電腦就是WIN7 64位的系統,在VC6中找不到64爲的開發環境,所以VC6遲早要被時代所淘汰,就像經典的XP正在被WIN7淘汰一樣。

       我的操作系統目前用的是XP,我是在WIN7上運行的虛擬機,虛擬的XP,單位的電腦好快,在虛擬機上開發並不覺得太慢,大家可能有疑問,爲什麼不在WIN7上開發,我在WIN7上開發的控件在XP上無法註冊,不過還沒證實就是WIN7原因,現在我們用XP系統開發,試試吧。

 

 二、 開發第一個ActiveX控件

      第一步:創建工程

      運行Visual Studio2010,我用C++語言開發,我們創建一個工程:“文件--新建--項目”,在已安裝的模板中選擇“Visual C++——ATL”,然後選擇右邊的“ATL項目”,項目名稱“HeloWorldATL”,點擊確定,然後一直下一步選擇默認的配置就可以,工程就創建好了。見下圖



 

      第二步:添加一個ATL控件類

      右鍵工程名稱“HeloWorldATL”,選擇“添加--類”,選擇“ATL控件”,在簡稱處填寫“Test”,點擊完成。

 

      第三步:添加一個方法

      切換到類視圖(在左下角解決方案旁邊),找到ITest接口,右鍵“添加--方法”,方法名:“test1”,點擊完成。

 

      第四步:編寫方法代碼

      切換到解決方案視圖,然後展開“源代碼”,打開Test.cpp,找到方法:

STDMETHODIMP CTest::test1(void)
{
	// TODO: 在此添加實現代碼

	return S_OK;
}

      修改方法,我做了一個簡單的實現,將“hello”輸出到本地硬盤上:

STDMETHODIMP CTest::test1(void)
{

	ofstream out("C:\\log1.txt");

	out << "hello";

	out.close();

	return S_OK;
}


      記得引入ofstream:


#include <fstream>

using namespace std;


     第五步:編譯生成控件

     右鍵項目名稱,選擇“生成”

       

 三、測試ActiveX控件

        首先介紹一下CLASSID, 大家會有疑問,測試控件和CLASSID有什麼關係呢?這和ActiveX控件調用的機制有關,在html文件中,ActiveX控件是通過<object>標籤聲明並調用的,<object>標籤中有三個重要的屬性,第一個是id,通過id我們可以用js引入控件對象;第二個是codebase,用來指定控件的安裝源,這個我們先不做介紹;第三個就是CLASSID,用來查找註冊表中控件,CLASSID又叫全球唯一標識,也就是說我們每次創建的控件工程所產生的CLASSID都不會重複,原理大概是這樣的:取網卡的Mac地址然後拼接上一些隨機數等規則,因爲網卡的Mac地址也是全球唯一的,所以生生的CLASSID也不會重複。那麼我們怎麼找到控件的CLASSID呢?細心的觀察我們可以發現,但我們對工程進行生成操作後,在工程下多了一個htm文件,我的叫Test.html,這個文件的命名規則是取我們控件類的名稱,大概這個文件我們看其中關鍵的內容:

 

<OBJECT ID="Test"  CLASSID="CLSID:D55ED53A-0452-4D3D-B821-23D8B5E984D8"></OBJECT>


沒錯,我的CLASSID就是“D55ED53A-0452-4D3D-B821-23D8B5E984D8”,這個htm就是用來測試我們的控件的,光有一個<object>標記還不夠,我們還要添加一些測試代碼,如下: 

 

<script type="text/javascript">
    Test.test1();
</script>


然後我們運行一下這個htm,看看最終的效果。

第一節,簡單的Hello world!

 

在本節中只是做了一個最簡單的ActiveX控件,並沒有涉及到傳參和返回值,後續我會講怎麼傳參怎麼接收返回值,敬請期待!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章