OVH Cloud OVH Cloud

Sous-classer du DDE

9 réponses
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Bonjour,

Mon app sert de serveur DDE (pour des images et du texte) pour des documents
Word ou autre.

Mon pb est que je peux fournir plus de 300 données différentes. Il faut
autant de contrôles source.

Je voudrais donc trouver un moyen d'intercepter le LinkRequest, pour :

1) lire le topic (qui est le nom du contrôle source dans un fonctionnement
standard).
2) le modifier pour le faire pointer sur un contrôle de mon choix.

Toutes les idées sont bienvenues...

Cordialement

Christian Hubert-Hugoud

9 réponses

Avatar
Patrick Philippot
Christian HUBERT-HUGOUD- Xtrem7 wrote:
Mon app sert de serveur DDE (pour des images et du texte) pour des
documents Word ou autre.

Mon pb est que je peux fournir plus de 300 données différentes. Il
faut autant de contrôles source.

Je voudrais donc trouver un moyen d'intercepter le LinkRequest, pour :

1) lire le topic (qui est le nom du contrôle source dans un
fonctionnement standard).
2) le modifier pour le faire pointer sur un contrôle de mon choix.



Bonjour,

Comme toujours dès que l'on parle du "protocole de l'enfer", un
avant-propos s'impose: dans le cadre d'une amélioration de votre appli,
y a-t-il une raison absolument incontournable qui vous empêche
d'envisager un passage à Automation? C'est plus facile, c'est plus
fiable et ça permet d'envisager un design plus efficace, surtout dans
votre cas.

Sinon, il est facile de trouver des pages expliquant comment intercepter
des messages Windows par subclassing:

http://www.thescarms.com/vbasic/subclassform.asp
http://www.vbwm.com/art_2000/subclassing/0924/

Cependant, sauf erreur, VB utilise DDEML pour les opérations DDE et il
ne va pas être évident de vous intercaler dans le processus. Pour chaque
connexion, le destinataire des messages n'est pas une des fenêtres que
vous gérez mais une fenêtre invisible créée à cet effet par DDEML.

Et de toutes façons, AMHA, vous avez un problème de design à résoudre.
Automation vous permettrait de travailler avec des données structurées
(tableau, collection ou autre) et de répondre au client de manière
simple au travers de quelques méthodes adéquates qui iraient chercher la
bonne information là où elle se trouve, sans passer par un contrôle
séparé pour chaque donnée.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Bonjour,

Merci de votre réponse et de vos infos.

J'apprécie le DDE (quand il marche, et ce n'est pas évident), car le client
final n'a qu'à "Coller Spécial" et tout va sans dire. Pour mes clients,
c'est le summum de la complexité et je ne peux pas raisonnablement demander
plus. C'est uniquement cette particularité qui m'intéresse.

Je ne sais pas si on peut faire de même avec Automation.
Le savez-vous ? Si oui, alors je m'intéresse à Automation. Sans quoi je suis
condamné à utiliser le DDE, à moins qu'il existe d'autres choses.

Cordialement

Christian Hubert-Hugoud


"Patrick Philippot" a écrit dans le
message de news:
Christian HUBERT-HUGOUD- Xtrem7 wrote:
> Mon app sert de serveur DDE (pour des images et du texte) pour des
> documents Word ou autre.
>
> Mon pb est que je peux fournir plus de 300 données différentes. Il
> faut autant de contrôles source.
>
> Je voudrais donc trouver un moyen d'intercepter le LinkRequest, pour :
>
> 1) lire le topic (qui est le nom du contrôle source dans un
> fonctionnement standard).
> 2) le modifier pour le faire pointer sur un contrôle de mon choix.

Bonjour,

Comme toujours dès que l'on parle du "protocole de l'enfer", un
avant-propos s'impose: dans le cadre d'une amélioration de votre appli,
y a-t-il une raison absolument incontournable qui vous empêche
d'envisager un passage à Automation? C'est plus facile, c'est plus
fiable et ça permet d'envisager un design plus efficace, surtout dans
votre cas.

Sinon, il est facile de trouver des pages expliquant comment intercepter
des messages Windows par subclassing:

http://www.thescarms.com/vbasic/subclassform.asp
http://www.vbwm.com/art_2000/subclassing/0924/

Cependant, sauf erreur, VB utilise DDEML pour les opérations DDE et il
ne va pas être évident de vous intercaler dans le processus. Pour chaque
connexion, le destinataire des messages n'est pas une des fenêtres que
vous gérez mais une fenêtre invisible créée à cet effet par DDEML.

Et de toutes façons, AMHA, vous avez un problème de design à résoudre.
Automation vous permettrait de travailler avec des données structurées
(tableau, collection ou autre) et de répondre au client de manière
simple au travers de quelques méthodes adéquates qui iraient chercher la
bonne information là où elle se trouve, sans passer par un contrôle
séparé pour chaque donnée.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr




Avatar
Patrick Philippot
Christian HUBERT-HUGOUD- Xtrem7 wrote:
J'apprécie le DDE (quand il marche, et ce n'est pas évident), car le
client final n'a qu'à "Coller Spécial" et tout va sans dire. Pour mes
clients, c'est le summum de la complexité et je ne peux pas
raisonnablement demander plus. C'est uniquement cette particularité
qui m'intéresse.

