Django入門之開發環境搭建1.1
914
2025-04-01
轉載自:Qt 之 ActiveX控件跑官方例程記錄
通過自己的實踐,補充了一些技術細節
目錄(?)[-]
開發環境
基礎知識了解
QT的ActiveX控件形式
in-process運行的ActiveX server控件
獨立運行的ActiveX server控件
開發環境
win7 64+QT5.8.0 + MSVC2015_32/64
基礎知識了解
ActiveX 是微軟針對網頁或其它應用調用而弄出來的,所以只能在IE中使用,firefox,chrome等不能用。所以,測試時請使用IE瀏覽器。
微軟的東西,由于一些相應的API的兼容原因,無法用mingw版的編譯器編譯成功,編譯出來的exe也不能正常運行。
由于ActiveX的安全阻截,所以如果你做的插件沒有相應認證需要設置下IE,關于IE的安全設置如下看著勾吧
ActiveX控件與一般的共享庫或程序一樣,要檢查其依賴是否完整,否則就要拷貝到一塊。可以使用depends.exe查看,windeployqt.exe自動拷貝,在dll開發中有講不多說了。
微軟的IE中,HTML引入控件的方法(本來WEB開發小白,所以記錄下。)
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
ID:實例化的對象名 (必須)
CLASSID :插件中實例化的類ID(必須)。
CODEBASE:如果本地注冊表中沒有注冊該插件,則需要它提供一個地址來下載該插件的cab包(所以是非必須,只要你手動本地注冊或手動運行了該插件服務就行。如何制作cab包另說【我的補充】如何打cab包)
調用控件的方法,ID名就是對象名了,上面相當于實例化了一個控件中的類對象,可以直接調用其中的方法
OBject.function(args);
1
1
1
QT的ActiveX控件形式
QT的ActiveX控件有兩種形式,一種是DLL,一種是EXE。兩種形式的安裝運行不同
DLL的安裝:
使用微軟提供的工具?regsvr32,成功后可以用regedit查詢,可以直接寫個bat在dll插件目錄下,就可以不用寫path路徑了。
regsvr32 path\xxx.dll 安裝
regsvr32 path\xxx.dll /u 卸載
1
2
1
2
1
2
自己寫個安裝代碼實現,跟調用dll一樣(我的補充:win32 控制臺程序即可,記得導入
HMODULE dll = LoadLibrary("myserver.dll");
typedef HRESULT(__stdcall *DllRegisterServerProc)();
DllRegisterServerProc DllRegisterServer =
(DllRegisterServerProc)GetProcAddress(dll, "DllRegisterServer");
HRESULT res = E_FAIL;
if (DllRegisterServer)
res = DllRegisterServer();
if (res != S_OK)
// error handling
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
EXE的安裝運行
QT編譯出來的exe運行有兩種方式,一種是獨立運行,一種是像dll那樣類似先安裝后調用。
具體看后面的例程說明—獨立運行的ActiveX server控件
in-process運行的ActiveX server控件
此處以Hierarchy Example (ActiveQt)?為例說明(此例程宏定義中有多余的“;”,不刪除也能編譯通過,官方例程還出這種bug!!),
在示例程序中搜索該項目,打開構建,成功后一般生成的主要文件是?.dll文件,此時看輸出信息會顯示“Server registered successfully!”說明IDC已經給我們注冊到系統中了,不信可以打開注冊表查看。
此時如果執行網頁,會發現什么也沒有,控件沒有被加載進來。
這是因為dll它所依賴的其它dll也不全,在系統路徑中找不到,所以加載不了。你手動注冊下也不會成功,那為什么IDC能成功呢,因為IDC的環境變量中包含了QT庫呀。命令行執行下面的語句,路徑自己加,或者手動拷貝。dll齊全后再執行就OK了。
【我的補充】
windeployqt.exe xxx.dll
1
1
1
注意:?1.windeployqt的版本要選你編譯時的KIT選擇的版本。不然找的庫也不對。比如64位下的windeployqt他只找64位的庫,所以用depend.exe看沒毛病可執行起來依然不行。這問題讓我開始時完全找不到點上
2.dll控件我用64位的msvc編譯出來可注冊,但執行不了,用32位就可以,無解。。。。。。。
獨立運行的ActiveX server控件
此處以OpenGL Example (ActiveQt)為例說明,
在示例程序中搜索該項目,打開構建,成功后一般生成主要文件是?.exe文件,可以單獨運行(手動點擊exe執行時,必須把依賴dll都拷貝在一起,直接點QT里的運行,它是自動加了QT庫到PATH中的,所以看似不需要dll), 此時如果執行HTML代碼
function setRot( form )
{
GLBox.setXRotation( form.XEdit.value );
GLBox.setYRotation( form.YEdit.value );
GLBox.setZRotation( form.ZEdit.value );
}
An OpenGL scene:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
會顯示Object not available! Did you forget to build and register the server?,那是因為你還沒有以activex服務的形式運行控件openglax.exe,那如何運行?
有兩個方法:
1 使用QT提供的小工具IDC注冊下(第一次構建成功后你打開輸出會有提示:“Server registered successfully!”,這就是用IDC注冊成功了。)
注:在非Qtcreator下運行時無論是想要注冊成功還是以activex形式單獨運行,都必須把依賴庫找齊才行。所以這里雖然注冊成功了,但運行網頁依然不行。除非你弄齊了
【我的補充】
2 直接用命令行加參數運行插件,regsvr32是無法注冊的。
看QT介紹.exe控件可以在其后添加命令參數。命令行可使用如下參數
為了方便驗證,使用第二種簡單,你可以先在Qtcreator項目配置中在command line arguments上加上 -activex,然后點擊運行(F5)就OK了(注意要勾上add build library path to PATH,默認勾上的)。
【我的補充】
此時在打開測試網頁看是不是成功了,可能控件區一片白,鼠標點擊下就出來了,這種形式由于控件是單獨運行的,所以每次打開頁面之前都要運行下openglax.exe才能顯示,不然不能加載插件。
如果不想這么麻煩,那可以先用-regserver注冊openglax.exe插件到系統注冊表中,這樣也就和dll形式的插件一樣了,而且明顯感覺到開啟速度很快。如果Qtcreator運行注冊成功了但依然不能顯示,那是因為qt更改了path的原因,所以能注冊,但運行網頁時沒有這個環境了,故你需要將依賴的dll和openglax.exe放到一塊,不然無法正常加載。
兩種方式的網頁測試都不強求測試網頁要和插件放在一塊,也不要求插件非要放在系統目錄中,只是要求插件和所需依賴要一起且齊全。因為Qtcreator運行時是加了path變量的,重要的事情強調下。
此種形式無論是32還是64的編譯器都OK。
演示如圖:
測試成功后再把依賴庫打包一起發布吧。
Qt Windows
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。