Hello. Im trying to interface the MMDeviceEnumerator COM.
I've developed a Wrapper class for that interface in VB6 (source is here), and now im trying to get it working in QT.
Now im debugging it, and when it works, I will create a Class.
my MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAxObject>
namespace Ui {
class MainWindow;
}
{
Q_OBJECT
public:
explicit MainWindow
(QWidget *parent
= 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAxObject>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QAxObject *MMDevEnum;
QAxObject *IMMDevEnum;
QAxObject *IAudioMeter;
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
To copy to clipboard, switch view to plain text mode
my MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QAxObject>
#include <windows.h>
#include <InitGuid.h>
//#include "endpointvolume.h"
//typedef interface IAudioMeterInformation IAudioMeterInformation;
MainWindow
::MainWindow(QWidget *parent
) : ui(new Ui::MainWindow)
{
qDebug() << "going to init";
MMDevEnum->setControl("{BCDE0395-E52F-467C-8E3D-C4579291692E}");
qDebug() << "instantiated MMDevEnum";
IMMDevEnum->setControl("{A95664D2-9614-4F35-A746-DE8DB63617E6}");
IAudioMeter->setControl("{C02216F6-8C67-4B5B-9D00-D008E73E0064}");
MMDevEnum->dynamicCall("GetDefaultAudioEndpoint(0, 0, QAxBase::asVariant)", IMMDevEnum->asVariant());
qDebug() << "OK";
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QAxObject>
#include <windows.h>
#include <InitGuid.h>
//#include "endpointvolume.h"
//typedef interface IAudioMeterInformation IAudioMeterInformation;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
qDebug() << "going to init";
MMDevEnum = new QAxObject(this);
MMDevEnum->setControl("{BCDE0395-E52F-467C-8E3D-C4579291692E}");
qDebug() << "instantiated MMDevEnum";
IMMDevEnum = new QAxObject(this);
IMMDevEnum->setControl("{A95664D2-9614-4F35-A746-DE8DB63617E6}");
IAudioMeter = new QAxObject(this);
IAudioMeter->setControl("{C02216F6-8C67-4B5B-9D00-D008E73E0064}");
MMDevEnum->dynamicCall("GetDefaultAudioEndpoint(0, 0, QAxBase::asVariant)", IMMDevEnum->asVariant());
qDebug() << "OK";
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
To copy to clipboard, switch view to plain text mode
As you can see, its just a little try.
However, it fails to instantiate IMMDevEnum and IAudioMeter.
In the MSDN, "GetDefaultAudioEndpoint" is defined as:
HRESULT GetDefaultAudioEndpoint(
[in] EDataFlow dataFlow,
[in] ERole role,
[out] IMMDevice **ppDevice
);
/* Example (eRender = 0, eConsole = 0)
In the preceding code fragment, variable hr is of type HRESULT, pDevEnum is a pointer to an IMMDeviceEnumerator interface, and pDeviceOut is a pointer to an IMMDevice interface.
*/
hr = pDevEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDeviceOut);
HRESULT GetDefaultAudioEndpoint(
[in] EDataFlow dataFlow,
[in] ERole role,
[out] IMMDevice **ppDevice
);
/* Example (eRender = 0, eConsole = 0)
In the preceding code fragment, variable hr is of type HRESULT, pDevEnum is a pointer to an IMMDeviceEnumerator interface, and pDeviceOut is a pointer to an IMMDevice interface.
*/
hr = pDevEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDeviceOut);
To copy to clipboard, switch view to plain text mode
Information about Interface IMMDeviceEnumerator can be found in the MSDN here.
I don't know why it doesnt work.
I think that both IMMDevEnum and IAudioMeter doesn´t need to be instantiated, but the Dynamic call still fails: "QAxBase::dynamicCallHelper: Object does not support automation".
Actually I use mingw, not MSVC.
Sorry for my bad english!
Thanks
Bookmarks