begin process at 2012 05 27 16:42:27
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > GESTIONNAIRE DE SERVER ET CLIENT DDE (DYNAMIC DATA EXCHANGE)

GESTIONNAIRE DE SERVER ET CLIENT DDE (DYNAMIC DATA EXCHANGE)


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :gestion, dde, server, dynamique, client Niveau :Initié Date de création :09/08/2005 Date de mise à jour :20/08/2005 22:50:52 Vu / téléchargé :8 287 / 389

Auteur : BaFM

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

 Description

Bonjour,
Cette source contient une classe offrant un interface de gestion de clients et de serveurs DDE.
Pour l'utiliser, il suffit de créer une classe dérivant du gestionnaire. Puis surcharger les méthodes On* suivant les besoins. Un descriptif des méthodes à surcharger suis. Le gestionnaire fourni aussi les mes méthodes d'appels des différentes fonctions de DDE. Aussi décrites.
Le gestionnaire ne gère pas les connections provenant d'un seul client vers de multiple serveurs.
Il ne gère pas non plus les requêtes asynchrones pour l'instant.
Le composant fonctionne autant en ANSI qu'en Unicode.

Le composant est initialisé à sa création.
Les méthodes étant en portée protégée, il est impossible de les appeler manuellement en dehors du composant sans le dériver.
Ses contructeurs étant aussi protégés, il est impossible de l'instancier directement.

Pour créer un serveur DDE, il faut utiliser le constructeur qui prend une chaîne de caractères en paramètre. Le client utilise le constructeur sans paramètre.

Source

  • /* Dans tout ce qui suit :
  • * uFormat : Désigne le format presse papier utilisé pour les données.
  • * topic : Désigne le sujet utilisé pour la conversation.
  • * item : Désigne le nom de l'élément transmit ou demandé.
  • * data : Donnée transmise par l'autre partie.
  • * context : Contexte de la conversation créée.
  • * sameInstance : Indique si l'autre partie est l'instance courante.
  • * baseServiceName : Nom du service.
  • * instanceServiceName : Nom de l'instance.
  • *
  • * Valeurs de retour :
  • * - BOOL : TRUE si réussi sinon FALSE.
  • * - UINT : DDE_FACK si traité, DDE_FBUSY si le server est trop occupé, DDE_FNOTPROCESSED si non traité.
  • * - HDDEDATA : Donnée de retour.
  • */
  • /********************************************
  • * Messages client
  • ********************************************/
  • // Client Message XTYP_ADVDATA.
  • // Le serveur a envoyer des données dans le contexte d'une conversation Advise.
  • UINT OnAdvData(UINT uFormat, String topic, String item, HDDEDATA data);
  • // Client Message XTYP_XACT_COMPLETE.
  • // Le serveur a fini une transaction asynchrone.
  • // Le paramètre donnée est du type de donnée retournée par la transaction, voir les messages serveur.
  • // transactionID fourni l'identifiant de transaction asynchrone donné lors de l'exécution de celle-ci.
  • void OnXactComplete(UINT uFormat, String topic, String item, HDDEDATA data, DWORD transactionID);
  • /********************************************
  • * Messages serveur
  • ********************************************/
  • // Server Message XTYP_ADVREQ.
  • // Des données doivent être envoyées par le serveur. Déclencher par l'appel de PostAdvise() par le server.
  • // Le format fourni est celui demandée par lors de la création de la transaction Advise.
  • HDDEDATA OnAdvReq(UINT uFormat, String topic, String item);
  • // Server Message XTYP_ADVSTART.
  • // Le client a demmandé l'initialisation d'une transaction advise.
  • BOOL OnAdvStart(UINT uFormat, String topic, String item);
  • // Server Message XTYP_ADVSTOP.
  • // Le client ferme une transaction advise.
  • void OnAdvStop(UINT uFormat, String topic, String item);
  • // Server Message XTYP_CONNECT.
  • // Un client demande à se connecter au server.
  • BOOL OnConnect(String topic, CONVCONTEXT *context, BOOL sameInstance);
  • // Server Message XTYP_CONNECT_CONFIRM.
  • // La connection accepter, le server en reçoit la confirmation.
  • void OnConnectConfirm(String topic, BOOL sameInstance);
  • // Server Message XTYP_EXECUTE.
  • // Le client demande au server d'exécuter une commande.
  • // La commande doit être dans un format compris par le client et le server et dont il ont convenu préalablement.
  • UINT OnExecute(String topic, byte *command, DWORD length);
  • // Server Message XTYP_POKE.
  • // Le client dépose des données au server. Le server doit agir en conséquence.
  • UINT OnPoke(UINT uFormat, String topic, String item, byte *data, DWORD length);
  • // Server Message XTYP_REQUEST.
  • // Le client demande des données au server.
  • HDDEDATA OnRequest(UINT uFormat, String topic, String item);
  • /********************************************
  • * Messages commun
  • ********************************************/
  • // Server and Client Message XTYP_DISCONNECT.
  • // L'un des deux parti s'est déconnecté de la transaction
  • void OnDisconnect(BOOL sameInstance);
  • // Server and Client Message XTYP_ERROR.
  • // Une erreur est survenue. Pour de plus amples information sur le code d'erreur, consultez le message XTYPE_ERROR de DDEML
  • void OnError(WORD errorCode);
  • // Server and Client Message XTYP_REGISTER.
  • // Indique l'inscription d'un service.
  • void OnRegister(String baseServiceName, String instanceServiceName);
  • // Server and Client Message XTYP_UNREGISTER.
  • // Indique la désinscription d'un service.
  • void OnUnRegister(String baseServiceName, String instanceServiceName);
  • /************************************************************************/
  • /* Raccourcis des méthodes DDE */
  • /************************************************************************/
  • // Connexion. Client/Server. Retourne l'handle de la conversation si réussi. sinon NULL.
  • // Crée une conversation entre un client et un serveur.
  • HCONV Connect(String Service, String Topic) const;
  • // Déconnexion. Client/Server.
  • // Déconnecte une conversation préalablement créée.
  • BOOL Disconnect(HCONV hConv) const;
  • // Transaction Execute. Client.
  • // Demande l'exécution d'une commande au serveur. Ne peut être utilisé que par un client.
  • UINT Execute(BYTE *pData, DWORD dwLen, HCONV hConv) const;
  • // Transaction Poke. Client.
  • // Dépose des données au serveur. Ne peut être utilisé que par le client.
  • UINT Poke(BYTE *pData, DWORD dwLen, HCONV hConv, String item, WORD wFormat) const;
  • // Transaction Request. Client.
  • // Demande des données au serveur. Ne peut être utilisé que par le client.
  • // Le pointeur est initialisée avec la structure de fourniture de données.
  • // La strucutre peut être détruite grâce à la méthode FreeRequestData.
  • void Request(HCONV hConv, String item, WORD wFormat, DDEManager::Data *&pData) const;
  • // Transaction AdvStart. Client. wFlag peut prendre la valeur XTYPF_NODATA ou XTYPF_ACKREQ.
  • // Démarre une transaction Advise. Ne peut être utilisé que par le client.
  • BOOL AdvStart(HCONV hConv, String item, WORD wFormat, UINT wFlag = 0) const;
  • // Transaction AdvStop. Client.
  • // Termine une transaction Advise. Ne peut être utilisé que par le client.
  • void AdvStop(HCONV hConv, String item, WORD wFormat) const;
  • // Transaction PostAdvise. Server.
  • // Indique que le serveur doit envoyer des données pour une transaction Advise. Ne peut être utilisé que par le serveur. déclenche l'évènement OnAdvReq
  • BOOL PostAdvise(String topic, String item) const;
  • // Crée un identificateur de donnée.
  • // A n'utiliser que si nécessaire.
  • // L'argument share permet d'indiquer que les données sont partagées et non dupliquées.
  • HDDEDATA CreateDataHandle(BYTE *pData, DWORD dwLen, DWORD dwOffset, String item, WORD wFormat, BOOL share = FALSE) const;
  • // Récupérer la dernière erreur
  • // Fourni le message d'erreur correspondant à la dernière erreur.
  • String GetLastError() const;
  • // Détruit une structure de fourniture de donnée créée lors de l'appel à Request.
  • // Initialise le pointeur
  • DDEMANAGER_API void FreeRequestData(DDEManager::Data *&pData) const;
  • // Libère un identificateur de donnée et initialise la variable.
  • DDEMANAGER_API void FreeDataHandle(HDDEDATA &hData) const;
  • /************************************************************************/
  • /* Structures de donnée internes */
  • /************************************************************************/
  • // Structure de donnée de fourniture de données.
  • // Cette structure n'est intiantiable que par DDEManager.
  • // Aucune dérivation ne permet son instantiation.
  • // Celà permet de sécuriser la manipulation de cette structure pour la création et la suppression.
  • DDEManager::Data
  • // Données fournies. Ne pas essayer de détruire manuellement les données.
  • // Celà pourrais entrainer l'arrêt de votre application.
  • BYTE *const data;
  • // Longueur des données fournies.
  • const DWORD length;
/* Dans tout ce qui suit :
 * uFormat : Désigne le format presse papier utilisé pour les données.
 * topic : Désigne le sujet utilisé pour la conversation.
 * item : Désigne le nom de l'élément transmit ou demandé.
 * data : Donnée transmise par l'autre partie.
 * context : Contexte de la conversation créée.
 * sameInstance : Indique si l'autre partie est l'instance courante.
 * baseServiceName : Nom du service.
 * instanceServiceName : Nom de l'instance.
 *
 * Valeurs de retour :
 * - BOOL : TRUE si réussi sinon FALSE.
 * - UINT : DDE_FACK si traité, DDE_FBUSY si le server est trop occupé, DDE_FNOTPROCESSED si non traité.
 * - HDDEDATA : Donnée de retour.
 */
/********************************************
 * Messages client
 ********************************************/
// Client Message XTYP_ADVDATA.
// Le serveur a envoyer des données dans le contexte d'une conversation Advise.
UINT OnAdvData(UINT uFormat, String topic, String item, HDDEDATA data);
// Client Message XTYP_XACT_COMPLETE.
// Le serveur a fini une transaction asynchrone.
// Le paramètre donnée est du type de donnée retournée par la transaction, voir les messages serveur.
// transactionID fourni l'identifiant de transaction asynchrone donné lors de l'exécution de celle-ci.
void OnXactComplete(UINT uFormat, String topic, String item, HDDEDATA data, DWORD transactionID);
/********************************************
 * Messages serveur
 ********************************************/
// Server Message XTYP_ADVREQ.
// Des données doivent être envoyées par le serveur. Déclencher par l'appel de PostAdvise() par le server.
// Le format fourni est celui demandée par lors de la création de la transaction Advise.
HDDEDATA OnAdvReq(UINT uFormat, String topic, String item);
// Server Message XTYP_ADVSTART.
// Le client a demmandé l'initialisation d'une transaction advise.
BOOL OnAdvStart(UINT uFormat, String topic, String item);
// Server Message XTYP_ADVSTOP.
// Le client ferme une transaction advise.
void OnAdvStop(UINT uFormat, String topic, String item);
// Server Message XTYP_CONNECT.
// Un client demande à se connecter au server.
BOOL OnConnect(String topic, CONVCONTEXT *context, BOOL sameInstance);
// Server Message XTYP_CONNECT_CONFIRM.
// La connection accepter, le server en reçoit la confirmation.
void OnConnectConfirm(String topic, BOOL sameInstance);
// Server Message XTYP_EXECUTE.
// Le client demande au server d'exécuter une commande.
// La commande doit être dans un format compris par le client et le server et dont il ont convenu préalablement.
UINT OnExecute(String topic, byte *command, DWORD length);
// Server Message XTYP_POKE.
// Le client dépose des données au server. Le server doit agir en conséquence.
UINT OnPoke(UINT uFormat, String topic, String item, byte *data, DWORD length);
// Server Message XTYP_REQUEST.
// Le client demande des données au server.
HDDEDATA OnRequest(UINT uFormat, String topic, String item);
/********************************************
 * Messages commun
 ********************************************/
// Server and Client Message XTYP_DISCONNECT.
// L'un des deux parti s'est déconnecté de la transaction
void OnDisconnect(BOOL sameInstance);
// Server and Client Message XTYP_ERROR.
// Une erreur est survenue. Pour de plus amples information sur le code d'erreur, consultez le message XTYPE_ERROR de DDEML
void OnError(WORD errorCode);
// Server and Client Message XTYP_REGISTER.
// Indique l'inscription d'un service.
void OnRegister(String baseServiceName, String instanceServiceName);
// Server and Client Message XTYP_UNREGISTER.
// Indique la désinscription d'un service.
void OnUnRegister(String baseServiceName, String instanceServiceName);

/************************************************************************/
/* Raccourcis des méthodes DDE                                          */
/************************************************************************/
// Connexion. Client/Server. Retourne l'handle de la conversation si réussi. sinon NULL.
// Crée une conversation entre un client et un serveur.
HCONV Connect(String Service, String Topic) const;
// Déconnexion. Client/Server.
// Déconnecte une conversation préalablement créée.
BOOL Disconnect(HCONV hConv) const;
// Transaction Execute. Client.
// Demande l'exécution d'une commande au serveur. Ne peut être utilisé que par un client.
UINT Execute(BYTE *pData, DWORD dwLen, HCONV hConv) const;
// Transaction Poke. Client.
// Dépose des données au serveur. Ne peut être utilisé que par le client.
UINT Poke(BYTE *pData, DWORD dwLen, HCONV hConv, String item, WORD wFormat) const;
// Transaction Request. Client.
// Demande des données au serveur. Ne peut être utilisé que par le client.
// Le pointeur est initialisée avec la structure de fourniture de données.
// La strucutre peut être détruite grâce à la méthode FreeRequestData.
void Request(HCONV hConv, String item, WORD wFormat, DDEManager::Data *&pData) const;
// Transaction AdvStart. Client. wFlag peut prendre la valeur XTYPF_NODATA ou XTYPF_ACKREQ.
// Démarre une transaction Advise. Ne peut être utilisé que par le client.
BOOL AdvStart(HCONV hConv, String item, WORD wFormat, UINT wFlag = 0) const;
// Transaction AdvStop. Client.
// Termine une transaction Advise. Ne peut être utilisé que par le client.
void AdvStop(HCONV hConv, String item, WORD wFormat) const;
// Transaction PostAdvise. Server.
// Indique que le serveur doit envoyer des données pour une transaction Advise. Ne peut être utilisé que par le serveur. déclenche l'évènement OnAdvReq
BOOL PostAdvise(String topic, String item) const;
// Crée un identificateur de donnée.
// A n'utiliser que si nécessaire.
// L'argument share permet d'indiquer que les données sont partagées et non dupliquées.
HDDEDATA CreateDataHandle(BYTE *pData, DWORD dwLen, DWORD dwOffset, String item, WORD wFormat, BOOL share = FALSE) const;
// Récupérer la dernière erreur
// Fourni le message d'erreur correspondant à la dernière erreur.
String GetLastError() const;
// Détruit une structure de fourniture de donnée créée lors de l'appel à Request.
// Initialise le pointeur
DDEMANAGER_API void FreeRequestData(DDEManager::Data *&pData) const;
// Libère un identificateur de donnée et initialise la variable.
DDEMANAGER_API void FreeDataHandle(HDDEDATA &hData) const;

/************************************************************************/
/* Structures de donnée internes                                        */
/************************************************************************/

// Structure de donnée de fourniture de données.
// Cette structure n'est intiantiable que par DDEManager.
// Aucune dérivation ne permet son instantiation.
// Celà permet de sécuriser la manipulation de cette structure pour la création et la suppression.
DDEManager::Data
    // Données fournies. Ne pas essayer de détruire manuellement les données.
    // Celà pourrais entrainer l'arrêt de votre application.
    BYTE *const data;
    // Longueur des données fournies.
    const DWORD length;

 Conclusion

Comme l'utilisation de DDE nécessite une méthode de rappel, il faut alors en faire une par client/serveur. De plus l'API DDE nécessite des appels particuliers pour récupérer les informations. Et tout ces appels nécessite de se souvenir de l'identifiant de l'instance du client/server DDE que l'on a crée. Le composant permet de s'en affranchir et fourni les informations sous forme d'objet ou de tampon de donnée récupéré. L'utilisateur n'a plus besoin de se soucier de ces appels.

Afin de permettre un meilleurs fonctionnement au niveau de l'allocation mémoire, l'application se base sur les bibliothèques existantes pour allouer les emplacements de données. La seule allocation et destruction faite par l'objet sont celles pour les données reçues en Request qui ne s'utilisent donc que dans un seul Thread normalement. Toutes les allocations pour les chaînes sont effectuées par ATL par la classe générique StringT et son contrôle du buffer interne.

Le support Unicode/Ansi a été amélioré et sont fournis les différents modèles de compilation.

Il est notable que l'utilisation d'ATL en réduction des dépendances ne permet pas compiler en release pour une raison qui m'est inconnue. Si quelqu'un a la réponse, qu'il n'hésite pas et laisse un commentaire.

Il devrais bientôt y avoir des mises à jours pour les fonctionnalitées non gérées.

Attention : Les appels aux méthodes d'un client ou d'un server DDE doivent être effectuées dans le même processus légé (Thread) que sont initialisation.

J'espère que cette classe vous sera utile, en tout cas elle l'est pour moi.

Adresse de la version .NET qui découle de cette implémentation : http://www.csharpfr.com/code.aspx?ID=33352

 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

10 août 2005 21:22:38 :
Correction d'une erreur de libération de mémoire irrécupérable lors de la récupération des chaînes de caractères DDE. Mise à jours du ZIP.
19 août 2005 22:53:34 :
Mise à jours de la gestion Unicode/Ansi. Correction du bug de mémoire lors de l'utilisation de Request. Amélioration de la gestion de la mémoire. Amélioration de la récupération des données dans la méthode de rappel lors d'une transaction ne fournissant pas d'identifiant de conversation.
19 août 2005 22:59:13 :
Quelques petits oublie dans la mise à jours de l'aide succinte fourni en code de la source.
20 août 2005 22:50:52 :
Lien vers la version .NET. Quelques test de validations.

 Sources du même auteur

