begin process at 2012 05 27 14:50:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > CONTENEUR ACTIVEX 100% API

CONTENEUR ACTIVEX 100% API


 Information sur la source

Note :
9,93 / 10 - par 14 personnes
9,93 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Débutant Date de création :29/01/2005 Date de mise à jour :29/01/2005 05:22:55 Vu / téléchargé :19 776 / 1 677

Auteur : racpp

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

 Description

Cliquez pour voir la capture en taille normale
J'ai le plaisir de partager avec vous, et en exclusivité sur cppfrance, une belle petite trouvaille. On m'a déja dit qu'il faut être maso pour réaliser un conteneur Activex sans faire appel aux MFC ou ATL. Eh bien, ce n'est plus le cas. En effet, il suffit d'ajouter cinq petites lignes de code, dans un projet win32, pour transformer n'importe quel contrôle (static, edit, bouton etc...) en conteneur Activex. Voici ces cinq petites lignes:
1 - typedef HRESULT (WINAPI *PFonc)(IUnknown*,HWND,IUnknown**);
2 - HINSTANCE hDLL = LoadLibrary("atl.dll");
3 - PFonc AtlAxAttachControl = (PFonc) GetProcAddress(hDLL,"AtlAxAttachControl");
4 - AtlAxAttachControl(pointeurInterface,hWndConteneur ,0);
5 - FreeLibrary(hDLL);
Comme vous le voyez, tout le secret réside dans l'utilisation de la fonction "AtlAxAttachControl" contenue dans "atl.dll". Je l'ai testé avec plus d'une vingtaine de contrôles Activex sans aucun problème. C'est tellement simple qu'on se demande pourquoi personne n'y avait pensé avant. Même Microsoft...
Ce code source utilise l'Activex "WebBroser" pour afficher une page html grâce à l'interface "IWebBrowser2". Il s'agit de votre page de démarrage. Ca marche parfaitement sur Windows 98, 2000 et XP. J'aimerais bien savoir si cette méthode comporte des inconvénients. J'en ai pas trouvés après de longs tests. J'attends vos réactions.

Source

  • #include <windows.h>
  • #include <exdisp.h>
  • // Déclaration du HWND de notre conteneur en global:
  • HWND conteneur;
  • /***************** Procédure de notre fenêtre principale *********************/
  • LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
  • {
  • switch(messg)
  • {
  • case WM_SIZE:
  • // Redimensionnement du conteneur quand la taille de la fenêtre change:
  • MoveWindow(conteneur,0,0,LOWORD(lParam), HIWORD(lParam),1);
  • break;
  • case WM_CLOSE:
  • // Détruire la fenêtre principale:
  • DestroyWindow(hWnd);
  • break;
  • case WM_DESTROY:
  • // Envoyer le message de sortie du programme:
  • PostQuitMessage( 0 );
  • break;
  • default:
  • //Retour:
  • return( DefWindowProc( hWnd, messg, wParam, lParam ) );
  • }
  • return 0;
  • }
  • /***************************************************************************/
  • /********************* Fonction WinMain ************************************************/
  • int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
  • {
  • // Déclarer notre classe de fenêtre et définir ses membres:
  • WNDCLASS wc;
  • char NomClasse[] = "Conteneur";
  • wc.lpszClassName = NomClasse;
  • wc.hInstance = hInst;
  • wc.lpfnWndProc = WndProc;
  • wc.hCursor = LoadCursor( 0, IDC_ARROW );
  • wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
  • wc.lpszMenuName = 0;
  • wc.hbrBackground = 0;
  • wc.style = 0;
  • wc.cbClsExtra = 0;
  • wc.cbWndExtra = 0;
  • // Enregistrer la classe de notre fenêtre:
  • if (!RegisterClass(&wc)) return 0;
  • // Créer notre fenêtre principale:
  • HWND hWnd = CreateWindow( NomClasse,"Conteneur Activex",WS_OVERLAPPEDWINDOW,0,0,800,575, 0, 0, hInst,0);
  • // Montrer la fenêtre:
  • ShowWindow(hWnd, nCmdShow );
  • UpdateWindow( hWnd );
  • // Charger la DLL "atl.dll" pour notre programme:
  • HINSTANCE hDLL = LoadLibrary("atl.dll");
  • // Définir le type de pointeur pour la fonction "AtlAxAttachControl":
  • typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
  • // Récupérer l'adresse de la fonction "AtlAxAttachControl":
  • PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
  • // Obtenir les dimensions de notre fenêtre:
  • RECT rect;
  • GetClientRect(hWnd,&rect);
  • // Créer l'EDIT qui servira de conteneur Activex:
  • conteneur=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
  • // Initialiser la librairie COM pour notre programme:
  • CoInitialize(0);
  • // Déclarer un pointeur sur l'interface IWebBrowser2:
  • IWebBrowser2 *pIwb;
  • // Créer une instance de l'objet WebBrowser et de l'interface IWebBrowser2:
  • CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
  • // Attacher l'objet WebBrowser à notre EDIT conteneur:
  • AtlAxAttachControl(pIwb,conteneur,0);
  • // Lancer la page de démarrage:
  • pIwb->GoHome();
  • // Boucle des messages:
  • MSG Msg;
  • while( GetMessage(&Msg, 0, 0, 0))
  • {
  • TranslateMessage( &Msg );
  • DispatchMessage( &Msg );
  • }
  • // Libérer l'interface IWebBrowser2:
  • pIwb->Release();
  • // Fermer la librairie COM pour notre programme:
  • CoUninitialize();
  • // Fermer la DLL "atl.dll":
  • FreeLibrary(hDLL);
  • // Quitter le programme:
  • return( Msg.wParam);
  • }
  • /******************************************************************************/
#include <windows.h>
#include <exdisp.h>

// Déclaration du HWND de notre conteneur en global:
HWND conteneur;

/***************** Procédure de notre fenêtre principale *********************/
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
{	
	switch(messg)
	{
		case WM_SIZE:
			// Redimensionnement du conteneur quand la taille de la fenêtre change:
			MoveWindow(conteneur,0,0,LOWORD(lParam), HIWORD(lParam),1);
			break;
		
		case WM_CLOSE:
			// Détruire la fenêtre principale:
			DestroyWindow(hWnd);
			break;

		case WM_DESTROY:
			// Envoyer le message de sortie du programme:
			PostQuitMessage( 0 );
			break;
	
		default:
			//Retour:
			return( DefWindowProc( hWnd, messg, wParam, lParam ) );
	}
	return 0;
}
/***************************************************************************/

/********************* Fonction WinMain ************************************************/
int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
{
	// Déclarer notre classe de fenêtre et définir ses membres:
	WNDCLASS wc;
	char NomClasse[]    = "Conteneur";
	wc.lpszClassName    = NomClasse;
	wc.hInstance 	    = hInst;
	wc.lpfnWndProc	    = WndProc;
	wc.hCursor          = LoadCursor( 0, IDC_ARROW );
	wc.hIcon	    = LoadIcon( 0, IDI_APPLICATION );
	wc.lpszMenuName	    = 0;
	wc.hbrBackground    = 0;
	wc.style	    = 0;
	wc.cbClsExtra	    = 0;
	wc.cbWndExtra		= 0;
	// Enregistrer la classe de notre fenêtre:
	if (!RegisterClass(&wc)) return 0;

	// Créer notre fenêtre principale:
	HWND hWnd = CreateWindow( NomClasse,"Conteneur Activex",WS_OVERLAPPEDWINDOW,0,0,800,575, 0, 0, hInst,0);
	// Montrer la fenêtre:
	ShowWindow(hWnd, nCmdShow );
	UpdateWindow( hWnd );
	
	// Charger la DLL "atl.dll" pour notre programme:
	HINSTANCE hDLL = LoadLibrary("atl.dll");
	// Définir le type de pointeur pour la fonction "AtlAxAttachControl":
	typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
	// Récupérer l'adresse de la fonction "AtlAxAttachControl":
	PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
	// Obtenir les dimensions de notre fenêtre:
	RECT rect;
	GetClientRect(hWnd,&rect);
	// Créer l'EDIT qui servira de conteneur Activex:
	conteneur=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
	// Initialiser la librairie COM pour notre programme:
	CoInitialize(0);
	// Déclarer un pointeur sur l'interface IWebBrowser2:
	IWebBrowser2   *pIwb;
	// Créer une instance de l'objet WebBrowser et de l'interface IWebBrowser2:
	CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
	// Attacher l'objet WebBrowser à notre EDIT conteneur:
	AtlAxAttachControl(pIwb,conteneur,0);
	// Lancer la page de démarrage:
	pIwb->GoHome();
	
	// Boucle des messages:
	MSG Msg;
	while( GetMessage(&Msg, 0, 0, 0))
	{
		TranslateMessage( &Msg );
		DispatchMessage( &Msg );
	}

	// Libérer l'interface IWebBrowser2:
	pIwb->Release();
	// Fermer la librairie COM pour notre programme:
    CoUninitialize();		
	// Fermer la DLL "atl.dll":
	FreeLibrary(hDLL);
	// Quitter le programme:
	return( Msg.wParam);
}
/******************************************************************************/


 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

29 janvier 2005 05:22:55 :

 Sources du même auteur

Source avec Zip Source avec une capture SOUS-CLASSEMENT DE FENÊTRE D'UN AUTRE PROCESS PAR INJECTION ...
Source avec Zip Source avec une capture FENÊTRE FLOTTANTE SANS FOCUS (WIN32 API)
Source avec Zip Source avec une capture SERVICE WINDOWS DANS UNE DLL LANCÉ PAR SVCHOST.EXE
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI...

 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

Commentaires et avis

Commentaire de BruNews le 29/01/2005 10:23:03 administrateur CS

Quand simplicité rime avec efficacité, en voilà une parfaite demonstration qui sera utile à beaucoup de gens.
EXCELLENT !!!

Commentaire de supergrey le 29/01/2005 11:33:24

Ca marche nickel !

Commentaire de Urgo le 29/01/2005 12:22:29

Superbe exemple tu nous délivres ici! 10/10

Par contre comment éviter les problèmes de cliglotements lors du redimensionnement de la fenêtre? (j'ai essayé de chercher sous 'flicker free", etc... mais rien de bien intéressant de trouvé!)

Commentaire de scolinks le 29/01/2005 18:40:39

10 sur 10!

Commentaire de eRoZion le 30/01/2005 05:54:56

Et bé bravo ...
Je me souviens que ca fait un sacré bout de temps que t'es dessus (vous étiez deux d'ailleurs je crois) et qu'on t'avait pas mal découragé.

Ca peut être carrément utile.

10


eRoZion

Commentaire de racpp le 31/01/2005 18:50:48 administrateur CS

Merci à tous. C'est très encourageant. Pour pousser les choses un peu plus loin, je suis en train de finaliser un petit navigateur web utilisant le même activex avec la gestion des événements en plus. Je le posterai dès qu'il est fini.

Urgo > Le problème du clignotement pendant le redimensionnement de  la fenêtre ne m'a pas préoccupé car il n'est pas génant. Je pense qu'il est possible de le réduire mais pas de l'éliminer complètement.

eRoZion > C'est vrai , cela fait plus de cinq mois que je m'y suis mis. Mon obstination a enfin porté ses fruits. De tous les messages que j'avais reçus, je n'ai retenu que les encouragements de BruNews et scolinks qui s'y etait mis lui aussi (merci à tous les deux).

Commentaire de T_Mehdi le 12/02/2005 00:19:02

salut j'ai une petit question bete xD je c pas ce que f ton programme au juste apart afficher une page web
xD( c sur que si ta eux 10/10 c que il ya des trucs vraimment plus avancer que j'ai pas pue constater ^^)

Merci de votre reponce

Commentaire de scolinks le 12/02/2005 13:34:55

c'est une implementation de controle activeX sous win32 api (avec la meme methode tu peux utiliser plein d'autre controles...) ... l'utilisation du navigateur n'est qu'une example...

Commentaire de Urgo le 17/02/2005 22:40:21

J'ai trouvé pour les clignotements... c'était très bête à eradiquer

Commentaire de racpp le 26/02/2005 23:21:23 administrateur CS

Urgo > Tu peux nous dire comment tu  as fairt?  C'est bon à savoir. Merci.

Commentaire de vecchio56 le 07/06/2005 13:50:34 administrateur CS

Racpp, pour enlever le clignotement tu ajoutes le style WS_CLIPCHILDREN à la fenêtre conteneur

Commentaire de vecchio56 le 07/06/2005 13:57:27 administrateur CS

Mais pourquoi créer un EDIT au lieu d'utiliser directement la fenêtre principale comme conteneur? (ca marche très bien sans)

Commentaire de racpp le 11/06/2005 15:40:40 administrateur CS

Salut,
coucou720 >> J'avoue ne pas avoir bien compris ta question. Dans ce code, c'est l'activex WebBrowser qui affiche la page web dans un conteneur. Si tu veux utiliser un autre activex, tu dois d'abord te documenter suffisamment sur ce dernier. Beaucoup d'activex contiennent une définition des types. Pour la récupérer dans ton tode tupeux utiliser la directive #import suivie du chemin complet de ton OCX comme ceci:
#import "c:\\windows\\system32\\MonDossier\\Monocx.ocx
Ainsi, tu pourras créer des instances des interfaces de cet ocx. Il faut donc bien connaitre ces interfaces. Une autre solution consiste à utiliser le SDK fournit par le créateur de l'activex. Ce SDK contient alors tous les fichiers nécessaires à la compilation.

vecchio56 >> J'avais déja pensé et essayé ce style mais ca ne change rien. Tu l'as testé avec ce code? Merci quand-même.
Bien sûr que ca marche dans la fenêtre principale. J'ai mis un EDIT juste comme exemple pour montrer qu'on peut utiliser n'importe quel controle comme conteneur.

A bientôt.

Commentaire de theXman le 22/01/2006 18:19:52

salut

sais-tu comment utiliser un proxy avec l'ActiveX WebBrowser???

Merci

Commentaire de bigzooloo le 14/02/2006 14:28:49

Bonjour,

Je viens de me mettre (temporairement) à l'utilisation des ActiveX, mais je n'aime pas les MFC et autres ATL...

CPPFrance étant mon premier site de recherche, je suis facilement tomber sur ce code et je t'en remercie.

J'ai testé ton code dans mon programme et cela fonctionne très bien.
Cependant, j'aimerai utiliser un autre ActiveX qui permet de récupérer un flux vidéo (MPEG4) en provenance d'une caméra IP : mais je ne sais pas comment faire.

Autre précision, je ne veux pas le flux tel quel mais plutôt la succession d'images (à 25 img/sec) qui constituent le flux pour effectuer un traitement dessus et les enregistrer (dans un buffer ou autre).

J'ai à disposition :
- la documentation du SDK (en anglais) qui précise uniquement la marche à suivre avec les MFC.
- le fichier "MediaDBPlayback.dll" qui est l'ActiveX. (Du moins, d'après ce que j'ai compris).
- deux fichiers "mediaplayback.h" et "mediaplayback.cpp" qui contiennent l'implémentation de la classe "CMediaPlayBack : public CWnd"

Je peux vous envoyer les fichiers si besoin.

Quelqu'un peut m'aider ?

Merci.

Commentaire de yserver le 16/02/2006 20:31:41

C'est parfait, Merci.
Une question au passage, je souhaite pouvoire empecher le clic droit est ce possible a partir de ce WebBroser.
Je part a la cpeche au renseignement de mon coté.

Felicitation.

Commentaire de racpp le 19/02/2006 12:02:28 administrateur CS

Salut,
theXman > Désolé, j'en n'ai aucune idée.
bigzooloo > Je ne connais pas cet Activex. Pour bien maitriser la programmation des composants COM/OLE/Activex, il faut juste s'entrainer avec des exemples simples pendant un certain temps. Ensuite, tu attaqueras les composants plus complexes. La documentation du composant est indispensable car il faut connaitre le role de chaque interface et ses méthodes. Après avoir bien compris le fonctionnement de ton Activex, je pense que tu pourras adapter ton code pour l'utiliser sans MFC. Ca prendra assez de temps et c'est pour cela que je ne peux tester cet Activex pour toi. Bon courage.
yserver > Parmi les solutions, je pense que tu peux faire un hook souris pour intercepter et bloquer tous les clics droits dans ton application. Il pourrait y avoir une meilleure solution. Si je la trouve je te la dirai.

Commentaire de bigzooloo le 19/02/2006 13:29:11

Merci pour les encouragements...

Désolé, je crois avoir mal formuler ma question.

J'ai déjà utilisé des SDK de différents périphériques (carte d'acquisition et autres) mais ils étaient définies comme des classes C++ "normales". Ici, le problème n'est pas de savoir comment il fonctionne, mais plutôt comment le déclarer.

De plus, je me suis aperçu qu'il y avait un second SDK pour la même caméra IP. Celui-ci dispose de toutes les méthodes nécessaires pour récupérer la succession d'images et non le flux MPEG4.

L'ActiveX est déclaré dans "VitaminCtrl.dll". (J'imagine que tu ne connais pas non plus?)

Il me reste encore une dizaine de jours pour trouver la solution...

Commentaire de racpp le 20/02/2006 13:17:43 administrateur CS

bigzooloo > Tu peux utiliser, juste après les includes, la directive #import suivie du chemin complet de ta dll VitaminCtrl.dll, ainsi ton compilateur reconnaitra toutes les interfaces et tous les types de données exportés par l'Activex.

Commentaire de bigzooloo le 20/02/2006 17:14:25

La directive #import ne provoque pas d'erreur à la compilation mais ne me donne rien de plus...

Lorsque j'inclu l'activeX dans un projet MFC, il crée automatiquement deux fichiers (.h et .cpp). Voici un extrait du .h :

#if !defined(AFX_VITAMINCTRL_H__04710852_2362_4462_828D_4F0051188B4E__INCLUDED_)
#define AFX_VITAMINCTRL_H__04710852_2362_4462_828D_4F0051188B4E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file.  If this class is regenerated by
//  Microsoft Visual C++, your modifications will be overwritten.

/////////////////////////////////////////////////////////////////////////////
// CVitaminCtrl wrapper class

class CVitaminCtrl : public CWnd
{
protected:
DECLARE_DYNCREATE(CVitaminCtrl)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x70edcf63, 0xca7e, 0x4812, { 0x85, 0x28, 0xda, 0x1e, 0xa2, 0xfd, 0x53, 0xb6 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }

    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey); }

