2016-09-26 3 views
3

У меня есть простой C# COM видимую библиотека, которая выглядит следующим образом:Как обрабатывать C# COM-события в QT?

namespace MyEventClassLibrary { 

[Guid("0ab09e18-bf85-48c8-a45d-a0cebed77a5c")] 
public interface ICalculator 
{ 
    int Add(int Num1, int Num2); 
} 

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
[Guid("9e09b634-8c1a-4926-83b2-f6f988595c85")] 
public interface ICalculatorEvents 
{ 
    [DispId(1)] 
    void Completed(int Result); 
} 

[ClassInterface(ClassInterfaceType.None)] 
[ComSourceInterfaces(typeof(ICalculatorEvents))] 
[Guid("6cebc4db-2e8f-4e24-91a5-24ffdf97fc6a")] 
public class Calculator : ICalculator 
{ 
    [ComVisible(false)] 
    public delegate void CompletedDelegate(int result); 

    public event CompletedDelegate Completed; 

    public int Add(int Num1, int Num2) 
    { 
     int Result = Num1 + Num2; 
     if (Completed != null) 
      Completed(Result); 

     return Result; 
    } 
}} 

Я его зарегистрировал, и я импортировать .TLB в QT с:

TYPELIBS = ..\MyEventClassLibrary\MyEventClassLibrary\bin\Debug\MyEventClassLibrary.tlb 

и мой mainwindow.cpp файл выглядит следующим образом:

#include <QDebug> 
#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "myeventclasslibrary.h" 

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

    MyEventClassLibrary::Calculator eventClass; 
    connect(&eventClass, SIGNAL(Completed()), this, SLOT(test())); 

    qDebug() << eventClass.Add(1,2); 
} 

void MainWindow::test() 
{ 
    qDebug() << "Here"; 
} 

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

Когда я построить проект в QT, хотя, я получаю 40+ ISS ЕЭС вдоль линий:

MyEventClassLibrary.h:144: error: C2535: 'MyEventClassLibrary::CompletedDelegate::CompletedDelegate(void)': member function already defined or declared 

и

MyEventClassLibrary.h:147: error: C2065: 'iface': undeclared identifier 

выше была решена путем добавления [ComVisible (ложь)] делегату (см комментарии для получения дополнительной информации)

При запуске кода я получаю сообщение об ошибке:

QObject::connect: No such signal MyEventClassLibrary::Calculator::Completed() 

Мой вопрос: Как вы обрабатываете события/делегаты в COM и QT?

В качестве справочной информации, документации QT говорит:

Если объект COM реализует интерфейс IDispatch, свойства, методы и события этого объекта становятся доступны как Qt свойств, слотов и сигналов.

и я использовал следующие в качестве ресурсов и исследований:

Handle C# COM events in C++

how to put IDispatch* in managed code

How to fire c# COM events in c++?

и больше; Пожалуйста помоги!

+0

Не зная ничего о сгенерированном файле .h, это звучит так, что слишком большая часть вашей реализации видна. Тип CompletedDelegate не должен быть видимым вообще. Проект> Свойства> вкладка «Приложение»> «Информация о сборке» и отключите опцию «Сделать сборку COM-видимой». Примените атрибут [ComVisible (true)] только к объявлениям, которые должны быть видимыми, интерфейсам и классу. Или примените [ComVisible (false)] к делегату. –

+0

Спасибо @HansPassant, который зафиксировал натиск ошибок, с которыми я столкнулся. Пока он будет компилироваться, и я могу вызвать метод _Add (int, int) _, я все еще не могу и не знаю, как создать экземпляр и получить доступ к событию _Completed_. Я попытался подключиться (& eventClass, SIGNAL (Completed()), это, SLOT (test())); ', но это не кажется правильным. В частности, ошибка, которую я получаю: ** QObject :: connect: Нет такого сигнала MyEventClassLibrary :: Calculator :: Completed() ** – Anduril28

+0

Вы знаете решение этого вопроса. Итак, заполните Q + A, отправив ответ и принимая его. Затем нажмите кнопку «Спросить вопрос», чтобы обратиться за помощью к следующей проблеме. –

ответ

1

Этот вопрос был 2 части вопроса, с целью получения C# COM-видимый событие пожар в QT:

  1. Когда я первоначально построил приложение QT, я получал 40+ ошибки из-за видимости делегата. Это было разрешено добавлением [ComVisible (false)] над объявлением делегата Спасибо @HansPassant.

  2. Когда это было разрешено, я попытался подключить SLOT к COM SIGNAL, при этом QT заявила, что не может найти Завершено событие. Это было разрешено путем сопоставления прототипов функций; Завершено параметр int, я не включил int в функцию SLOT.(Derp)

Мои оригинальные подключения был:

connect(&eventClass, SIGNAL(Completed()), this, SLOT(test())); 

это должно было быть:

connect(&eventClass, SIGNAL(Completed(int)), this, SLOT(test(int))); 

Спасибо!

Смежные вопросы