Source avec Zip COURS DE C++ FOURNI FAIT PAR UN PROFESSIONEL (PAS MOI)
Source avec Zip GESTION D'ICÔNE DU SYSTEM TRAY
Source avec Zip OUTILS DIRECTX
Source avec Zip BIBLIOTHÈQUE D'AIDE AU DÉBOGAGE VC++ 6.0

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
PILES BASÉ SUR DES TABLEAUX par dreamoudi

Commentaires et avis

Commentaire de cyd2025 le 15/05/2006 16:24:36

Bonjour,
je viens de recupérer ton projet, je l'ai compilé, et il me génère la dll avec son fichier lib.
Ensuite, quand je charge ta dll dans mon projet VC7, je ne sais pas quelle fonction appeler pour pouvoir instancier la classe qui permet de gérer DDE.
Est-ce que tu aurais un bout de code exemple ?

J'ai aussi essayé de prendre tes fichiers cpp et h et de les inclures dans mon projet, mais là j'ai des problème de compilations au niveau de certains typedef.

C'est quoi la meilleur solution ? Charger ta dll dans mon projet ou inclure directement ton code source dans mon projet ?

Merci pour ton aide

Commentaire de BaFM le 15/05/2006 23:24:43

Alors, la meilleurs solution est d'importer la DLL dans ton projet, tu utilise le fichier de l'unique classe pour les déclarations.
Pour pouvoir instantier, il faut DERIVER la classe. Car elle est faite pour être utilisée comme ca. Il te suffit de surcharger les différentes méthodes On*.
Après celà fonctionne tout seul. Par contre il ne faut pas oublier d'appeler le constructeur de la classe mère, suivant le besoin. Besoin d'un client ou besoin d'un serveur.
Bonne chance.

Commentaire de BaFM le 15/05/2006 23:27:05

J'oubliais...
Je viens de répéter ce que j'ai mit dans les informations associés à la source. Il me semble que c'est assez explicite quand même.
Si tu a plus de question, envoie moi un message directement. Je rajouterais les informations qui découlent de notre conversation à la description de la source.
MyGoddess

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

gestion multi utlisateur [ par marelo87 ] bonjour,j ai deux question:- j aimerais savoir comment faire "attendre" une fonction. dans un programme le serveur doi recevoir desdonnées taper par l Client server [ par supergrey ] Bonjour, je voudrai savoir si il y a un moyen pour que notre IP soit envoyé a une page PHP à partir d'un programe C++ et vice versa(pouvoir récupérer programmation client [ par CyraX ] bonjour tout le monde...Voila je souhaiterais programmer un client pour un server de message instantanés style AIM ou MSN.Cependant, je manque d'infor client & server [ par Stormy ] J'ai codé un serveur simple usant de TCP. Comme client j'utilise NetCat. Or, quand NetCat 'ferme', mon serveur ne détecte pas la clôture de la relatio Soyez sympas, g un pb client/server...:((( [ par Gendal67 ] Salut all !J'ai cherché pdt des heures à faire fonctionner mon client et mon server, sans succès! :(En fait, g vu des sources ici qui m'ont appris a f Envoi Fichiers via client/server [ par malik7934 ] Hello!Je connais pas grand chose aux réseaux.... mais ce que j'ai compris, c'est qu'avec WINSOCK, il y a une fonction send pour envoyer des char. Moi, Un peu d'aide pour un serveur [ par NAVIE ] Bonjour, voilà mon souci: a l'aide de mon compilateur Dev-C++ Version 4.9.8.10 j'ai crée un socket qui sert de serveur. Cependant même Gestion d'un service d'impression sur serveru 2003 [ par norbs26 ] Bonjour . Je lance un apple au secours. J'ai crée un service en c++ pour imprime des fichiers sur une imrimante reseau . Le Pb c'est cela fontionne t Etat Socket Linux [ par cybermax62 ] Existe-t-il un moyen de connaître sur un server (socket,C) l'état d'un connection client (socket,C) utilisant le protocole SOCK_STREAM ? Act Client/Server TCp_IP en temps reel [ par virlix ] Bonjour tout le monde.Je suis actuellement en train de programmer sous un OS Realtime.J'aimerai y developper une server TCP_IP avec un client qui vien


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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 : 0,827 sec (4)

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