Russian Qt Forum
Ноябрь 24, 2024, 17:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по imapi2  (Прочитано 5603 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Май 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);
« Последнее редактирование: Май 19, 2016, 11:42 от koldun90 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 19, 2016, 11:44 »

потому что в discMaster содержится мусор
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #2 : Май 19, 2016, 13:47 »

тогда я не допонял как пользоваться idiskmaster, мб подскажете как?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Май 19, 2016, 14:08 »

почитай в MSDN как инициализировать эту переменную — наверняка функция какая-то есть
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
yodu
Гость
« Ответ #4 : Май 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);

тыц

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

Сообщений: 345


Просмотр профиля
« Ответ #5 : Май 19, 2016, 15:05 »

добавил инициализацию
но получились вот такие вот ошибки

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Май 19, 2016, 15:54 »

либы линковать Пушкин будет?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #7 : Май 20, 2016, 10:36 »

как я понял нужно
LIBS += -l ole32

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

Header
Objbase.h

Library
Ole32.lib

DLL
Ole32.dll
« Последнее редактирование: Май 20, 2016, 11:09 от koldun90 » Записан
yodu
Гость
« Ответ #8 : Май 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}

работает.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Май 20, 2016, 16:34 »

Цитировать
LIBS += -l ole32
LIBS += -lole32
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.157 секунд. Запросов: 23.