Qt 之 ActiveX控件跑官方例程記錄

      網友投稿 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開發小白,所以記錄下。)

      CLASSID="CLSID:控件的CLASSID號"

      CODEBASE="控件的cab文件">

      [錯誤提示信息]

      1

      2

      3

      4

      5

      1

      Qt 之 ActiveX控件跑官方例程記錄

      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代碼

      An OpenGL scene:

      CODEBASE="http://qt.nokia.com/demos/openglax.cab">

      [Object not available! Did you forget to build and register the server?]


      Rotate the scene:

      X:

      Y:

      Z:

      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小時內刪除侵權內容。

      上一篇:辦公表格軟件下載安裝(怎么下載辦公表格軟件
      下一篇:excel表格中如何使用COUNTIF函數統計日期的次數
      相關文章
      亚洲综合网美国十次| 亚洲1区2区3区精华液| 毛片亚洲AV无码精品国产午夜| 亚洲成AV人综合在线观看| 亚洲国产精品久久久久婷婷老年| 亚洲中文字幕无码一区二区三区| 亚洲一区二区精品视频| 亚洲美女高清一区二区三区 | 国产精品亚洲精品日韩电影| 亚洲欧好州第一的日产suv| 亚洲色成人网站WWW永久四虎| 亚洲人成网站在线在线观看| 亚洲熟女综合色一区二区三区 | 亚洲中文字幕日产乱码高清app| 中文字幕精品亚洲无线码一区应用| 国产精品无码亚洲一区二区三区| 色偷偷尼玛图亚洲综合| 精品亚洲福利一区二区| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲 综合 国产 欧洲 丝袜| 亚洲日本在线观看视频| 亚洲色欲久久久综合网| 亚洲AV永久无码精品一百度影院 | 久久精品亚洲日本佐佐木明希| 亚洲人成人网毛片在线播放| 亚洲第一页中文字幕| 亚洲日韩乱码中文无码蜜桃臀| 亚洲人成在线免费观看| 亚洲中文字幕久久精品蜜桃| 亚洲av无码日韩av无码网站冲| 亚洲AV无码成H人在线观看| 精品亚洲一区二区三区在线播放 | 亚洲国产成人久久99精品| 久久精品国产亚洲AV忘忧草18| 亚洲午夜理论片在线观看| 色九月亚洲综合网| 国产精品亚洲玖玖玖在线观看 | 亚洲精品蜜夜内射| 亚洲精品无码久久毛片| 亚洲精品自产拍在线观看| 亚洲制服中文字幕第一区|