Question Problème avecun objet COM
- Michel Claveau
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 16 ans 2 mois #1748
par Michel Claveau
Problème avecun objet COM a été créé 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
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.
- Michel Claveau
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 16 ans 2 mois #1754
par Michel Claveau
Réponse de Michel Claveau sur le sujet Re:Problème avecun objet COM
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 \"late binding\".
Solution (partielle) : pour contourner cette limite, j'ai eu l'idée de passer par un \"pont\". 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 = \"ABCD\"«») {
$vbs = new-object -com MSScriptControl.ScriptControl
$vbs.language = 'vbscript'
$VBS.ExecuteStatement('Set px = CreateObject(\"ponx.Mci\"«»)')
$ret = $VBS.eval('px.PVersion()')
return $ret
}
Test-Ponx(\"AAAA\"«»)
[/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.
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 \"late binding\".
Solution (partielle) : pour contourner cette limite, j'ai eu l'idée de passer par un \"pont\". 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 = \"ABCD\"«») {
$vbs = new-object -com MSScriptControl.ScriptControl
$vbs.language = 'vbscript'
$VBS.ExecuteStatement('Set px = CreateObject(\"ponx.Mci\"«»)')
$ret = $VBS.eval('px.PVersion()')
return $ret
}
Test-Ponx(\"AAAA\"«»)
[/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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Problème avecun objet COM