Question Problème avecun objet COM

Plus d'informations
il y a 16 ans 2 mois #1748 par Michel Claveau
Bonsoir !

En commençant à tester PowerShell, je tombe sur un problème.
J'ai un serveur-COM puissant, que j'utilise avec beaucoup de langages. Mais, impossible d'y accéder avec PowerShell.

Voici mon code PowerShell : [code:1]
$px = New-object -ComObject Ponx.Mci
$px.PVersion()
L'appel de la méthode a échoué parce que [System.__ComObject] ne contient pas d
e méthode nommée « PVersion ».
Au niveau de ligne : 1 Caractère : 13
+ $px.PVersion( <<<< )[/code:1]

Pour info, voici le code VBscript équivalent, qui fonctionne : [code:1]
Set px = WScript.CreateObject(\"Ponx.Mci\")
WScript.echo px.PVersion()[/code:1]
La version Python : [code:1]
import win32com.client
px = win32com.client.Dispatch('Ponx.Mci')
print px.PVersion()
[/code:1]
La version JScript : [code:1]
var ponx = new ActiveXObject(\"Ponx.Mci\");
WScript.Echo(ponx.PVersion());[/code:1]
Et enfin, le version en Ruby:[code:1]
require 'win32ole'
ponx = WIN32OLE.new('Ponx.Mci')
print ponx.PVersion()[/code:1]

Au cas où, j'ai d'autres exemples de code, en Perl, en VBA, en C#, en RealBasic, en ObjectPAL, etc.

Toutes les versions fonctionnent, à l'exception de celle en PowerShell.

Si quelqu'un pouvait me donner une solution, et, éventuellement, une explication, je l'en remercie d'avance.

Message édité par: MClaveau, à: 22/02/08 20:54<br><br>Message édité par: MClaveau, à: 22/02/08 20:56

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

Plus d'informations
il y a 16 ans 2 mois #1754 par Michel Claveau
Bonjour !

Personne pour répondre ? Dommage.
Mais, j'ai quand même trouvé une explication, et une solution.

L'explication : PowerShell n'est pas capable d'utiliser les objets-COM non statiquement déclarés. En clair, PowerShell ne peut pas/sait pas utiliser le \&quot;late binding\&quot;.

Solution (partielle) : pour contourner cette limite, j'ai eu l'idée de passer par un \&quot;pont\&quot;. J'ai choisi MSScriptControl.ScriptControl et VBscript. C'est un serveur COM statique, avec une TLB, mais qui utilise, par défaut IDispatch (late binding) pour ses appels à d'autres serveurs COM.

Voici le code qui fonctionne :
[code:1]
Function Test-Ponx($param = \&quot;ABCD\&quot;«») {
$vbs = new-object -com MSScriptControl.ScriptControl
$vbs.language = 'vbscript'
$VBS.ExecuteStatement('Set px = CreateObject(\&quot;ponx.Mci\&quot;«»)')
$ret = $VBS.eval('px.PVersion()')
return $ret
}

Test-Ponx(\&quot;AAAA\&quot;«»)
[/code:1]

OK, ce n'est pas terrible, comme démarche, et ce n'est pas complet (pas de support des serveurs COM dynamiques). Mais, c'est un début.

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

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