Peut-on utiliser un Activex en VC++ sans MFC?

Signaler
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005
-
Salut tout le monde,
Je sais comment ajouter et manipuler un controle Activex dans un projet VC++ MFC. Mais je cherche un moyen pour faire la même chose dans un projet en VC++ pur API (sans MFC). Je veux appeler les méthodes de ce contrôle Activex, lire ou changer ses propriétes etc ...
Est-ce possible?
Si oui, comment ?
Merci d'avance!
A++

29 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Yep,
MFC = Microsoft Foundation Classes!
Ce sont des classes pré-faites qui permette une utilisation simplifié du C/C++.
Ca n'a donc rien a voir avec les composants ActiveX.

Tu peux donc ajouter a ta guise tous les OCX que tu souhaites.

Shell
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
ouais mais dans ce cas là il faut avouer que les MFC simplifient la tache.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
ymca2003> tu peux meme dire que sans MFC faudrait etre carrement maso.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
salut ,
Merci pour ces réponses.
Il est vrai que les MFC simplifient beaucoup de choses, mais moi je cherche la performance de l'application générée. En API pure, je peux optimiser mon application au maximum ( taille de l'exécutable et vitesse d'exécution etc...). Ce qui n'est pas évident en MFC. En plus, la programmation pure API nous permet d'accéder plus facilement aux fonctions les plus courantes du système d'exploitation. Ce qui nous aide à mieux connaitre son fonctionnement et donc à mieux le programmer. Bref , je n'aime pas beaucoup les MFC. Et s'il existe une solution (pur API) aussi complexe soit elle ,je la préférerai aux facilités proposées dans MFC.
En parlant de complexité, je me rappelle l'époque de la programmation sous MS-DOS. Je m'entrainais à faire une même application avec des langages de programmation différents : C, Pascal, Quick Basic et Assembleur. Il s'est avéré que l'Assembleur , "grâce" à sa grande complexité, donne à l'application le maximum de performance. Quand on cherche la performance , on doit chercher les meilleurs moyens , qui ne sont pas toujours faciles.

Donc , s'il existe un moyen permettant d'accéder aux méthodes et propriétes d'un Activex ,sans MFC, j'aimerais bien le savoir.
Encore une fois, merci d'avance.
A++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
De toute manière, l'utilisation de composants ActiveX n'est pas de ce qu'il y a de mieux en C++. Essaye tant que possible d'en rester au CommonControls.
Puis si vraiment tu as besoin d'utiliser un controle ActiveX sache que tu disposes des sources des MFC dans tes includes.

BruNews> Pour les composants personnalisé, y a t'il une autre maniere que les "dessiner" ou meme d'utiliser les ActiveX?

Shell
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
- Alors tres franchement, je n'ai essaye les ActiveX que dans du MFC en demo et il y a fort longtemps, donc quasi aucun souvenir.
- Ce qui est d'utiliser API directement, bien entendu je suis pour a 100% puisque je ne fais que cela.
- Utiliser des ActiveX ne me semble pas indique non plus sinon on se retrouve avec les probs d'install comme en VB, conflits de composants, etc...
- Me semble que le temps de retrouver toutes methodes, proprietes et le moyen de les inserer dans le prog, on ecrit ce dont on a besoin dans son prog a base des commons controls et on se retrouve avec un prog facilement distribuable et qui n'est pas soumis au bon enregistrement de composants dans la BDR.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,
Merci pour vos conseils et suggestions.

Je pense qu'un petit exemple pourrait bien clarifier mon idée.
Windows dispose de beaucoup de contrôles Activex déja prêt à être exploités par n'importe quelle application. Donc aucun besoin de les installer ou enregistrer. Par exemple, "Shockwave Activex Control" peut être exploité dans une page html par Internet Explorer (ou autre) pour afficher les animations Flash. Il est ainsi plus pratique d'afficher cette animation directement dans la fenêtre de l'application que d'avoir recours au programme de lecture "Flash Player". Mon idée est de faire la même chose dans mon application, c'est à dire, afficher une animation Flash dans ma fenêtre. En MFC, c'est presque un jeu d'enfant, ce qui n'est pas du tout le cas en pur API. Je pense que ce serait très intéressant de pouvoir profiter des nombreux services offerts par ces contrôles Activex dans des projets sans MFC.
Je n'ai parlé ici de "Sockwave Activex Control" qu'à titre d'exemple.
Je précise qu'à ce sujet, MSDN et autres sites, ne parlent que MFC, mais je suis convaicu qu'on trouvera une solution pur API.
Puisque je suis du genre un peu "obstiné" en programmation, je ne baisserai les bras que lorsqu'on me prouve que c'est "IMPOSSIBLE".
Voila, merci encore
A++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
ne laisse pas tomber et propose nous des que possible un petit exemple en source.
Bonne continuation.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,

Merci BruNews pour ton encouragement. Je te promets que dès que j'aurai trouvé la solution, je la proposerai sous forme de source spécialement pour ce site.

Dis-moi DeAtHCrAsH, tu veux dire qu'on peut utiliser un activex en API juste en copiant les classes MFC utiles dans mon projet? J'aimerais bien avoir d'autres précisions stp. Ca pourrait être une piste intéressante à suivre.

Merci
A++
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005

