最近做ActiveX插件,以網上一位牛人的《基於MFC的ActiveX控件開發》這一系列文章入門,不過,他的文章主要介紹在ActiveX本身提供的框架內進行開發,如果我希望我的ActiveX插件本身就以Dialog或者FormView窗體的形式呈現,那該如何處理呢?本文就總結一下這個,並且附帶總結一下vs2008下以及網頁下如何調試ActiveX,作為上述系列文章的補充。
一、在ActiveX中使用Dialog
1. 首先創建一個ActiveX工程,工程名假設為:MyActiveX
2. 創建一個對話框資源Dialog),並關聯一個類CMyDialog)。檢查一下對話框資源的配置,推薦配置:style:child, border:dialog frame, visible:ture, control:ture
3. 對ActiveX控制類CMyActiveXCtrl)做如下操作:
1) 在CMyActiveXCtrl類的定義中,添加一個成員變量:CMyDialog m_myDlg;
2) 為CMyActiveXCtrl類添加OnCreate消息響應:
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
3)在上述 OnCreate 消息響應函數中,添加如下代碼:
- m_myDlg.Create(IDD_MYDLG,this); //IDD_MYDLG為對話框資源ID
4)在 CMyActiveXCtrl類 的 OnDraw 函數中,添加如下代碼
- m_myDlg.MoveWindow(rcBounds, TRUE);
4. 到此,基本工作完成。可以在 Active X control test container 中進行測試了。
二、在ActiveX中使用FormView
在ActiveX中使用FormView跟使用Dialog大體類似,但是FormView與Dialog有很多不同的地方,因此有些需要特別注意。
1. 同上,首先創建一個ActiveX工程,工程名假設為:MyActiveX
2. 創建一個FormView資源,並關聯一個派生於CFormView的類CMyForm)。檢查一下對話框資源的配置,推薦配置:style:child, border:none, visible:ture, control:ture
3. 在CMyForm類的定義裡面添加一項友元聲明friend class CmyActiveXCtrl;)因為FromView類的Create函數是protected型,所以如果想手動調用FromView派生類的Create函數的話,要麼加友元聲明,要麼,在派生類CMyForm的定義中,重載Create方法,並設置為 public型。
4. 對ActiveX控制類CMyActiveXCtrl)做如下操作:
1) 在CMyActiveXCtrl類的定義中,添加一個成員變量:CMyForm * p_myFrom; // 注意,這裡要使用指針,FormView資源必須動態創建,如果這裡直接使用對象,而不是用指針,則在釋放ActiveX控件的時候,會出現 Debug Assertion Fail 的錯誤。
2) 為CMyActiveXCtrl類添加OnCreate消息響應
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
3) 在上述 OnCreate 消息響應函數中,添加如下代碼:
- p_myForm = new CMyForm();
- p_myForm->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL);
4)在 CMyActiveXCtrl類 的 OnDraw 函數中,添加如下代碼:
- p_myForm->MoveWindow(rcBounds,TRUE);
5. 到此,基本工作完成。可以在 Active X control test container 中進行測試了。
三、 在win7 + vs2008下調試ActiveX控件
在vs2008下,沒有自帶 Active X control test container,需要自己編譯,這個過程可能會遇到一些問題,我把解決方案部分是網上搜集的)寫在下面,以供大家參考。
在編ActiveX控件時,可以用到Active X control test container來測試activex控件,這在Visual Studio 6裡面是很方便查找的,工具菜單下面就有。但是在Visual Studio 2008 裡面TSTCON32.exe這個文件卻消失了。那它是沒了嗎,不是的。而是微軟把它放在了例子程序裡面,需要自己編譯。詳細目錄:比如我裝在C盤裡面,VC的例子在 “C:\Program Files\Microsoft Visual Studio 9.0\Samples\2052\AllVCLanguageSamples.zip”,把這個文件解壓縮以後,在下面的目錄可以找到TSTCON32.exe的源代碼:“C++\MFC\ole\TstCon”,自己編譯就可以了。
這裡特別注意,由於默認的是Win32的解決方案平台,所以在編譯TCProps和TstCon要將編譯平台選為Win32,而不是默認的Itanium平台。
650) this.width=650;" alt="" src="data:image/png;base64,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" />
OK拿去編譯,注意得先編譯TCProps,然後再編譯TstCon。
如果是在win7下,運行測試時,則還會出現錯誤,彈出“並行運行錯誤”的對話框,解決方法】:
1)分別在TstCon和TCProps兩個Project的StdAfx.h文件加入 #define _WIN32_WINNT 0x0600.
2)原始TstCon工程沒有相應語句之間添加即可;原始TCProps工程將#define _WIN32_WINNT 0x0400改為#define _WIN32_WINNT 0x0600即可。
3)分別對各個工程進行:選中對應工程-->點擊右鍵,選擇 Properties-->Configuration Properties-->Linker-->Manifest File-->選中Enable User Account Control(UAC):改為No,原始為Yes,點擊,應用,確定即可。需Release、Debug下各配置一次。
另外,在vs2008下在編譯MyActiveX工程的時候,可能會出現如下錯誤:
Project : error PRJ0050: Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.
解決方法】:
1) 在工程配置-> Linker -> General -> Per-User Redirection 選擇No
2) 使用管理員權限打開vs2008vs exe圖標右鍵->以管理員身份運行)
3) 如果問題還是沒有解決的話,請注意查看你的ActiveX工程所依賴的庫文件是否都在.ocx文件所在的目錄下,如果缺少所依賴的庫文件,也會報這個錯誤。
四、在網頁中測試ActiveX
首先,安裝 ActiveX Control Pad 軟件,這個軟件是微軟提供的專門用來動態生成測試ActiveX的html頁面代碼的工具,用這個工具,可以很方便地生成需要的html代碼或者網頁。
然後,執行如下步驟:
1. 將自己的myActiveX工程設置為release,生成一個release版本必須),否則使用ActiveX Control Pad無法得到有效的插件信息。提示,改成release版後,注意工程配置,比如依賴的庫,都要與debug一致。)
2. 打開ActiveX Control Pad,選擇菜單File -> New HTML,創建一個HTML頁面。
3. 從ActiveX Control Pad選擇菜單Edit -> Insert ActiveX Control ....,然後會彈出一個消息框。從消息框的列表中選擇相應的ActiveX Control,點擊OK即可將ActiveX Control插入到HTML頁面。可以在彈出的框中調整相關參數,比如控件大小等)
4. 在本機通過IE浏覽器打開生成的HTML即可看到ActiveX Control顯示在HTML頁面中。注意,有的浏覽器可能會禁止加載ActiveX控件,檢查一下相關的安全配置情況)
本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/610784