1

イベントを公開するC#コンポーネントを作成しようとしています。コンポーネントは、アンマネージC++アプリケーションによってインポートされます。いくつかのチュートリアルによると、私はこのコードを思いついた(C#側用):

namespace COMTest
{
[ComVisible(true),
Guid("02271CDF-BDB9-4cfe-B65B-2FA58FF1F64B"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITestEvents
{
    void OnTest();
}

[ComVisible(true),
Guid("87BA4D3A-868E-4233-A324-30035154F8A4")]
public interface ITest
{
    void RaiseTest();
} // End of ITest

[ComVisible(true),
Guid("410CD174-8933-4f8c-A799-8EE82AF4A9F2"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ITestEvents))]
public class TestImplimentation : ITest
{
    public TestImplimentation()
    {
    }

    public void RaiseTest()
    {
        if (null != OnTest)
            OnTest();
    }

    public delegate void Test (); //No need to expose this delegate
    public event Test OnTest;
}
}

これで、私のc++コードは単純になりました。

#import "COMTest.tlb" named_guids raw_interfaces_only

tlhファイルを生成します。このtlhファイルには、私のイベント(OnTest)以外のすべてが含まれています。私は間違って何をしていますか?

4

1 に答える 1

3

COMイベントシンクは、初心者にとってはかなり邪悪です。

手順は基本的に

  • 発信(ソース)インターフェイスを作成する
  • IConnectionPointContainerおよびIConnectionPointインターフェイスを実装し、これらを使用してソースインターフェイスのクライアント実装を渡します

幸いなことに、相互運用の名前空間には、これを(ほとんど)自動的に行うのに役立つ属性があります(ComSourceInterfacesAttribute )。ここにその使用法の適切な例があります

于 2009-07-17T01:18:44.863 に答える