// Attributes
public:

// Operations
public:
CString GetUrl();
...
... autres méthodes
...
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_VITAMINCTRL_H__04710852_2362_4462_828D_4F0051188B4E__INCLUDED_)


Mais je ne peux pas le faire dans un projet non MFC.
Et si j'inclu les deux fichiers a la main dans le projet non MFC, j'ai enormement d'erreurs à la compilation : erreur à chaque ligne contenant CString ou CWnd

Je suis toujours bloqué.
Merci.

Commentaire de racpp le 20/02/2006 18:57:09 administrateur CS

Tu peux utiliser l'outil "OLE Viewer" de Visual Studio pour connaitre la définition des types et les paramètres d'entrée et de sortie des méthodes de chaque interface de ton Activex. L'utilisation de #import seule ne suffit pas car il faut déclarer, par exemple, tes pointeurs  conformément aux types exportés par la DLL de ton Activex.

Commentaire de bigzooloo le 21/02/2006 17:08:50

Voici ce que j'obtiens avec "OLE Viewer" :

Interface =
    {000D2C68-B46B-461C-B5EC-83AC5202FE2C} = IVitaminCtrl
        ProxyStubClsid = {00020424-0000-0000-C000-000000000046}
        ProxyStubClsid32 = {00020424-0000-0000-C000-000000000046}
        TypeLib [<no name>] = {9D2CED0F-39D2-4A1E-BA42-428F7D9D4EEB}
        TypeLib [Version] = 1.0
CLSID =
    {00020424-0000-0000-C000-000000000046} = PSOAInterface
        InprocServer = ole2disp.dll
        InprocServer32 [<no name>] = oleaut32.dll
        InprocServer32 [ThreadingModel] = Both
TypeLib =
    {9D2CED0F-39D2-4A1E-BA42-428F7D9D4EEB}
        1.0 = VitaminDecoder 1.0 Type Library
            0
                win32 = C:\Program Files\VitaminCtrl\lib\VitaminCtrl.dll
            FLAGS = 0
            HELPDIR = C:\Program Files\VitaminCtrl\lib


A partir de ces données, j'ai ce code source :

#import "C:/Program Files/VitaminCtrl/lib/VitaminCtrl.dll"

DEFINE_GUID(IID_IVitaminCtrl,
    0x000D2C68, 0xB46B, 0x461C, 0xB5, 0xEC, 0x83, 0xAC, 0x52, 0x02, 0xFE, 0x2C);
DEFINE_GUID(CLSID_IVitaminCtrl,
    0x00020424, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);

...
VITAMINDECODERLib::IVitaminCtrl *pVC;
CoCreateInstance(CLSID_IVitaminCtrl,0,CLSCTX_ALL,IID_IVitaminCtrl,(void**)&pVC);
ErrorExit("CoCreateInstance") ;
AtlAxAttachControl(pVC,conteneur,0);
pVC->get_ControlID(&val);
...

Ceci compile sans problème, je peux même ajouter que VC .net liste toutes les méthodes de l'interface en tapant pVC->. Donc, il a l'air de comprendre.

Mais à l'exécution, j'ai une erreur (avec la fonction ErrorExit) :
"CoCreateInstance failed with error 14007 : La clé de recherche requise n'a été trouvée dans aucun contexte d'activation actif."

Désolé de t'embetter encore mais j'en ai vraiment besoin.

Commentaire de racpp le 22/02/2006 00:19:34 administrateur CS

La définition de CLSID_IVitaminCtrl n'est pas correcte.
Les données que tu as montrées correspondent à l'interface IVitaminCtrl. Pour trouver le CLSID du composant Activex, il faut cliquer sur son nom. C'est lui qui est précédé par + ou - dans la liste. C'est lui qui contient l'interface IVitaminCtrl parmi d'autres. Dans le volet droit de OLE Viewer, Le CLSID est toujours suivi par le signe = puis le nom du composant. Voici un exemple montrant le début des données affichées par OLE Viewer pour le composant "Shockwave Flash Object":

CLSID={1A03F196-9617-4CA0-842B-A83CEECB022B}
  {D27CDB6E-AE6D-11CF-96B8-444553540000}=Shockwave Flash Object

Le CLSID est donc celui de la 2eme ligne.
Bonne chance.

Commentaire de bigzooloo le 22/02/2006 13:26:45

Merci beaucoup, ca marche !
Il ne me reste plus qu'a utiliser les bonnes méthodes pour obtenir ce que je veux et voila.

Commentaire de bigzooloo le 25/02/2006 17:55:54

C'est encore moi... :)
Effectivement, ca fonctionne (presque) comme je veux, j'arrive à obtenir mes 25 images par secondes.

