Question Wait-Process interminable

Plus d'informations
il y a 14 ans 2 mois #10932 par Laurent Dardenne
maar écrit:

si tu regardes bien mon script

C'est ce que j'ai fait. D'où ma proposition de solution ou de test.
maar écrit:

je fais bien une release de l'objet com

Oui, mais ton erreur, je l'ai aussi commise, est peut être portée par le nom de la fonction ReleaseComObject.
La signature de cette fonction :
[code:1]function Close_excel_object ($excel_object, $excel_workbook)
[/code:1]
Contient deux paramètres, un objet COM et un truc , $excel_workbook.
Tu considères que ton code libère un objet COM, non il décrémente un compteur de référence.
Si tu passe deux trucs, c'est à dire deux références provenant d'un seul Object COM, ton code doit comporter deux appels à ReleaseComObject.
Lorsque tu modifies un Workbook tu ne modifies pas l'application Excel, mais une 'entité' qu'elle contient.
La terminologie à ici son importance, quand parler d'objet ou d'interface dans un langage dynamique qui veut simplifier les choses au maximum ?

Avec COM, il y a effectivement un seul objet, en quelque sorte un point d'entrée vers une table d'interfaces, mais dotnet masque la compléxité de la techno COM.
En lisant sa documentation , on y trouve ces informations :

Cette méthode est utilisée pour contrôler explicitement la durée de vie d'un objet COM employé à partir d'un code managé. Utilisez cette méthode pour libérer en temps voulu l'objet COM sous-jacent qui contient des références à des ressources ou lorsque des objets doivent être libérés dans un ordre spécifique.

Le décompte de références de ce wrapper pouvant être appelé par le runtime est incrémenté chaque fois qu'un pointeur d'interface COM lui est mappé.

Je te l'accorde le texte est un peu confus, enfin il manque plutot des explications détaillés.En même temps si tu utilises un objet COM, le rédacteur de cette doc peut se dire que le lecteur connait le sujet qu'il manipule. C'est une documentation pas un cours...

A partir d'un objet COM on peut obtenir plusieurs interfaces. Chaque usage d'interface incrémente le compteur de référence. La libération de l'objet COM, qui le père de tous tes problèmes ;-) ,ne peut se faire automatiquement que si son compteur est à zéro.
maar écrit:

Dans cet article on voit bien comment se débarasser du process (ou plus précisement, de l'objet COM).
Et normalement, en procédant comme ils le disent, une fois que powershell à executer l'instruction de release COM, l'instance disparait du gestionnaire des tâche et il n'y a plus de handle donc je peux refaire une nouvelle instance.

Je ne pense pas que ce soit vraiment le cas, ou alors il y a un comportement de Powershell que je ne connaissais pas, dans ce cas ton pb m'aura appris qq chose.
On apprend énormément de choses en aidant les autres :-)

Tu remarqueras que dans le code de l'article que tu cites il n'est créé qu'une seule référence, d'ou un seul appel à ReleaseComObject.


Pour en revenir à ton pb essaie déjà de libérer explicitement TOUTES les références avant de terminer ton traitement.

Si cela ne régle pas ton pb, il sera temps d'aller regarder ailleurs.<br><br>Message édité par: Laurent Dardenne, à: 8/01/12 15:20

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 1 mois #11021 par Laurent Dardenne
Laurent Dardenne écrit:

Si cela ne régle pas ton pb, il sera temps d'aller regarder ailleurs.

Qu'en est-il de ton pb ?
As-tu avancé ? Reculé ? ...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.057 secondes
Propulsé par Kunena