У меня есть простой 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 свойств, слотов и сигналов.
и я использовал следующие в качестве ресурсов и исследований:
how to put IDispatch* in managed code
How to fire c# COM events in c++?
и больше; Пожалуйста помоги!
Не зная ничего о сгенерированном файле .h, это звучит так, что слишком большая часть вашей реализации видна. Тип CompletedDelegate не должен быть видимым вообще. Проект> Свойства> вкладка «Приложение»> «Информация о сборке» и отключите опцию «Сделать сборку COM-видимой». Примените атрибут [ComVisible (true)] только к объявлениям, которые должны быть видимыми, интерфейсам и классу. Или примените [ComVisible (false)] к делегату. –
Спасибо @HansPassant, который зафиксировал натиск ошибок, с которыми я столкнулся. Пока он будет компилироваться, и я могу вызвать метод _Add (int, int) _, я все еще не могу и не знаю, как создать экземпляр и получить доступ к событию _Completed_. Я попытался подключиться (& eventClass, SIGNAL (Completed()), это, SLOT (test())); ', но это не кажется правильным. В частности, ошибка, которую я получаю: ** QObject :: connect: Нет такого сигнала MyEventClassLibrary :: Calculator :: Completed() ** – Anduril28
Вы знаете решение этого вопроса. Итак, заполните Q + A, отправив ответ и принимая его. Затем нажмите кнопку «Спросить вопрос», чтобы обратиться за помощью к следующей проблеме. –