Actuellement, j'utilise un timer (40 ms) pour effectuer une capture de la vidéo. Mais la synchronisation est un peu aléatoire. Si l'image de la caméra est prète au moment t, je la récupère entre le moment t et t+39 ms.

J'ai vu dans le SDK qu'il y avait un évènement (ou plutôt un CallBack) généré (ou appelé) à chaque nouvelle image. Ma question est (bien sur) : comment récupérer cet évènement sans MFC ?

un exemple avec MFC :

BEGIN_EVENTSINK_MAP(CMyDlg, CDialog)
ON_EVENT(CMyDlg, IDC_VitaminCtrl, 9, OnNewVideoVitaminCtrl, VTS_BOOL VTS_BOOL VTS_PVARIANT)
END_EVENTSINK_MAP()

void CMyDlg::OnNewVideoVitaminCtrl(BOOL bSignal, BOOL bDecodedImg, VARIANT* vPiece)
{
   // CallBack appelé a chaque nouvelle image : parfait pour la synchronisation
}

Merci.

Commentaire de racpp le 26/02/2006 18:32:52 administrateur CS

Salut,
Ton Activex doit posséder une interface dédiée à l'interception des événements. Cette interface doit figurer dans la liste dans OLE View. Il faudra recopier les prototypes de toutes ses méthodes dans le bon ordre. Chaque méthode correspond à un événement. Tu créeras ensuite une classe implémentant ces méthodes. Dans mon code source "Navigateur Web" tu trouveras un exemple de classe implémentant le traitement de ce genre d'événement. Elle envoit un message à la procédure de la fenêtre du programme chaque fois que l'évènement voulu est intercepté. J'espère que ton Activex est basé sur le même principe.

Commentaire de bigzooloo le 27/02/2006 14:57:13

Salut,
Franchement, je n'ai qu'une chose à dire : total respect !
Ca marche nikel du premier coup.
Ca mérite un 12/10 :-)

Commentaire de maybil_gi le 13/03/2006 15:13:06

salut tout le monde, y a t il quelqu'un qui a un code source en java pour un navigateur web? merci d'avance

Commentaire de jimmyplante le 06/04/2006 17:02:07

SUper code !! 10/10
Cependant, j'essaye de faire le même traitement à partir d'un bouton que j'ai dans un dialog et sa ne marche pas. Est-ce que tu saurais comment ?

Commentaire de racpp le 03/05/2006 17:41:41 administrateur CS

Salut,
jimmyplante > Il faut donner d'autres précision pour mieux voir le problème. Que veux-tu faire exactement?

Commentaire de matt22 le 16/08/2006 11:54:10

Salut,

je débute un peu et je n'ai pas tout compris...
est ce que quelqu'un aurais le meme source mais avec l'activeX flash, car c mon objectif et ça m'aiderais en comparant les 2 sources à bien comprendre le fonctionnement ?!

Merci d'avance...

Commentaire de racpp le 16/08/2006 17:03:23 administrateur CS

Salut,
Voici le code source utilisant l'Activex Flash:
http://www.cppfrance.com/code.aspx?ID=33091

Commentaire de igloobuster le 20/10/2006 14:53:13

salut, voila mon bout de code :

IDispatch   *g_pMSFlexGrid;
if (CoCreateInstance(m_clsid,0,CLSCTX_ALL,IID_IDispatch,(void**)&g_pMSFlexGrid) != S_OK)
  return FALSE;
AtlAxAttachControl(g_pMSFlexGrid,conteneur, NULL);

j'ai legerement modifié le tient pour avoir un MSFlexGrid au lieu d'un WebBrowser, le probleme est au moment de AtlAxAttachControl qui me donne cette erreure :

First-chance exception in Conteneur.exe (MSFLXGRD.OCX): 0xC0000005: Access Violation.

Voila en gros mon probleme...

Commentaire de ASEBT le 20/03/2007 13:27:20

Bonjour,

Comment fait tu pour récupérer le code la page , une fois que la page est chargé complement ?

Commentaire de pianopariss le 20/06/2007 16:29:50

Très bon code, très pratique.
10 ! ;-)

Commentaire de hakim0 le 18/09/2007 16:09:10

Bravo,
j'ai 2 questions:
1- Comment on peut executer une function Jscript sur le document html.
2- Comment intercepter le lien url sur l'evenemenet BEFORENAVIGATE2.
onn effet m'application doit avoir une interface html donc j'ai besoin de s'avoir comment communiquer avec le WebBrowser.
Merci pour votre reponse.

Commentaire de racpp le 24/09/2007 18:49:56 administrateur CS

hakim0 >> 1- Tu peux regarder du côté de l'interface IHTMLDocument2.
2- Regarde mon code source:
http://www.cppfrance.com/codes/NAVIGATEUR-WEB-API_29247.aspx
Dans la classe d'interception des événements, je capture l'url  dans la méthode Invoke() pendant le traitement de DISPID_NAVIGATECOMPLETE2. Je n'ai pas testé, mais ça devrait être pareil pour la capturer dans DISPID_BEFORENAVIGATE2. Dans tous les cas, l'url figure bien parmi les paramètres interceptés dans Invoke().

Commentaire de hakim0 le 28/09/2007 19:21:52

Merci racpp, je suis arriver d'executer le script par IHTMLDocument2,
avec les methode get_script est invoke...
2- Le problem rest ici j'arrive pas a attendre le lien sur l'evenement onbevornavigate2, seulement en
DOCUMENTCOMPLETE aec la methode pIWEB->get_LocationURL(),
par ce que je veut intercepter le lien avant que le browser navigue pour dicider de lui stoper ou non!
Merci pour une reponse.

Commentaire de shuttleur le 12/03/2008 16:38:31

Bonjour,

Comment visual c++ connait-il l'interface IWebBrowser2 et d'où connait-il les méthodes Play() et Release() de l'interface ?

En fait, je ne parviens pas à lancer un ActiveX (non connu), que dois-je inclure dans ce projet pour que mon ActiveX soit reconnu et lancé ?

Merci d'avance à tous.




Commentaire de hakim0 le 27/03/2008 11:59:21

slt,
ton active x doit etres installer, tu doit connaitre son id pour le charger, et tu doit conaitre linterface de ce active-x contacter le vendeur ou le devloppeur d ce active-x :)

Commentaire de piou_31 le 24/04/2008 13:47:55

Bonjour,

quelqu'un a-t-il déja réussi à adapter ce code pour utiliser acrobat reader?
Pour moi ca ne marche pas.

Cdlt

Commentaire de yex le 30/05/2008 17:19:49

Pour ajouter la possibilité d'utiliser les racourcis clavier ctrl+c et autres deux petites modifications sont necessaires :

1) remplacer CoInitialize(0); par OleInitialize(0); et CoUninitialize(); par OleUninitialize(0);

2) Get message devient
MSG Msg;
while( GetMessage(&Msg, 0, 0, 0))
{
            // MSDN : calling IOleInPlaceActiveObject::TranslateAccelerator from your
            // container's message loop before doing any other translation
            if (Msg.message==WM_KEYDOWN)
            {
                IOleInPlaceActiveObject* pIOIPAO;
                HRESULT hr =  pIwb->QueryInterface (IID_IOleInPlaceActiveObject,  (void**)&pIOIPAO);
                hr = pIOIPAO->TranslateAccelerator(&Msg);
                pIOIPAO->Release();
                // MSDN : You should apply your own translation only when this method returns S_FALSE
                if (hr == S_OK)
                    continue;
            }
            TranslateMessage( &Msg );
            DispatchMessage( &Msg );
}

Commentaire de SebLinck le 05/06/2008 16:56:39

bonjour,

J'ai exactement la même problématique que bigzooloo, mais j'utilise une caméra Axis 210.
j'ai donc suivi toutes les recommandations qui lui ont été faites, mais j'ai une erreur de compilation avec:

#import "C:/Program Files/Axis Communications/Components/AxMP4Dec.dll"

la dll est pourtant bien présente dans ce répertoire.

autre chose, lorsque je regarde le composant AxisMediaControl avec OLE viewer, je n'obtiens que:

TypeLib =
    {9D2CED0F-39D2-4A1E-BA42-428F7D9D4EEB}
        1.0 = AxisMediaControl 1.0 Type Library
            0
                win32=C:\Program Files\Axis Communications\Components\AxisMediControl.dll
            FLAGS = 0
            HELPDIR = C:\Program Files\Axis Communications\Components\

je vous donne le .cpp:
----------------------------------------------------------------------------------------
#include <windows.h>
#include <exdisp.h>

#import "C:/Program Files/Axis Communications/Components/AxMP4Dec.dll"

DEFINE_GUID(IID_IAxisMediaControl,0x19722801, 0x5830, 0x4EC4, 0xBD, 0x69, 0xC3, 0xCF, 0x70, 0x77, 0x6E, 0x0E);
DEFINE_GUID(CLSID_IAxisMediaControl,0xA48F4EE0, 0xB408, 0x4376, 0xB4, 0xC9, 0xBC, 0x9C, 0xF6, 0xE1, 0x6E, 0xBC);



// Déclaration du HWND de notre conteneur en global:
HWND conteneur;

/***************** Procédure de notre fenêtre principale *********************/
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
{
switch(messg)
{
case WM_SIZE:
// Redimensionnement du conteneur quand la taille de la fenêtre change:
MoveWindow(conteneur,0,0,LOWORD(lParam), HIWORD(lParam),1);
break;

case WM_CLOSE:
// Détruire la fenêtre principale:
DestroyWindow(hWnd);
break;

case WM_DESTROY:
// Envoyer le message de sortie du programme:
PostQuitMessage( 0 );
break;

default:
//Retour:
return( DefWindowProc( hWnd, messg, wParam, lParam ) );
}
return 0;
}
/***************************************************************************/

/********************* Fonction WinMain ************************************************/
int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
{

// Déclarer notre classe de fenêtre et définir ses membres:
WNDCLASS wc;
char NomClasse[]    = "Conteneur";
wc.lpszClassName = NomClasse;
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor( 0, IDC_ARROW );
wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
wc.lpszMenuName     = 0;
wc.hbrBackground = 0;
wc.style = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
// Enregistrer la classe de notre fenêtre:
if (!RegisterClass(&wc)) return 0;

// Créer notre fenêtre principale:
HWND hWnd = CreateWindow( NomClasse,"Conteneur Activex",WS_OVERLAPPEDWINDOW,0,0,800,575, 0, 0, hInst,0);
// Montrer la fenêtre:
ShowWindow(hWnd, nCmdShow );
UpdateWindow( hWnd );

// Charger la DLL "atl.dll" pour notre programme:
HINSTANCE hDLL = LoadLibrary("atl.dll");
// Définir le type de pointeur pour la fonction "AtlAxAttachControl":
typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
// Récupérer l'adresse de la fonction "AtlAxAttachControl":
PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
// Obtenir les dimensions de notre fenêtre:
RECT rect;
GetClientRect(hWnd,&rect);
// Créer l'EDIT qui servira de conteneur Activex:
conteneur=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
// Initialiser la librairie COM pour notre programme:
CoInitialize(0);
// Déclarer un pointeur sur l'interface IWebBrowser2:
AXISCONTROLMEDILLib::IAxisMediaControl   *pIwb;
// Créer une instance de l'objet WebBrowser et de l'interface IWebBrowser2:
CoCreateInstance(CLSID_IAxisMediaControl,0,CLSCTX_ALL,IID_IAxisMediaControl,(void**)&pIwb);
// Attacher l'objet WebBrowser à notre EDIT conteneur:
AtlAxAttachControl(pIwb,conteneur,0);
// Lancer la page de démarrage:
pIwb->GoHome();

// Boucle des messages:
MSG Msg;
while( GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}

// Libérer l'interface IWebBrowser2:
pIwb->Release();
// Fermer la librairie COM pour notre programme:
    CoUninitialize();
// Fermer la DLL "atl.dll":
FreeLibrary(hDLL);
// Quitter le programme:
return( Msg.wParam);
}

----------------------------------------------------------------------------------

Si quelqu'un avait un piste, j'ai vraiment besoin d'utiliser cette ActiveX sans MFC.
merci d'avance

Commentaire de bigzooloo le 05/06/2008 22:12:37

Salut,

Si tu m'envoi ta lib pour cette caméra, je veux bien essayer de résoudre ton pb !
Je te donnerai mon mail en MP si ca t'interesse.

A+

Commentaire de bigzooloo le 10/06/2008 18:43:40

Salut, désolé du retard...

1- ta déclaration de CLSID_IAxisMediaControl est fausse...
il faut que tu te réfères au CLSID de la classe et non au TypeLib dans OleView
(CLSID = 745395C8-D0E1-4227-8586-624CA9A10A8D)

2- lors de l'installation du SDK dans le lien que tu m'as donné, je n'ai pas ce fichier "AxMP4Dec.dll"... je dirai qu'il faut plutôt inclure "AxisMediaControl.dll" et utiliser l'interface IAxisMediaControl.

3- attention au copier-coller :-)
ca m'étonnerai que ta lib ait une fonction "GoHome()"

Voila, j'espère que ca t'aidera

Commentaire de SebLinck le 02/07/2008 14:09:55

Désolé également,

1- Je n'ai rien d'autre dans OLEviewer que ce que j'ai collé

2- Effectivement,il faut plutôt inclure "AxisMediaControl.dll" et utiliser l'interface IAxisMediaControl

3- :-)

Je RE-teste tout ça prochainement.

Commentaire de HeavenForsaker le 06/10/2009 11:54:41

Bravo racpp pour cet excellent code.

Quand on sélectionne du texte sur la page puis clique droit, la fonction copier coller ne fonctionne pas (c'est la seule d'ailleurs), y a t-il moyen de l'activer ?

 Ajouter un commentaire




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,733 sec (4)

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