Witam,
Borykam się z problemem wyszukania aktualizacji Windows Update. Znalazłem w necie, że można skożystać z biblioteki wuapi.dll.
Inerfejsy i procedury tej biblioteki można znaleźć tu:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa386065(v=vs.85).aspx
searcher->generateDocumentation() podpowia coś takiego:
Public Slots:
IDispatch* BeginSearch(QString criteria, IUnknown* onCompleted, QVariant state);
IDispatch* EndSearch(IDispatch* searchJob);
Member Function Documentation
IDispatch* BeginSearch (QString criteria, IUnknown* onCompleted, QVariant state) [slot]
Starts an asynchronous search using the currently configured search options.
Connect a signal to this slot:
QObject::connect(sender, SIGNAL(someSignal(QString, IUnknown*, QVariant)), object, SLOT(BeginSearch(QString, IUnknown*, QVariant)));
Or call the function directly:
QVariantList params = ...
QAxObject * result = object->querySubObject("BeginSearch(QString, IUnknown*, QVariant)", params);
IDispatch* EndSearch (IDispatch* searchJob) [slot]
Completes an asynchronous search.
Connect a signal to this slot:
QObject::connect(sender, SIGNAL(someSignal(IDispatch*)), object, SLOT(EndSearch(IDispatch*)));
Or call the function directly:
QVariantList params = ...
QAxObject * result = object->querySubObject("EndSearch(IDispatch*)", params);
Naskrobałem trochę kodu, ale nie mogę przekazać parametrów do QAxObjec->querySubObject(...);
W konstruktorze MainWindow tworzę obiekty QAxObject:
#include <QVariantList>
#include <QAxObject>
#include <QDebug>
#include <QUuid>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow), session(0), searcher(0)
{
ui->setupUi(this);
session = new QAxObject("Microsoft.Update.Session", this);
connect(ui->actionTestuj, &QAction::triggered, [=] (bool) {
beginSearch();
});
Następnie chcę odpalić procedurę BeginSearch:
void MainWindow::beginSearch()
{
searcher = session->querySubObject("CreateUpdateSearcher()");
// ISearchCompletedCallback *colback = new ISearchCompletedCallback();
QUuid obj("{00000000-0000-0000-C000-000000000046}");
QVariant arg(QVariant::Uuid, &obj);
QString prm = "isInstalled=0 and isHidden=0";
QVariantList params;
params.append(prm);
params.append(colback);
params.append(NULL);
QAxObject *job = searcher->querySubObject("BeginSearch(QString, IUnknown*, QVariant", params);
bool looping = false;
int sm = QTime::currentTime().minute();
while(!looping) {
if(!job) {
looping = job->property("IsCompleted").toBool();
};
QApplication::processEvents();
int m = QTime::currentTime().minute();
if ((m-sm) > 2) {
looping = false;
}
}
setWindowTitle("Gotowe");
}
I teraz dwa problemy:
- Jak zaimplementować parametr IUnknown* w BeginSearch(...), który powinien być typu: ISearchCompletedCallback
- QVariantList nie przyjmuje mi zmiennej obj, gdy jest typu QAxObject lub QUuid.
Kod który prezentuję jest totalnie skopany, ale w akcie desperacji próbowałem co mi do głowy przyjdzie.
Ma ktoś może pomysł, jak to rozwiązać?
Bardzo dziękuję za pomoc.
Pozdrawiam.