Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Qt как вызвать правильно метод/слот класса  (Прочитано 1434 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3474
  • nix - вот оно счастье...
    • Просмотр профиля
Ребят помогите разобраться :(
есть файл infohard.h
Код: (cpp) [Выделить]
#ifndef INFOHARD_H
#define INFOHARD_H

#include <QObject>
#include <QString>
#include <QMainWindow>
#include <QMessageBox>
#include <QDebug>
#include <iostream>
    #ifdef Q_OS_WIN32
        #pragma once
        #define _WIN32_DCOM
        #include <wbemidl.h>
        #include <comdef.h>
        #include <conio.h>
        #pragma comment(lib, "wbemuuid.lib")
    #endif
using namespace std;

class InfoHard : public QObject
{
    Q_OBJECT
public:
    explicit InfoHard(QObject *parent = 0);

signals:

public slots:
    int sl_GetInfo();

};

есть файл infohard.cpp
Код: (cpp) [Выделить]
#include "infohard.h"

InfoHard::InfoHard(QObject *parent) : QObject(parent)
{

}
int InfoHard::sl_GetInfo()
{
    CoInitialize(NULL);
     if(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
    {
        qDebug() << "Error: CoInitialize";
        return 1;}

    IWbemLocator * pIWbemLocator = NULL;
    IWbemServices * pWbemServices = NULL;
    IEnumWbemClassObject * pEnumObject  = NULL;

    BSTR bstrNamespace = (L"root\\cimv2");

    if(CoCreateInstance (CLSID_WbemAdministrativeLocator, NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IUnknown ,( void ** ) & pIWbemLocator ) != S_OK)
    {return 1;}
    if(pIWbemLocator->ConnectServer( bstrNamespace,  NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices ) != S_OK)
    {
        qDebug() << "Error: ConnectServer";
        return 1;}

    HRESULT hRes;
    BSTR strQuery = (L"Select * from win32_diskdrive");
    BSTR strQL = (L"WQL");
    hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);
    IWbemClassObject * pClassObject = NULL;
    VARIANT v;
     if(hRes != S_OK)
    {
            qDebug() <<"Could not execute Query";
            return 1;
    }
    else
    {
      ULONG uCount = 1, uReturned;
      hRes = pEnumObject->Reset();

      if(hRes != S_OK)
      {
         qDebug() <<"Could not Enumerate";
         return 1;
      }
      while (pEnumObject)
      {
          hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
          if(uReturned==0)
          {
              qDebug() << "End";
             return 1 ;
          }
          BSTR strClassProp = SysAllocString(L"Size");
          hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
          if(hRes != S_OK)
          {
             qDebug() << "Could not Get Value";
             return 1;
          }

          SysFreeString(strClassProp);
          _bstr_t bstrPath = &v;  //Just to convert BSTR to ANSI
          char* strPath=(char*)bstrPath;
          if (SUCCEEDED(hRes))
          {
             qDebug() << strPath << endl;
                  }
          else qDebug() << "Error in getting object";
       }
    }
    VariantClear( &v );
    pIWbemLocator->Release();
    pWbemServices->Release();
    pEnumObject->Release();
    pClassObject->Release();
    CoUninitialize();
  return 0;
}


и есть файл Stuff.cpp из которого я и пытаюсь вызвать sl_GetInfo из файла infohard вот так:
Код: (cpp) [Выделить]
   inf = new InfoHard;
    connect(ui->cmdSaveSettings, SIGNAL(clicked()), inf, SLOT(sl_GetInfo()));
что не так я делаю? где туплю? при таком раскладе выхов sl_GetInfo происходит но прерывается на первой же проверке условия, при этом если просто взять метод вставить в голый проект и откомпилить все прекрасно отработает...:(
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Tonal

  • Любитель
  • *
  • Сообщений: 80
  • Карма Кагью
    • Просмотр профиля
Re: Qt как вызвать правильно метод/слот класса
« Ответ #1 : 08 Сентябрь 2011, 08:37:30 »
Сам же пишешь, что вызов происходит - значит дело не в слоте.
Посмотри, что возвращают CoInitialize и CoInitializeSecurity - возможно инициализация уже где-то прошла.

Да и вообще, странно встречать вопросы о закрытых технологиях COM и WMI от MS на форуме посвящённом Ubuntu - даже скомпилить этот код не выйдет - нет соответствующих подсистем, а стало быть заголовочников и библиотек. :)
Спроси на RSDN, в разделах по Qt, ActiveX, WinApi - там скорее ответят.

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3474
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Qt как вызвать правильно метод/слот класса
« Ответ #2 : 08 Сентябрь 2011, 09:48:13 »
Сам же пишешь, что вызов происходит - значит дело не в слоте.
Посмотри, что возвращают CoInitialize и CoInitializeSecurity - возможно инициализация уже где-то прошла.

Да и вообще, странно встречать вопросы о закрытых технологиях COM и WMI от MS на форуме посвящённом Ubuntu - даже скомпилить этот код не выйдет - нет соответствующих подсистем, а стало быть заголовочников и библиотек. :)
Спроси на RSDN, в разделах по Qt, ActiveX, WinApi - там скорее ответят.
Код как ни странно компилиться :) просто он для Win предназначен и отрабатывать будет только при условии что ОС Win :)
Инициализация нигде пройти неможет так как это единственный метод который этим мается :( ладно буду думать и ковырять...
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Tonal

  • Любитель
  • *
  • Сообщений: 80
  • Карма Кагью
    • Просмотр профиля
Re: Qt как вызвать правильно метод/слот класса
« Ответ #3 : 08 Сентябрь 2011, 12:54:37 »
Либо ты показал не все исходники: ни wbemidl.h ни comdef.h в Linux-ах нет и мактрос Q_OS_WIN32 не определён,
либо ты компилил под виндой. :)
Иначе каким образом ты можешь проверить работоспособность вызовов COM-а?
В любом случае здесь тебе по winapi не помогут. :)

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3474
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Qt как вызвать правильно метод/слот класса
« Ответ #4 : 08 Сентябрь 2011, 13:03:31 »
Либо ты показал не все исходники: ни wbemidl.h ни comdef.h в Linux-ах нет и мактрос Q_OS_WIN32 не определён,
либо ты компилил под виндой. :)
Иначе каким образом ты можешь проверить работоспособность вызовов COM-а?
В любом случае здесь тебе по winapi не помогут. :)
естественно я проверяю под виндой :) не под Lin-ем же WinAPI тестить :) да я думал что может я накосячил с вызовом метода в Qt  но это врятли... ладно нет так нет, пусть тема повесит как решу проблему отпишусь в чем трабл и закрою..
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

 

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