OVH Cloud OVH Cloud

COM dymanique

3 réponses
Avatar
Michel Claveau
Bonsoir !

C'est ma première visite sur ce newsgroup. Donc, d'abord, je salue tous
les contributeurs et lecteurs.

Ma question concerne l'utilisation (l'appel), avec C#, d'un serveur COM
dynamique. Il s'agit d'un logiciel que j'ai développé en Python, et qui
m'apporte beaucoup de fonctionnalités, dans Paradox, Word, Excel, IE,
VBscript, Jscript, AutoIt, Ruby, etc.

Je ne trouve aucun moyen d'appeler ce composant.

On m'a suggéré d'ajouter une référence au projet. J'ai donc installé
Visual_C#_Express ; mais le browser ne trouve pas le serveur COM.

On m'a recommandé l'utilisation de TBLIMP.exe ; mais le serveur COM n'a
pas de TLB (je rappelle qu'il s'agit d'un serveur COM DYNAMIQUE).

On m'a conseillé de créer un RCW. Mais, comment déclarer des fonctions
dynamiques ?

J'ai également essayé, sans plus de succès, avec IronPython.


Bref, je commence à avoir des doutes sur la capacité de C# (ou de
dotNET) d'utiliser des objets COM non statiques.


Toute suggestion sera la bienvenue, qui me permettra d'évaluer C#

Merci d'avance.

--
@-salutations

Michel Claveau

3 réponses

Avatar
Remi Thomas - MVP
"Michel Claveau"écrivit
Bonsoir !

C'est ma première visite sur ce newsgroup. Donc, d'abord, je salue tous
les contributeurs et lecteurs.

Ma question concerne l'utilisation (l'appel), avec C#, d'un serveur COM
dynamique. Il s'agit d'un logiciel que j'ai développé en Python, et qui
m'apporte beaucoup de fonctionnalités, dans Paradox, Word, Excel, IE,
VBscript, Jscript, AutoIt, Ruby, etc.

Je ne trouve aucun moyen d'appeler ce composant.

On m'a suggéré d'ajouter une référence au projet. J'ai donc installé
Visual_C#_Express ; mais le browser ne trouve pas le serveur COM.

On m'a recommandé l'utilisation de TBLIMP.exe ; mais le serveur COM n'a
pas de TLB (je rappelle qu'il s'agit d'un serveur COM DYNAMIQUE).

On m'a conseillé de créer un RCW. Mais, comment déclarer des fonctions
dynamiques ?

J'ai également essayé, sans plus de succès, avec IronPython.


Bref, je commence à avoir des doutes sur la capacité de C# (ou de dotNET)
d'utiliser des objets COM non statiques.


Toute suggestion sera la bienvenue, qui me permettra d'évaluer C#

Merci d'avance.

--
@-salutations

Michel Claveau





Bonjour,

Ce que tu désires faire s'appelle du Late Binding (cela aide pour Google).
Regardes du coté de GetTypeFromProgID et InvokeMember.

Cela donne par exemple
Type outlookType = Type.GetTypeFromProgID("Outlook.Application");
Object outlookApp = Activator.CreateInstance(outlookType);

BindingFlags flags = BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance;
object[] paramArray = new object[]{0};
Object mailItem = outlookType.InvokeMember("CreateItem", flags |
BindingFlags.InvokeMethod, null, outlookApp, paramArray);

Rémi
Avatar
Michel Claveau
Bonsoir !

Merci pour cette piste, que je vais explorer, dès que j'ai un peu de
temps.

--
@-salutations

Michel Claveau
Avatar
Michel Claveau
Re

Pour info, voici, ci-dessous, mon premier code qui fonctionne.

@-salutations

Michel Claveau

--------------------------------------------------------------------



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, System.EventArgs e)
{
object objApp_Late;
object pver;

try
{
Type objClassType;
objClassType = Type.GetTypeFromProgID("ponx.Mci");
objApp_Late = Activator.CreateInstance(objClassType);


pver = objApp_Late.GetType().InvokeMember("version",
BindingFlags.GetProperty, null, objApp_Late, null);

MessageBox.Show(pver.ToString(), "Version de Ponx : ");


pver = objApp_Late.GetType().InvokeMember("PVersion",
BindingFlags.InvokeMethod, null, objApp_Late, null);

MessageBox.Show(pver.ToString(), "Version de Ponx : ");
}
catch( Exception theException )
{
String errorMessage;
errorMessage = "Erreur: ";
errorMessage = String.Concat(errorMessage,
theException.Message);
errorMessage = String.Concat(errorMessage, " Line: ");
errorMessage = String.Concat(errorMessage,
theException.Source);
MessageBox.Show(errorMessage, "Erreur en appelant
Ponx");
}
}
}
}