begin process at 2013 06 19 19:58:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.Net

 > INTEROP XCHAT / .NET : CHARGEUR DE PLUGINS MANAGÉS

INTEROP XCHAT / .NET : CHARGEUR DE PLUGINS MANAGÉS


 Information sur la source

Note :
Aucune note
Catégorie :.Net Source .NET ( DotNet ) Classé sous :interop, AppDomain, Plugin, Xchat Niveau :Initié Date de création :30/01/2008 Date de mise à jour :30/01/2008 18:51:01 Vu / téléchargé :14 285 / 102

Auteur : TeBeCo

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Tout d'abord il s'agit de ma toutes première source en C++ / C++ CLI, pas en tant que source posté sur ce réseau mais étant la première fois que j'utilise ce langage disons de manière "normal"

Qu'est ce que c'est : Ce code est une dll C++ CLI pouvant être chargé dans XChat en tant que plugin.
Pourquoi cette source : Actuellement XChat ne gère pas les plugin de type .Net

J'aurais pu faire une source banale en C++ CLI présentant les points d'entrés requis pour XChat et montrer qu'il est possible de faire des appels .Net avec.

J'ai été un petit peu plus loin dans le developpement de cette source :
Ce code permet lui même de chargé des assembly .net et fait l'interop entre Xchat et "n" plugins managés

Ce code inclus 3 dll :
* La dll d'interop entre XChat et les appel managé disons => "XChatInterop.dll"
celle ci a une commande "/DotNetManager" permettant d'ouvrir un formulaire de gestion des plugins .Net
* Une dll d'interfacage entre cette dites dll d'interop et les plugins => "PluginInterface.dll" contenant les interfaces, type, delegué ect ... decrivant les "standards" de communication
* Une derniere dll => "PluginXchatDotNet.dll" celle ci m'a servis de banc d'essais et sert en qq sorte a illustrer le fonctionnement basique du projet

Je n'ai pas encore testé dans son integralité ou essayé de poussé les plugin pour voir ce que cela pouvait supporté pour le moment

Ce code se sert des AppDomain de .net permettant de charger et decharger a chaud les assembly en mémoire cela peux expliquer un code qui semble etre lourd, mais qui au final ne l'est pas tant que ca.

(voir la conclusion pour l'utilisation de ce projet)

Source

  • // Il s'agit du fichier DLL principal.
  • #include "stdafx.h"
  • #include "xchat-plugin.h"
  • #include "XChatInterop.h"
  • #include "frmManager.h"
  • #include "DomainInformation.h"
  • #include "AppDomainUpdater.h"
  • #include <string.h>
  • #include <stdlib.h>
  • #include <stdio.h>
  • #include <malloc.h>
  • #define NAME "DotNet Plugins Manager"
  • #define DESC "Admit you to Load/Unload DotNet Plugins"
  • #define VERSION "1.0"
  • using namespace System;
  • using namespace System::Diagnostics;
  • using namespace System::Windows::Forms;
  • using namespace XChatInterop;
  • xchat_hook * cmdDotNetManager; /* Hook de la commande "DotNetManager" pour ouvrir "frmManager" */
  • static xchat_plugin *ph; /* plugin handle */
  • //Déclaration des fonctions du fichier
  • extern "C" __declspec( dllexport ) int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg);
  • extern "C" __declspec( dllexport ) int xchat_plugin_deinit(void);
  • static int DotNetManager(char *word[], char *word_eol[], void *userdata);
  • //Point d'entré du plugin
  • int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg)
  • {
  • ph = plugin_handle;
  • *plugin_name= NAME;
  • *plugin_desc=DESC;
  • *plugin_version=VERSION;
  • //Change le "BaseDirectory" de l'AppDomain pour qu'il correspondent a celui ou est la dll de ce plugin
  • AppDomainUpdater^ CurrentAppDomainUpdater = gcnew AppDomainUpdater(AppDomain::CurrentDomain);
  • CurrentAppDomainUpdater->BaseDirectory = Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location);
  • //Met en place le hook pour la commande "DotNetManager"
  • cmdDotNetManager = xchat_hook_command(ph, "DotNetManager", XCHAT_PRI_NORM, DotNetManager, "Usage: DOTNETMANAGER, Show the window manager.", 0);
  • //Le chargement c'est apparement bien passé
  • xchat_print(ph, "DotNet Plugins Manager loaded succefully\n");
  • return 1;
  • }
  • //Appelé au déchargement
  • int xchat_plugin_deinit()
  • {
  • //Enlève le hook de la commande "DotNetManager"
  • xchat_unhook(ph, cmdDotNetManager);
  • DomainInformation::UnloadAll();
  • //Déchargement finis
  • xchat_print(ph, "DotNet Plugins Manager unloaded succefully!\n");
  • return 1;
  • }
  • //Appelé quand qqun execute la commande "/DotNetManager"
  • static int DotNetManager(char *word[], char *word_eol[], void *userdata)
  • {
  • frmManager^ Manager = gcnew frmManager();
  • //Ouvre le manager en specifiant le "Process::GetCurrentProcess()->MainWindowHandle" c'est a dire le handle de Xchat comme parent
  • //et en le wrappant avec la classe "MainWindowWrapper" afin de pouvoir le caster en "IWin32Window" requis pour la methode "Show"
  • Manager->Show((IWin32Window^)(gcnew MainWindowWrapper(Process::GetCurrentProcess()->MainWindowHandle)));
  • //Propre a ce plugin
  • return XCHAT_EAT_ALL;
  • }
  • //Assesceur de "ph"
  • xchat_plugin * GetPh()
  • {
  • return ph;
  • }
// Il s'agit du fichier DLL principal.
#include "stdafx.h"
#include "xchat-plugin.h"
#include "XChatInterop.h"
#include "frmManager.h"
#include "DomainInformation.h"
#include "AppDomainUpdater.h"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

#define NAME "DotNet Plugins Manager"
#define DESC "Admit you to Load/Unload DotNet Plugins"
#define VERSION "1.0"

using namespace System;
using namespace System::Diagnostics;
using namespace System::Windows::Forms;
using namespace XChatInterop;

xchat_hook * cmdDotNetManager; /* Hook de la commande "DotNetManager" pour ouvrir "frmManager" */
static xchat_plugin *ph;   /* plugin handle */

//Déclaration des fonctions du fichier
extern "C" __declspec( dllexport ) int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg);
extern "C" __declspec( dllexport ) int xchat_plugin_deinit(void);
static int DotNetManager(char *word[], char *word_eol[], void *userdata);

//Point d'entré du plugin
int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg)
{
	ph = plugin_handle;
	*plugin_name= NAME;
	*plugin_desc=DESC;
	*plugin_version=VERSION;

	//Change le "BaseDirectory" de l'AppDomain pour qu'il correspondent a celui ou est la dll de ce plugin
	AppDomainUpdater^ CurrentAppDomainUpdater = gcnew AppDomainUpdater(AppDomain::CurrentDomain);
	CurrentAppDomainUpdater->BaseDirectory = Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location);

	//Met en place le hook pour la commande "DotNetManager"
	cmdDotNetManager = xchat_hook_command(ph, "DotNetManager", XCHAT_PRI_NORM, DotNetManager, "Usage: DOTNETMANAGER, Show the window manager.", 0);

	//Le chargement c'est apparement bien passé
	xchat_print(ph, "DotNet Plugins Manager loaded succefully\n");

	return 1;
}

//Appelé au déchargement
int xchat_plugin_deinit()
{
	//Enlève le hook de la commande "DotNetManager"
	xchat_unhook(ph, cmdDotNetManager);

	DomainInformation::UnloadAll();


	//Déchargement finis
	xchat_print(ph, "DotNet Plugins Manager unloaded succefully!\n");

	return 1;
}
//Appelé quand qqun execute la commande "/DotNetManager"
static int DotNetManager(char *word[], char *word_eol[], void *userdata)
{
	frmManager^ Manager = gcnew frmManager();
	//Ouvre le manager en specifiant le "Process::GetCurrentProcess()->MainWindowHandle" c'est a dire le handle de Xchat comme parent
	//et en le wrappant avec la classe "MainWindowWrapper" afin de pouvoir le caster en "IWin32Window" requis pour la methode "Show"
	Manager->Show((IWin32Window^)(gcnew MainWindowWrapper(Process::GetCurrentProcess()->MainWindowHandle)));

	//Propre a ce plugin
	return XCHAT_EAT_ALL;
}



//Assesceur de "ph"
xchat_plugin * GetPh()
{
	return ph;
}

 Conclusion

Si il y a  des erreur dans la programmation que ca soit dans le "standard" de la syntaxe ou des mauvaise utilisation ou autre n'hesiter pas a m'en faire par en commentaire ici.

Documentation supplémentaire :
http://www.xchat.org/docs/plugin20.html

Utilisat ion :

* Installer VS.Net (avec au moins la prise en charge C++.net et pourquoi pas C#, VB.net)
* Installer Xchat
* Créer un projet .net avec "PluginInterface" dans les Références (mais pas besoin de "XChatInterop") cela est volontaire
* Créer une classe qui herite de "MarshalByRefObject" et qui implémente "PluginInterface.IManagedPlugin"
* Implementer toutes les methode requise bien entendu
* Implémenter "PluginInterface.IOptions" (Facultatif) : cela permet d'activé le bouton "Options" de la fenêtre de config
* Pour le debug il faut aller dans les options du projet et indiquer Xchat.exe en tant que programme a lancer, pas besoin d'argument supplementaire
en toute logique cela va simplement lancer Xchat rien de plus
* les point d'arret que vous aurez mis seront marquer comme ne pouvant etre déclenché cela est parfaitement normal il vous suffira d'aller dans le menu "Fenetre > Greffons et scripts" puis charger "XChatInterop.dll"
* Tapper "/DotNetManager" une fois le chargement fini et enfin charger votre dll .net



ATTENTION il ne faut pas oublier :
* Que les dll soient absolument toutes dans le même repertoire pour des question de typage entre assembly (ou alros les enregistrer dans le GAC et changer legerement le code)

* et ne pas oublier d'overrider :
//C# :
//Durée de vie du service infini
public override object InitializeLifetimeService()
{
    return null;
}

//C++.Net :
virtual Object^ InitializeLifetimeService() override
{
    return nullptr;
}

La valeur "null" specifie que la durée du service est infini, pour plus de detail se reporter dans la doc MSDN a la fonction : "InitializeLifetimeService" de la classe "MarshalByRefObject"


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

30 janvier 2008 18:51:03 :
mise à jour de la description et conclusion de cette page

 Sources de la même categorie

Source avec Zip Source avec une capture JEU CRACK BULLE EN DEVC++ ET WINBGIM par relet
Source avec Zip Source avec une capture ANALYSEUR LEXICAL par Donald180v
Source avec Zip Source avec une capture MAP_MAKER_JEU par seekplus
Source avec Zip Source avec une capture Source .NET (Dotnet) EMISSION D'UN OCTET SUR LE PORT SÉRIE - CLASSE SERIALPORT par jmchatelet01
Source avec Zip Source .NET (Dotnet) RESOLV EQU DE DEGRES N par darckangel731

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Utiliser un plugin (en dll) [ par CyberP ] Comment utiliser un plugin ? Le charger et utiliser les fonctions qui sont à l'intérieur ?Je compile un fichier en dll avec une fonction "dire_bonjour ecrire un plugin pour outlook (ou addin) [ par pqmoltonel ] bonjour a tousje voudrais ecrire un plugin pour outlookqui ajoute un mode de connexion (au meme titre que imap, pop, exchange)je ne sais vraiment pas plugin [ par dletozeun ] bonjour,J'aimerais faire un prog capable de charger des dll qu'il detecterais automatiquement...Mais si ces dll lui sont inconnu lors de sa compilatio plugin : pb conversion [ par Horfee ] Je m'interesse depuis peu aux plugins et leur utilisation. Donc j'ai trouv&#233; comment les charger : #include &lt;windows.h&gt; int main() { HMODUL activeX et plugin [ par darkkinj ] Bonjour, je tente de porter un activeX cod&#233; en C++ sous forme de plugin pour firefox, est-ce que c'est possible? Il existe un plugin pour firefox Plugin Outlook en C++, Comment faire [ par Bringdal ] Salut !!! &nbsp; Je dois cr&#233;er un plugin pour outlook avec visual&nbsp;c++ et je ne trouve aucun exemple plugin IE pour interroger son site web... mais comment faire svp? [ par Linuss ] Bonjour &#224; tous, Voil&#224;, j'ai vu quelques sites qui proposaient &#224; leurs membres un barre qui se met sur IE pour rechercher quelque chose Video [ par Trappeu17 ] Bonjour,je suis actuellement en train de faire du chiffrage de vid&#233;os. Les personnes voulant regarder ces videos devront ajouter un plugin &#224; plugin C++ [ par hawrang ] J'aimerai inclure dans mon logiciel une structure de type plus-in. En gros mon logiciel irait chercher dans un répertoire des librairies dynamiques. C Plugin [ par yoyo269 ] Bonjour à tous et à toutes.Je souhaiterais pourvoir utiliser (ou en créer un équivalent) le plugin de windows media player qui permet d'afficher dans


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,966 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales