2009-07-17 6 views
1

J'essaye d'écrire un composant C# qui exposera des événements. Le composant doit être importé par une application C++ non gérée. Selon quelques tutoriels que je suis venu avec ce code (pour le côté C#): CodeÉvénements de composant 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; 
} 
} 

Maintenant, mon C++ a un simple:

#import "COMTest.tlb" named_guids raw_interfaces_only 

Ce qui génère un fichier TLH. Ce fichier tlh contient tout sauf mon événement (OnTest). Que fais-je incorrectement?

Répondre

3

Les récepteurs d'événements COM sont plutôt malfaisants pour les non-initiés.

Les étapes sont essentiellement

  • créer une interface de sortie (source)
  • Mettre en oeuvre un IConnectionPointContainer et IConnectionPoint Interfaces, utiliser ceux-ci pour passer d'une application de client de la source Interface

Le bonne nouvelles est que dans le namespac interop e il existe des attributs pour vous aider à le faire (la plupart du temps) automatiquement (ComSourceInterfacesAttribute) Il existe un exemple décent de son utilisation here.

+0

Merci, mais c'est exactement ce que je fais dans mon exemple, ça ne marche pas. – Kyle

+0

J'ai ce travail. Je n'ai pas réalisé que le fichier tlh ne générerait que des informations pour les classes que j'utilisais. Dès que j'ai fait hériter ma classe C++ de la classe ITestEvents, tout a commencé à fonctionner correctement. Merci pour l'information. – Kyle