Название: вопрос по 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
|