Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Май 19, 2016, 11:36



Название: вопрос по imapi2
Отправлено: koldun90 от Май 19, 2016, 11:36
Здравствуйте решил изучить библиотеку windows для работы с дисками...
использую qt 5.6 и компилятор от msvs2015 сообственно сам проект в архиве
собствено вопрос в следующем я создад простенький gui проект на нем кнопку button при клике на которую
выполняется слот kolvoprivodov();


mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <imapi2.h>
#include <imapi2error.h>
#include <imapi2fs.h>
#include <imapi2fserror.h>

#include <QMainWindow>
#include <QMessageBox>
#include <iostream>

using namespace std;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    IDiscRecorder2* recorder;
    IDiscMaster2* discMaster;
   // IDiscMaster2 master;


private:
    Ui::MainWindow *ui;
public slots:
    long kolvoprivodov();  //количество приводов в системе
private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //kolvoprivodov();
}

MainWindow::~MainWindow()
{
    delete ui;
}

long MainWindow::kolvoprivodov()
{
    HRESULT m_hResult;
    if (discMaster == NULL)
    {
        return 0;
    }
    long totalDevices = 0;
    m_hResult = discMaster->get_Count(&totalDevices);
    if (FAILED(m_hResult))
    {

        return 0;
    }
    return totalDevices;
}

void MainWindow::on_pushButton_clicked()
{
    kolvoprivodov();
}


burncddvd.pro


Код:
#-------------------------------------------------
#
# Project created by QtCreator 2016-05-18T14:08:46
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = burncddvd
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui


main.cpp

Код:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

проблема заключается в том что я пытаюсь определить количество приводов в системе
но почему то программа падает на строке
 
Код:
m_hResult = discMaster->get_Count(&totalDevices);


Название: Re: вопрос по imapi2
Отправлено: kambala от Май 19, 2016, 11:44
потому что в discMaster содержится мусор


Название: Re: вопрос по imapi2
Отправлено: koldun90 от Май 19, 2016, 13:47
тогда я не допонял как пользоваться idiskmaster, мб подскажете как?


Название: Re: вопрос по imapi2
Отправлено: kambala от Май 19, 2016, 14:08
почитай в MSDN как инициализировать эту переменную — наверняка функция какая-то есть


Название: Re: вопрос по imapi2
Отправлено: yodu от Май 19, 2016, 14:21
тогда я не допонял как пользоваться idiskmaster, мб подскажете как?

CoCreateInstance c __uuidof(MsftDiscMaster2)  (c) MSDN

Код
C++ (Qt)
HRESULT error = CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDiscMaster2), (void**) &discMaster);

тыц (https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686615%28v=vs.85%29.aspx)

Подозреваю (потому что давно не трогал это даже 2 метровой палкой), что еще CoInitialize нужен будет для потока, в котором ты его юзать будешь.


Название: Re: вопрос по imapi2
Отправлено: koldun90 от Май 19, 2016, 15:05
добавил инициализацию
но получились вот такие вот ошибки
(http://s45.radikal.ru/i107/1605/d8/06670c108519.png) (http://radikal.ru/big/e6fe7c4167984762837a88428347393e)


Название: Re: вопрос по imapi2
Отправлено: kambala от Май 19, 2016, 15:54
либы линковать Пушкин будет?

открываешь документацию на CoCreateInstance(), и там будет написано в какой библиотеке она сидит. ну или можно по названию заголовочного файла, в котором она объявлена, попробовать угадать что за библиотека.


Название: Re: вопрос по imapi2
Отправлено: koldun90 от Май 20, 2016, 10:36
как я понял нужно
LIBS += -l ole32

ps но это не дает результат по прежнему ошибка
судя по докам

Header
Objbase.h

Library
Ole32.lib

DLL
Ole32.dll


Название: Re: вопрос по imapi2
Отправлено: yodu от Май 20, 2016, 11:26
Код
C++ (Qt)
#include <iostream>
#include <sstream>
 
#include <imapi2.h>
#include <imapi2error.h>
#include <imapi2fs.h>
#include <imapi2fserror.h>
 
#pragma comment(lib, "ole32.lib")
 
void hresult_check( HRESULT error )
{
   if( error != S_OK ) {
       std::ostringstream oss;
       oss << "Error 0x" << std::hex << error;
       throw std::runtime_error( oss.str( ) );
   }
}
 
int main( )
{
   try {
       IDiscMaster2* discMaster = nullptr;
 
       CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED );
 
       HRESULT error = CoCreateInstance( __uuidof( MsftDiscMaster2 ),
           NULL, CLSCTX_INPROC_SERVER,
           __uuidof( IDiscMaster2 ),
           (void**)&discMaster );
 
       hresult_check( error );
 
       LONG count = 0;
       error = discMaster->get_Count( &count );
 
       hresult_check( error );
 
       std::cout << "you have " << count << " drives\n";
 
       for( auto i = 0; i < count; ++i ) {
           BSTR info = nullptr;
           error = discMaster->get_Item( 0, &info );
           hresult_check( error );
           std::wcout << i << ": " << static_cast<const wchar_t *>(info) << "\n";
       }
       discMaster->Release( );
       CoUninitialize( );
   } catch( const std::exception &ex ) {
       std::cerr << ex.what( ) << "\n";
       return 1;
   }
 
   return 0;
}

Код:
you have 1 drives
0: \\?\scsi#cdrom&ven_vbox&prod_cd-rom#4&8f5d389&0&010000#{53f56308-b6bf-11d0-94f2-00a0c91efb8b}

работает.


Название: Re: вопрос по imapi2
Отправлено: kuzulis от Май 20, 2016, 16:34
Цитировать
LIBS += -l ole32
LIBS += -lole32