2016-09-26 5 views
3

私はこのようになりますシンプルなC#のCOM見えライブラリがあります。QTでC#COMイベントを処理するには?

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

と私の mainwindow.cpp:私はそれを登録して、私はQTに.TLBをインポートする必要があり

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; 
    } 
}} 

をファイルには、次のようになります。

#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を取得します線に沿ってのUE:上記のデリゲートに[のComVisible(偽)]を追加することで解決されてい

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

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

(詳細はコメントを参照してください)

コードを実行すると、次のエラーが発生します。

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_イベントをインスタンス化してアクセスする方法が不明です。私は 'connect(&eventClass、SIGNAL(Completed())、this、SLOT(test()));'を試みましたが、それは正しいとは思われません。 具体的には、次のエラーが発生します。** QObject :: connect:そのようなシグナルがありません。MyEventClassLibrary :: Calculator :: Completed()** – Anduril28

+0

この問題の解決方法を知っていますか?だからQ + Aを記入して答えを受け取り、それを受け入れる。その後、[質問する]ボタンをクリックして、次の問題のヘルプを求めます。 –

答えて

1

この質問はQTで火にC#COM-見えるイベントを取得することを目的に、2部構成の質問があった:私は、最初はQtアプリケーションを構築した場合

  1. 、私は40以上のエラーを得ていましたデリゲートが表示されているためです。 これは、デリゲート宣言の上に[ComVisible(false)]を追加することによって解決されました @HansPassantありがとうございます。

  2. これが解決されたときに、COM信号にSLOTを接続しようとしましたが、完了イベントが見つかりませんでした。 これは、関数のプロトタイプをマッチングすることによって解決されました。完了したパラメータはであり、をスロット機能に含めていませんでした。(DERP)を接続し、元のマイ

た:

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

それがされている必要があります:

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

ありがとう!

関連する問題