2008-10-27 11 views
0

Je développe un ActiveX EXE qui expose une classe spécifique à un logiciel tiers. Ce logiciel tiers instancie un objet de cette classe et utilise ses méthodes. Etrangement, ce logiciel tiers détruit son objet de ma classe exposée dès qu'il appelle une méthode spécifique, mais je ne sais pas pourquoi cela se produit. Le seul indice que j'ai est que cette méthode est la seule qui renvoie une valeur. Tous les autres sont de simples «subs» qui ne renvoient aucune valeur, et quand ils sont appelés, rien de mal ne se passe.Communication ActiveX

J'utilise VB6.

Avez-vous une idée de ce qui se passe?

Répondre

1

Votre objet est "détruit" lorsque la dernière référence est supprimée. C'est un comportement COM normal. Ou votre objet est-il en train de mourir et l'application tierce reçoit une erreur ActiveX?

quelques questions:

  • Je ne sais pas ce que vous entendez par "serveur de données"?
  • Avez-vous accès au code source de l'application tierce?
  • Etes-vous sûr que l'application tierce contient une référence à votre objet?
  • Est-ce que vos objets sont appelés par la méthode Class_Terminate?

EDIT: OK, quand Class_Terminate est s'appeler son évidente, que l'application tiers a baissé sa référence à votre objet.

+0

Il ne doit pas être supprimé car il est un serveur de données à l'application tiers. L'application tierce ne reçoit pas d'erreur. –

+0

Je ne sais pas ce que vous voulez dire par "serveur de données". Avez-vous accès au code source de l'application tierce? Etes-vous sûr que l'application tierce contient une référence à votre objet? Vos objets sont-ils appelés par la méthode Class_Terminate? – Jan

+0

Jan, voici les réponses: - L'application tierce indique à mon ActiveX qu'elle a besoin de données. Après avoir récupéré ces données à partir de services Web, mon ActiveX va renvoyer des données à l'application via une interface de rappel. - Non, je n'ai pas accès au code source de l'application tierce. - Oui, je suis sûr qu'il contient une référence à mon objet, car toutes ses méthodes fonctionnent bien. - Oui, ma méthode 'Class_Terminate' est appelée. –

0

Comme l'indique Jan dans COM, il est normal que votre objet soit terminé si personne ne le référence. Si vous souhaitez effectuer une mise en cache (par exemple, maintenir la connexion DB ouverte), vous pouvez utiliser une variable globale définie dans un bas-module.

basGlobal.bas

Global AGlobalVariable As Object 

Connector.cls

Public Function GetFoo() As Object 
    If AGlobalVariable Is Nothing then 
    Set AGlobalVariable = ... 
    End If 
    Set GetFoo = AGlobalVariable 
End Function 
+0

Je ne peux pas conserver une instance globale car lorsque l'application tierce détruit son instance de mon objet, je dois fermer mon application. Lorsque je le ferme, l'application tierce redémarre mon exe ActiveX. Je sais que c'est étrange, mais lorsque l'objet est détruit, l'application essaie d'en créer une autre, mais se plaint qu'un exx exe précédent est déjà en cours d'exécution. C'est pourquoi je dois le fermer. –