Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

chargement dynamique d'ActiveX dans une Form

1 réponse
Avatar
Emmanuel Thiry
Salut,

Dans mon programme C# , j'ai une Form qui contient un UserControl qui
contient un TabControl dont chaque TabPage contient un ActiveX (il y en a 4
différents).
Je n'ai pas souhaité importer les ActiveX dans Visual Studio. A la place,
j'ai utilisé aximp.exe sur chaque Fichier.ocx pour générer les dll
Fichier.dll et AxFichier.dll qui feront l'interface entre l'ActiveX et le
.NET. Ensuite j'ai copié toutes ces dll dans un dossier et la méthode Load
du UserControl va parcourir ce dossier et charger les ActiveX.
Voici l'extrait du code qui fait cela :

foreach (String fileOn in Directory.GetFiles(workingDirectory))
{
FileInfo file = new FileInfo(fileOn);
if (file.Extension.Equals(".dll"))
{
Assembly ass = Assembly.LoadFrom(fileOn);
if (ass != null)
{
try
{
foreach (Type type in ass.GetTypes())
{
if (type.IsSubclassOf(typeof(AxHost)))
{
ConstructorInfo ci =
type.GetConstructor(Type.EmptyTypes);
if (ci != null)
{
AxHost ocx = (AxHost)ci.Invoke(null); // AA
try
{
TabPage page = new TabPage(file.Name);
page.AutoScroll = true;
ocx.Dock = DockStyle.Fill;
page.Controls.Add(ocx);

tabControl.TabPages.Add(page); // BB

}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}
}
catch (ReflectionTypeLoadException ex)
{
...
}
}
}
}

Ca marche bien, mes ActiveX apparaissent bien dans leurs onglets respectifs.
Mais il y a un problème. Dans une autre fonction, j'appelle des fonctions
membres des ActiveX pour les initialiser. Cette initialisation marche bien
avec le premier ActiveX, mais échoue avec les suivants, avec une exception
de type 'System.Windows.Forms.AxHost+InvalidActiveXStateException'. Notez
que c'est indépendant des ActiveX : si j'en ajoute ou retire ou si je change
l'ordre, seul le premier passe bien.

J'ai remarqué un point important. La propriété ocx.OcxState est initialement
null à la création de l'objet ocx (ligne AA). Avec le debugger, j'ai vu
qu'elle devenait non-null pour le premier ocx à la ligne BB. Pour tous les
autres ActiveX, la propriété ocx.OcxState reste null après la ligne BB.

J'aimerais bien comprendre pourquoi ça ne marche qu'avec le premier ActiveX.
Si vous avec une idée, ça m'intéresse.
Merci

Manu

1 réponse

Avatar
Gilles TOURREAU
Le Fri, 05 Oct 2007 17:53:31 +0200, Emmanuel Thiry a écrit:

Salut,

Dans mon programme C# , j'ai une Form qui contient un UserControl qui
contient un TabControl dont chaque TabPage contient un ActiveX (il y en
a 4
différents).
Je n'ai pas souhaité importer les ActiveX dans Visual Studio. A la place,
j'ai utilisé aximp.exe sur chaque Fichier.ocx pour générer les dll
Fichier.dll et AxFichier.dll qui feront l'interface entre l'ActiveX et le
.NET. Ensuite j'ai copié toutes ces dll dans un dossier et la méthode
Load
du UserControl va parcourir ce dossier et charger les ActiveX.
Voici l'extrait du code qui fait cela :

foreach (String fileOn in Directory.GetFiles(workingDirectory))
{
FileInfo file = new FileInfo(fileOn);
if (file.Extension.Equals(".dll"))
{
Assembly ass = Assembly.LoadFrom(fileOn);
if (ass != null)
{
try
{
foreach (Type type in ass.GetTypes())
{
if (type.IsSubclassOf(typeof(AxHost)))
{
ConstructorInfo ci > type.GetConstructor(Type.EmptyTypes);
if (ci != null)
{
AxHost ocx = (AxHost)ci.Invoke(null); //
AA
try
{
TabPage page = new TabPage(file.Name);
page.AutoScroll = true;
ocx.Dock = DockStyle.Fill;
page.Controls.Add(ocx);

tabControl.TabPages.Add(page); // BB

}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}
}
catch (ReflectionTypeLoadException ex)
{
...
}
}
}
}

Ca marche bien, mes ActiveX apparaissent bien dans leurs onglets
respectifs.
Mais il y a un problème. Dans une autre fonction, j'appelle des fonctions
membres des ActiveX pour les initialiser. Cette initialisation marche
bien
avec le premier ActiveX, mais échoue avec les suivants, avec une
exception
de type 'System.Windows.Forms.AxHost+InvalidActiveXStateException'. Notez
que c'est indépendant des ActiveX : si j'en ajoute ou retire ou si je
change
l'ordre, seul le premier passe bien.

J'ai remarqué un point important. La propriété ocx.OcxState est
initialement
null à la création de l'objet ocx (ligne AA). Avec le debugger, j'ai vu
qu'elle devenait non-null pour le premier ocx à la ligne BB. Pour tous
les
autres ActiveX, la propriété ocx.OcxState reste null après la ligne BB.

J'aimerais bien comprendre pourquoi ça ne marche qu'avec le premier
ActiveX.
Si vous avec une idée, ça m'intéresse.
Merci

Manu





Pour optimiser les ressources et le chargement des Forms, les onglets sous
.NET charge les contrôles uniquement à l'affiche de la page qui leur sont
associé.
Par "chargement" je veux dire création de l'handle,...etc.

Dans votre cas vous devez afficher toutes les pages au chargement de votre
Form à l'aide d'une boucle afin d'initialiser tous vos ActiveX.

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr