Bonjour,

J'essaye de rendre une DLL compatible COM pour qu'elle fonctionne en VB6. Les méthodes fonctionnent, par contre pour les évents, la réponse se fait uniquement si elle est immédiate dans la fonction. Par contre s'il a un passage dans une autre classe, lors du retour, le delegate est toujours nul. Ceci en VB6, en cas d'utilisation de la dll en C#, aucun probleme au niveau des évents.


Par exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
 
public interface IMathEvents {
 
    void OnOperationCompleted(string message);
 
}
 
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IMathEvents))]
 
public class Math : ServicedComponent , IMath  
  {
  public int Add(int x, int y) {
 
    if (null != this.OnOperationCompleted)
    this.OnOperationCompleted("Operation completed");
 
    return x + y;
}
 
[ComVisible(false)]
public delegate void OperationCompletedDel(string message); 
public event OperationCompletedDel OnOperationCompleted;
 
}
Marchera en cas d'appel depuis le vb6 mais si je modifie la classe Math comme ci dessous

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
public class Math : ServicedComponent , IMath  
  {
  public int Add(int x, int y) {
 
    WorkinAnotherClass(x,y);   
 
    return x + y;
}
 
public void ReturnEvent()
  {
  // OnOperationCompleted sera toujours null
  if (null != this.OnOperationCompleted)
    this.OnOperationCompleted("Operation completed");
  }
je reçois plus l’évent qui est activé par ReturnEvent lorsqu'il a fini le traitement depuis une autre classe.

D’où mon interrogation, la liaison COM entre le vb6 et ma dll ne fonctionne t-il que le temps de l'appel de la procédure (Add pour l'exemple) ?