Je ne sais pas si on peut faire de même avec Automation.
Le savez-vous ? Si oui, alors je m'intéresse à Automation. Sans quoi
je suis condamné à utiliser le DDE, à moins qu'il existe d'autres
choses.



DDE ne fait que du transfert de données (Dynamic Data Exchange). Ce que
vous en faites à l'arrivée est de votre ressort et ne dépend pas du
protocole. Si vous implémentez votre appli sous forme de serveur
Automation, les programmes clients n'auront qu'à instancier l'objet
Automation , appeler les méthodes adéquates et faire ce qu'ils veulent
avec les données retournées. Rien ne vous empêche d'ajouter une commande
au menu qui fait le travail de manière transparente pour l'utilisateur.

D'une manière générale, il n'y a rien qui soit possible en DDE et qui ne
le soit aussi via COM et Automation. Et vous pourrez en faire plus via
Automation. Je n'ai jamais trouvé une seule bonne raison technique pour
ne pas abandonner le DDE au profit de COM et Automation. Par contre, si
vous ne maîtrisez pas vous même le code des programmes clients qui
utilisent le DDE pour accéder aux données, il faudra probablement
ajouter quelques macros qui invoqueront le serveur Automation de manière
transparente au travers d'un menu custom. Rien de bien méchant. En
général, si l'appli cliente supporte DDE, elle supporte aussi la
création de macros.

En outre, vous n'aurez pas l'obligation d'avoir le serveur qui tourne
tout le temps comme en DDE. Si l'application serveur ne tourne pas au
moment de l'appel du client, COM se chargera de la réveiller. De plus,
sur un intranet, l'installation de l'application serveur sur une machine
distante est de type digito-nasale (comme dirait un de mes collègues
MVPs). Une fois que ça fonctionne en local, ça fontionnera en remote.

Pour créer un serveur Automation en VB, créer un projet de type ActiveX
EXE, voire ActiveX DLL si votre serveur n'a pas besoin de tourner en
stand-alone. C'est incroyablement simple et sans contrainte (bon, il
faut se faire une petite culture COM).

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Merci pour ces clarifications. Ce qui me manquait était de savoir qu'il
fallait créer un ActiveX exe.

Cordialement

Christian Hubert-Hugoud

"Patrick Philippot" a écrit dans le
message de news:uyBO$
Christian HUBERT-HUGOUD- Xtrem7 wrote:
> J'apprécie le DDE (quand il marche, et ce n'est pas évident), car le
> client final n'a qu'à "Coller Spécial" et tout va sans dire. Pour mes
> clients, c'est le summum de la complexité et je ne peux pas
> raisonnablement demander plus. C'est uniquement cette particularité
> qui m'intéresse.
>
> Je ne sais pas si on peut faire de même avec Automation.
> Le savez-vous ? Si oui, alors je m'intéresse à Automation. Sans quoi
> je suis condamné à utiliser le DDE, à moins qu'il existe d'autres
> choses.

DDE ne fait que du transfert de données (Dynamic Data Exchange). Ce que
vous en faites à l'arrivée est de votre ressort et ne dépend pas du
protocole. Si vous implémentez votre appli sous forme de serveur
Automation, les programmes clients n'auront qu'à instancier l'objet
Automation , appeler les méthodes adéquates et faire ce qu'ils veulent
avec les données retournées. Rien ne vous empêche d'ajouter une commande
au menu qui fait le travail de manière transparente pour l'utilisateur.

D'une manière générale, il n'y a rien qui soit possible en DDE et qui ne
le soit aussi via COM et Automation. Et vous pourrez en faire plus via
Automation. Je n'ai jamais trouvé une seule bonne raison technique pour
ne pas abandonner le DDE au profit de COM et Automation. Par contre, si
vous ne maîtrisez pas vous même le code des programmes clients qui
utilisent le DDE pour accéder aux données, il faudra probablement
ajouter quelques macros qui invoqueront le serveur Automation de manière
transparente au travers d'un menu custom. Rien de bien méchant. En
général, si l'appli cliente supporte DDE, elle supporte aussi la
création de macros.

En outre, vous n'aurez pas l'obligation d'avoir le serveur qui tourne
tout le temps comme en DDE. Si l'application serveur ne tourne pas au
moment de l'appel du client, COM se chargera de la réveiller. De plus,
sur un intranet, l'installation de l'application serveur sur une machine
distante est de type digito-nasale (comme dirait un de mes collègues
MVPs). Une fois que ça fonctionne en local, ça fontionnera en remote.

Pour créer un serveur Automation en VB, créer un projet de type ActiveX
EXE, voire ActiveX DLL si votre serveur n'a pas besoin de tourner en
stand-alone. C'est incroyablement simple et sans contrainte (bon, il
faut se faire une petite culture COM).

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr




Avatar
Patrick Philippot
Christian HUBERT-HUGOUD- Xtrem7 wrote:
Merci pour ces clarifications. Ce qui me manquait était de savoir
qu'il fallait créer un ActiveX exe.



