有時我們安裝網頁插件,需要下載安裝時會提示“由于無法驗證發布者,所以windows已經阻止此軟件”的情況,很多用戶遇到這種情況都會束手無策,其實解決方法很簡單,下面小編就來給大家講一講具體的解決方法。#win10使用技巧#
1、首先,我們點擊IE瀏覽器右上方的“設置”圖標,在彈出的窗口中我們選擇“internet選項”。
2、打開頁面后,我們選擇上方的“安全”選項。
3、進入到“安全”界面后,我們點擊右下側的“自定義級別”。
4、界面彈出后,我們下滑進度條,找到activex控件和插件這個選項,并將其下方所有的選項都設置為“啟用”。
5、設置完后,我們退出剛才的頁面,再次來到internet選項,并點擊上方的“高級”選項。
6、進入“高級”頁面后,我們再次下拉進度條,并勾選允許運行或安裝軟件,即使簽名無效”,勾選后,點擊“確定”。
7、修改完后,當這個彈窗跳出來時我們再點擊“啟用”,問題就可以解決了。
以上就是小編為大家帶來的“由于無法驗證發布者,所以windows已經阻止此軟件”的解決方法,希望可以幫到大家。
Microsoft的ActiveX技術允許應用程序與其他應用程序或者庫提供的用戶接口組件一起工作。它構建于Microsoft的COM基礎上,為使用組件的應用程序定義了一套接口,并且為提供組件的應用程序和庫提供了另外一套接口。
Qt/Windows桌面版(Qt/Windows Desktop Edition)提供了ActiveQt框架,用以為ActiveX和Qt提供完美結合。ActiveQt由兩個模塊組成:
本文的例子將會在一個使用了QAxContainer模塊的Qt應用程序中嵌入一個Windows Media Player(如下圖所示)。這個Qt應用程序在Windows Media Player的ActiveX控件上添加了一個Open按鈕、一個Play/Pause按鈕、一個Stop按鈕以及一個滑動條。
需要獲取所調用ActiveX控件的常用參數和成員函數。可通過如下方法獲取。
(1)獲取控件的CLSID。比如調用WMP,首先需要知道WMP的CLSID,這里為:{22D6F312-B0F6-11D0-94AB-0080C74C7E95}。
(2)Qt提供了dumpdoc命令來自動生成對應CLSID控件的說明文檔,打開編譯器命令行,輸入指令格式為:
dumpdoc {CLISID} -o xxx.html
(3)查看生成的.html文件,獲取參數、信號和槽函數。
(1)新建項目,名稱為“mediaplayer”。
(2)在項目文件.pro中添加如下語句:
QT += axcontainer
(3)新建C++類,名稱為“PlayerWindow”,基類為QWidget。
(4)在代碼中添加如下頭文件:
#include <QAxWidget> //用于顯示WMP
#include <QAxObject> // 用于操作WMP對象
這個應用程序主窗口的類是PlayerWindow:
class PlayerWindow : public QWidget
{
Q_OBJECT
Q_ENUMS(ReadyStateConstants)
public:
enum PlayStateConstants { Stopped = 0, Paused = 1, Playing = 2 };
enum ReadyStateConstants { Uninitialized = 0, Loading = 1,
Interactive = 3, Complete = 4 };
PlayerWindow();
protected:
void timerEvent(QTimerEvent *event);
private slots:
void onPlayStateChange(int oldState, int newState);
void onReadyStateChange(ReadyStateConstants readyState);
void onPositionChange(double oldPos, double newPos);
void sliderValueChanged(int newValue);
void openFile();
private:
QAxWidget *wmp;
QToolButton *openButton;
QToolButton *playPauseButton;
QToolButton *stopButton;
QSlider *seekSlider;
QString fileFilters;
int updateTimer;
};
PlayerWindow類繼承了QWidget。這里的Q_ENUMS()宏(就像下面的Q_OBJECT一樣)是必需的,用來告訴moc:在onReadyStateChange()槽中使用的MPReadyStateConstants類型是一個枚舉類型。在private段,我們聲明了一個QAxWidget*的成員變量。
分段查看構造函數的代碼:
PlayerWindow::PlayerWindow()
{
wmp = new QAxWidget;
wmp->setControl("{22D6F312-B0F6-11D0-94AB-0080C74C7E95}");
在構造函數中,我們從創建一個QAxWidget對象封裝Windows Media Player的ActiveX控件開始。QAxContainer模塊由三個類組成:QAxObject封裝一個COM對象,QAxWidget封裝一個ActiveX控件,而QAxBase則為QAxObject和QAxWidget實現了COM的核心功能。這三個類之間的關系如下圖所示。
我們使用Windows Media Player 6.4控件的類的ID作為參數,對QAxWidget調用setControl()。這樣將會創建一個所需的實例。從那時起,這個ActiveX控件的所有屬性,事件和方法都可以通過QAxWidget對象而作為Qt的屬性、信號和槽來加以使用。
如下圖中總結的那樣,COM數據類型可以自動轉換為相應的Qt類型。例如,一個類型為VARIANT_BOOL的輸入參數可以轉換成一個boo變量,并且一個類型為VARIANT_BOOL的輸出參數也可以轉換成一個bool &變量。如果結果類型是一個Qt類(比如像QString,QDateTime等),那么輸入參數的類型將會是一個常量引用(例如,const QString &)。
我們繼續查看PlayerWindow的構造函數:
wmp->setProperty("ShowControls", false);
wmp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
connect(wmp, SIGNAL(PlayStateChange(int, int)),
this, SLOT(onPlayStateChange(int, int)));
connect(wmp, SIGNAL(ReadyStateChange(MPReadyStateConstants)),
this, SLOT(onReadyStateChange(MPReadyStateConstants)));
在調用QAxWidget::setControl()之后,通過調用QObject::setProperty(),可以把這個Windows Media Player的ShowControls屬件設置為false,因為我們自己提供了用來操作這個組件的按鈕。函數QObject::setProperty()既可以用于COM屬性又可以用于普通的Qt屬性。它的第二個參數的類型是QVariant。
接下來調用setSizePolicy(),讓這個ActiveX控件占有布局中所有可用的空間,并且把COM組件中的ActiveX事件連接到槽中。
…
stopButton = new QToolButton;
stopButton->setText(tr("&Stop"));
stopButton->setEnabled(false);
connect(stopButton, SIGNAL(clicked()), wmp, SLOT(Stop()));
…
除了把一些Qt信號和這個COM對象提供的槽[Play() ,Pause()和Stop()]連接起來以外,Playerwindow構造函數中的其余部分都與我們在平常模式下的情況一樣。由于這些按鈕的功能實現都有相似性,所以這里只給出了Stop按鈕的實現代碼。
讓我們離開這個構造函數,來看一看timerEvent()函數:
void PlayerWindow::timerEvent(QTimerEvent *event)
{
if (event->timerId() == updateTimer) {
double curPos = wmp->property("CurrentPosition").toDouble();
onPositionChange(-1, curPos);
} else {
QWidget::timerEvent(event);
}
}
當正在播放一個多媒體片斷的時候,每隔一定時間就會調用函數一次。我們使用它推進滑動條的滑塊。通過調用ActiveX控件上的property()獲得CurrentPosition屬性的QVariant類型的值,然后調用toDouble()把它轉換成double值,就可以實現滑塊的推進。然后,我們調用onPositionChange()來執行更新。
當拖動滑塊時,視頻當前位置通過下面的函數更新:
void PlayerWindow::sliderValueChanged(int newValue)
{
seekSlider->blockSignals(true);
wmp->setProperty("CurrentPosition", double(newValue) / 60);
seekSlider->blockSignals(false);
}
這里調用了setProperty()函數對屬性進行設置。我們不再查看其余的代碼了,因為它們中的絕大多數都不直接和ActiveX相關。
在處理多個COM對象時,經常需要能夠直接調用一個COM方法(而不是把它連接到一個Qt信號上)。要做到這一點,最容易的方法就是使用這個方法的名字和簽名作為調用QAxBase::dynamicCall()的第一個形式參數,并且把這個方法的實際參數作為額外參數。例如:
wmp->dynamicCall("TitlePlay(uint)", 6);
這個dynamicCall()函數最多可以帶8個QVariant類型的參數,并且它可以返回—個QVariant。如果需要使用這種方法傳遞IDispatch *或者IUnkown *,就可以把這個組件封裝到一個QAxObject中,并且對它調用asVariant(),以將其轉換成一個QVariant()。如果需要調用能夠返問Dispatch *或IUnkown *的COM方法,或者如果需要訪問一個具有上述類型之一的COM屬性,那么就可以使用querySubObject()來代替:
QAxObject *session = outlook.querySubObject("Session");
QAxObject *defaultContacts =
session->querySubObject("GetDefaultFolder(OlDefaultFolders)",
"olFolderContacts");
如果我們希望調用一些函數,而這些函數的參數列表中還有一些不支持的數據類型,那么就可以使用QAxBase::querylnterface()來取得COM的接口并且直接調用這個函數。就像往常使用COM一樣,在我們已經完成了對COM接口的使用時,必須調用Release()。如果需要經常調用這樣的函數,那么可以派生QAxObject或者QAxWidget,并且再提供一些封裝這些COM接口調用的成員函數即可。需要注意的是,這些QAxObject和QAxWidget的子類不能定義它們自己的屬性、信號或槽。
——————————————————
對于本文實例完整代碼有需要的朋友,可關注并在評論區留言!