Salut!
En ce moment je suis en train d'essayer d'utiliser des controles activeX sans MFC parce que je veux tout le pouvoir du API en main comme racpp.
Il y a des informations que j'ai trouvé et je voudrais les partager.
Pour utiliser les controles activeX on peut utiliser MFC, c'est facile mais quand on doit distibuer les mfc42.dll et tout ça devient ennuyeux.
Deuxiemement tu peut toi meme creer une hote OLE mais c'est trop difficile.
(PS: Les controles activeX sont des controles OLE activeX n'est qu'un autre nom)
Troisiemement tu peux utiliser l'ATL en meme temps que win32. Tu peux utiliser tes dlgproc pour des dialogues normales sans controles activeX et pour les dialogues avec des controles activeX tu peut utiliser CAxDialogImpl (ca n'a rien avoir avec MFC et tu n'a pas besoin de dll supplementaire.).
Je suis en train d'ecrire un tutorial sur ce sujet je vais utiliser le controle windows media player, windows internet explorer et le DHTMLEdit ( j'ai un petit probleme avec DHMLEdit quand je vais le resoudre je vais le poster)... si tu ne peut pas attendre 2-3 jours alors fais un recherche sur ATL ( et si la programmation d'un hote OLE t'interesse essaye de trouver le livre "ActiveX UnLeashed" il y a beaucoup d'info...)

J'espere que ça t'aide...

cout << "Salut je suis un debutant" << endl;
cout << " :big) ";
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,
Merci scolinks pour ces informations. Je tiens à préciser que mon but n'est pas de créer des contrôles Activex, mais plutôt de profiter des services des contrôles déjà présents sur le système. Tout cela en pur API bien sûr. Je viens de découvrir des fonctions API intéressantes , mais un seul problème persiste. Voici ces fonctions:
OleInitialize()  ou CoInitialize()   // pour initialiser la bibliothèque...
CoCreateInstance() // pour créer une instance d'un objet....
       // ici appel des méthodes de l'objet créé...
       // ici libération de l'objet 
OleUnInitialize() ou  CoUnInitialize()  // pour fermer la biblio...

Le problème est : pour qu'une instance de l'objet soit créée, il faut qu'une classe de type interface soit déclarée avant, car c'est elle qui contiendra cette instance. Cette déclaration est généralement faite dans un fichier *.h ou *.tlb . L'un de ces deux fichiers doit être fourni par le concepteur du composant. J'ai téléchargé des contrôles Activex et j'ai réussi à les manipuler grâce aux déclarations faites dans les fichiers *.h qui les accompagnent. Sans cela, CoCreateInstance() n'arrive pas à créer l'instance. Je me demande comment fait MFC pour se passer de ces fichiers de déclaration . Normalement , il doit y avoir une solution pour utiliser les contrôles installés dans le systèmes sans avoir besoin de déclaration de classe. J'attends avec impatience ton tutoriel.
A bientôt !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Regarde du cote de la directive
#import ...
comme je fais dans mes exemples ADO. Compilo va te generer les tlh et tli si le composant expose bien une interface.
Aucune idee si peut aller pour un ActiveX visuel, a tester.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005

MFC genere ses sources a partir des tlh je crois. Par example pour une controle DHTMLEdit MFC cree plein de source et il l'ajoute dans ton projet. Il y a un class COleDispatch (quelque chose comme ça) qui fait tout l'initialization...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Merci pour ces renseignements.
Je pense que tu as raison BruNews, avant de se casser la tête avec un contrôle , il faut d'abord s'assuer qu'il possède une interface. Sinon, on passera des journées entières sans le moindre résultat. C'est peut-être le cas des contrôles exclusivement visuels.
Les fichiers tlh et tli sont apparemment générés par le compilateur à partir des fichiers de déclarations introduits par #import "fichier.tlb" ou #include "fichier.h" . Je viens de trouver les déclatations de tous les composants du système avec leurs interfaces dans les fichiers comdef.h et exdisp.h situés dans le dossier include de Visual C++. Ils ne contiennent que les composants Microsoft.
A+
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005

Pour des controles non-visuelles ça marche mais pour les visuel non....
Il nous faut une sorte de fonction qui va coller le HWND du controle sur le dialogue avec l'ocx (la partie visuel).

(Pour ATL j'ai oublié de preciser qu'il y a des dialoques ATL qui sont compatible avec le ActiveX)

.486
.model flat, stdcall
option casemap:none

Je connais juste ça!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Si tu obtiens le hwnd du controle, essaie SetParent() et surtout rends le visible.
Tu insistes, c'est bien...

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005

...le probleme n'etait pas la...
En effet le DlgProc ne s'ouvre meme pas quand il y a un controle activeX sur lui. Je pense qu'il faut reecrire le code DialogBox() et le changer a quelque chose comme DialogBoxActiveX() :) (et mettre un conteneur OLE dedans...) ou est-ce qu'il y aurait un moyen de creer l'activeX sur le dialogue pendent que l'application marche par exemple je veux qu'Ýl s'ouvre quand j'appuie sur un bouton?

.486
.model flat, stdcall
option casemap:none
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
struct InitOle {
InitOle() {CoInitialize(NULL);}
~InitOle() {CoUninitialize();}
} _init_InitOle_;

Essaie avec cela en haut du cpp et InitCommonControls() dans WinMain.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005

non marche pas!
.486
.model flat, stdcall
option casemap:none

Je connais juste ça!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Alors fais un truc minimal en mfc et decortique son code.
Les sources mfc sont dans le dossier d'install de VS.

ciao...
BruNews, Admin CS, MVP Visual C++