Bonjour,

Attention, comme je l'expliquai dans un autre thread, vous ne pouvez pas
"marshaller" une StdPicture. Vous êtes condamné à la DLL si vous
souhaitez utiliser StdPicture et IPicture pour transférer vos images. Ou
alors il faut tranférer un flux d'octets comme je l'ai expliqué.

Bon courage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Bonjour,

Merci.

Je continue d'investiguer le DDE malgré tout. Au travers de la dll standard,
cela fonctionne très bien pour les textes. Cependant, je me heurte à une
difficulté (que vous évoquez) : pour les images, il faut transférer un
tableau de byte.

Or je n'arrive pas à copier une .Image dans un Byte(). Or il me semble que
quelque soit le protocole choisi (OLE ou DDE), il faudra que j'y arrive.

Peut-être avez-vous des pistes pour faire cela ?

Tout le code que j'ai trouvé consiste à lire les points des BMP, mais je
n'ai pas de code qui me renvoie la taille de .Image, ni son adresse de
départ.

Cordialement

Christian Hubert-Hugoud

"Patrick Philippot" a écrit dans le
message de news:
Christian HUBERT-HUGOUD- Xtrem7 wrote:
> Merci pour ces clarifications. Ce qui me manquait était de savoir
> qu'il fallait créer un ActiveX exe.

Bonjour,

Attention, comme je l'expliquai dans un autre thread, vous ne pouvez pas
"marshaller" une StdPicture. Vous êtes condamné à la DLL si vous
souhaitez utiliser StdPicture et IPicture pour transférer vos images. Ou
alors il faut tranférer un flux d'octets comme je l'ai expliqué.

Bon courage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr




Avatar
Patrick Philippot
Christian HUBERT-HUGOUD- Xtrem7 wrote:
Or je n'arrive pas à copier une .Image dans un Byte(). Or il me
semble que quelque soit le protocole choisi (OLE ou DDE), il faudra
que j'y arrive.

Peut-être avez-vous des pistes pour faire cela ?



Les exemples suivants démontrent à la fois la sauvegarde et la
restauration de l'image.

http://support.microsoft.com/default.aspx?scid=kb;EN-US;180714

Cette méthode présente cependant l'inconvénient de passer par un fichier
temporaire intermédiaire.

http://www.vb-helper.com/howto_db_dib.html

Cette méthode travaille directement en mémoire. Ce code prévoit la
sauvegarde dans une database, il vous suffit d'enlever le code inutile.

Ou bien ceci (peut-être le plus simple):

http://www.mvps.org/emorcillo/vb6/multimedia/arrayfrompicture.shtml
http://www.mvps.org/emorcillo/vb6/multimedia/picturefromarray.shtml

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Bonjour,

Merci de votre réponse.

J'ai bien aimé le passage par un fichier temporaire, mais du coup on a le
header du fichier dans le Byte(), ce qui ne correspond pas tout à fait avec
l'objet Image.

J'ai tenté l'option en mémoire pure, avec OLE ; je dois être un peu bourrin
car il me plante un : Type utilisateur non défini sur la ligne avec

IPersistStream

J'ai cherché sur MSDN et tout ce que je trouve, c'est qu'il faut charger la
référence StdOle2, ce qui est fait depuis longtemps.

Une idée peut-être ?

Merci de votre aide et de votre patience...

Cordialement

Christian Hubert-Hugoud

"Patrick Philippot" a écrit dans le
message de news:
Christian HUBERT-HUGOUD- Xtrem7 wrote:
> Or je n'arrive pas à copier une .Image dans un Byte(). Or il me
> semble que quelque soit le protocole choisi (OLE ou DDE), il faudra
> que j'y arrive.
>
> Peut-être avez-vous des pistes pour faire cela ?

Les exemples suivants démontrent à la fois la sauvegarde et la
restauration de l'image.

http://support.microsoft.com/default.aspx?scid=kb;EN-US;180714

Cette méthode présente cependant l'inconvénient de passer par un fichier
temporaire intermédiaire.

http://www.vb-helper.com/howto_db_dib.html

Cette méthode travaille directement en mémoire. Ce code prévoit la
sauvegarde dans une database, il vous suffit d'enlever le code inutile.

Ou bien ceci (peut-être le plus simple):

http://www.mvps.org/emorcillo/vb6/multimedia/arrayfrompicture.shtml
http://www.mvps.org/emorcillo/vb6/multimedia/picturefromarray.shtml

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr




Avatar
Patrick Philippot
Christian HUBERT-HUGOUD- Xtrem7 wrote:
J'ai tenté l'option en mémoire pure, avec OLE ; je dois être un peu
bourrin car il me plante un : Type utilisateur non défini sur la
ligne avec

IPersistStream



Téléchargez une de ces typelibs typelib et référencez la :

http://www.mvps.org/emorcillo/vb6/tlb/olelib.shtml (c'était mentionné en
haut à gauche dans les pages que j'ai citées - Dependencies: olelib.tlb)

http://vbaccelerator.com/home/VB/Type_Libraries/Stream/VBSTRM_Type_Library.asp

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr