begin process at 2012 02 13 00:18:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > LECTEUR D'ANIMATIONS FLASH (100% API)

LECTEUR D'ANIMATIONS FLASH (100% API)


 Information sur la source

Note :
10 / 10 - par 7 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :lecteur, flash Niveau :Débutant Date de création :05/08/2005 Vu / téléchargé :17 641 / 1 454

Auteur : racpp

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

 Description

Cliquez pour voir la capture en taille normale
Voici un autre exemple d'utilisation d'un Activex dans un programme win32 en pur API. Il s'agit de l'Activex Shockwave Flash de Macromedia présent dans pratiquement tous les ordinateurs sous Windows. Ce code source montre comment afficher une animation Flash dans la fenêtre d'une application. Voici la desciption de quelques fichiers du projet:
1- swf.h : Contient quelques définitions et surtout une fonction de récupération de données à partir de l'en-tête du fichier swf chargé.
2- zlib.dll : Contient la fonction uncompress() utilisé pour extraire la partie compressée d'un en-tête swf. Cette dll est gratuite : www.zlib.net
3- flash.h : Je l'ai conçu à partir des données fournies par l'outil OLE/COM Viewer de Visual C/C++ 6. Il contient deux GUID et le prototype de l'interface IShockwaveFlash avec toutes ses méthodes.

Projet réalisé sous Visual 6 et testé sous Windows XP sans problème. Je pense que ce sera pareil pour les autres versions de Windows.
Testez le et n'hésitez pas à signaler des bogues ou erreurs éventuelles (merci). Vos commentaires, suggestions et questions sont les bienvenus.

Source

  • // Les includes:
  • #include <windows.h>
  • #include "swf.h"
  • #include "flash.h"
  • // Déclarer un pointeur sur l'interface IShockwaveFlash:
  • IShockwaveFlash *pIswf;
  • // Déclarer le HWND de notre conteneur Activex en global:
  • HWND hConteneur;
  • // ----------- Fonction permettant de calculer la position et les dimensions de l'animation dans la fenêtre:
  • void PosDim (HWND wnd,int largeur, int hauteur, RECT* rec)
  • {
  • // Obtenir les dimensions de la zone interne de la fenêtre:
  • RECT wndrec;
  • GetClientRect(wnd,&wndrec);
  • // Fixer la largeur et hauteur utiles dans la fenêtre:
  • int wndlarg=wndrec.right-6;
  • int wndhaut=wndrec.bottom-38;
  • // Déclaration d'un float pour calculer les rapports:
  • float rap;
  • // Si les dimensions de l'animation sont inférieurs à la fenêtre:
  • if (largeur<=wndlarg && hauteur<=wndhaut)
  • {
  • // Centrer le rectangle:
  • rec->left=(wndlarg-largeur)/2+2;
  • rec->top=((wndhaut-hauteur)/2+2);
  • rec->right=largeur;
  • rec->bottom=hauteur;
  • return;
  • }
  • // Si seule la hauteur est supérieure à la fenêtre:
  • if (largeur<=wndlarg && hauteur>wndhaut)
  • {
  • // Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
  • rap=(float)hauteur/wndhaut;
  • rec->right=(long)(largeur/rap);
  • rec->bottom=wndhaut;
  • rec->left=(wndlarg-rec->right)/2+2;
  • rec->top=2;
  • return;
  • }
  • // Si seule la largeur est supérieure à la fenêtre:
  • if (largeur>wndlarg && hauteur<=wndhaut)
  • {
  • // Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
  • rap=(float)largeur/wndlarg;
  • rec->right=wndlarg;
  • rec->bottom=(long)(hauteur/rap);
  • rec->left=2;
  • rec->top=(wndhaut-rec->bottom)/2+2;
  • return;
  • }
  • // Si la largeur et la hauteur sont supérieurs à la fenêtre:
  • if (largeur>wndlarg && hauteur>wndhaut)
  • {
  • // Déterminer les rapports avec les dimensions maximales de la fenêtre:
  • float rapx=(float)largeur/wndlarg;
  • float rapy=(float)hauteur/wndhaut;
  • // si le rapport de la largeur est plus grand:
  • if (rapx>rapy)
  • {
  • // Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
  • rec->right=wndlarg;
  • rec->bottom=(long)(hauteur/rapx);
  • rec->left=2;
  • rec->top=(wndhaut-rec->bottom)/2+2;
  • return;
  • }
  • // si le rapport de la hauteur est plus grand:
  • if (rapx<=rapy)
  • {
  • //Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
  • rec->right=(long)(largeur/rapy);
  • rec->bottom=wndhaut;
  • rec->left=(wndlarg-rec->right)/2+2;;
  • rec->top=2;
  • return;
  • }
  • }
  • }
  • //-----------------------------------------------------------------------------------//
  • //------------------- Procédure de notre fenêtre principale -----------------------//
  • LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
  • {
  • // Déclaration des variables:
  • static HWND hOuvrir,hLire,hArret,hRembob, hQuitter,hCadre1, hCadre2;//.....
  • static SWFINFOS swi;
  • // Interception et traitement des messages:
  • switch(messg)
  • {
  • case WM_CREATE:
  • // Créer tous les controles:
  • hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hWnd,0,0,0);
  • hLire=CreateWindow("BUTTON","Lire",WS_CHILD | WS_VISIBLE,170,428,90,20,hWnd,0,0,0);
  • hArret=CreateWindow("BUTTON","Arrêter",WS_CHILD | WS_VISIBLE,270,428,90,20,hWnd,0,0,0);
  • hRembob=CreateWindow("BUTTON","Rembobiner",WS_CHILD | WS_VISIBLE,370,428,90,20,hWnd,0,0,0);
  • hQuitter=CreateWindow("BUTTON","Quitter",WS_CHILD | WS_VISIBLE,520,428,90,20,hWnd,0,0,0);
  • hCadre1=CreateWindow("BUTTON","",BS_GROUPBOX | WS_CHILD | WS_VISIBLE,15,415,600,37,hWnd,0,0,0);
  • hCadre2=CreateWindow("STATIC","",SS_SUNKEN | SS_CENTER | WS_CHILD | WS_VISIBLE,0,0,632,420,hWnd,0,0,0);
  • break;
  • case WM_COMMAND:
  • if( (HWND)lParam == hOuvrir)
  • {
  • // Déclarer et intialiser un buffer:
  • char tampon[MAX_PATH];
  • tampon[0]=0;
  • // Déclarer une structure OPENFILENAME:
  • OPENFILENAME ofn;
  • // Mettre tous les membres de la structure à 0:
  • memset( &ofn, 0, sizeof(OPENFILENAME) );
  • // Définir les membres:
  • ofn.lStructSize = sizeof(OPENFILENAME);
  • ofn.hwndOwner = hWnd;
  • ofn.lpstrFilter = "Animations Macromedia Flash\0*.swf\0\0";
  • ofn.lpstrFile = tampon;
  • ofn.nMaxFile = MAX_PATH;
  • ofn.lpstrTitle = "Choisir un fichier :";
  • ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  • // Lancer la boite de dialogue pour choisir un fichier:
  • if(!GetOpenFileName(&ofn)) break;
  • // Lire l'en-tête du fichier pour obtenir des infos sur l'animation:
  • if(!LireEnTete(tampon,&swi))
  • {
  • // Afficher un message d'erreur quand le fichier n'est pas valide:
  • MessageBox(hWnd,"\nLe fichier que vous avez tenté d'ouvrir n'est pas une animation Flash valide.","Lecteur d'animations Flash",0);
  • break;
  • }
  • // Obtenir la version du composant ShockwaveFlash installé:
  • long version;
  • pIswf->FlashVersion(&version);
  • if(swi.version>HIWORD(version))
  • {
  • // Afficher un message d'erreur quand la version de l'animation est plus récente que le composant installé:
  • MessageBox(hWnd,"\nLa version de cette animation est plus récente que celle du composant installé.","Lecteur d'animations Flash",0);
  • break;
  • }
  • // Appel de la fonction qui calcule la position et les dimensions du conteneur:
  • RECT rct;
  • PosDim(hWnd,swi.largeur,swi.hauteur,&rct);
  • // Positionner le conteneur:
  • MoveWindow(hConteneur,rct.left,rct.top,rct.right,rct.bottom,1);
  • // Initialiser la couleur de fond de l'animation:
  • pIswf->put_BackgroundColor(swi.fond);
  • // Convertir le chemin en UNICODE:
  • WCHAR fichier[MAX_PATH];
  • MultiByteToWideChar (CP_ACP, 0, tampon, -1, fichier, MAX_PATH+1);
  • // Charger et jouer l'animation:
  • pIswf->put_Movie(fichier);
  • break;
  • }
  • // Clic sur le bouton "Arrêter":
  • if((HWND)lParam == hArret)
  • {
  • pIswf->Stop();
  • break;
  • }
  • // Clic sur le bouton "Lire":
  • if((HWND)lParam == hLire)
  • {
  • pIswf->Play();
  • break;
  • }
  • // Clic sur le bouton "Rembobiner":
  • if((HWND)lParam == hRembob)
  • {
  • pIswf->Rewind();
  • break;
  • }
  • // Clic sur le bouton "Quitter":
  • if((HWND)lParam == hQuitter)
  • {
  • // Envoi du message WM_CLOSE à notre fenêtre:
  • SendMessage(hWnd,WM_CLOSE,0,0);
  • }
  • 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 à la procédure par défaut:
  • return( DefWindowProc( hWnd, messg, wParam, lParam ) );
  • }
  • return 0;
  • }
  • //---------------------------------------------------------------------------------//
  • //------------------------------ Fonction WinMain -----------------------------------------//
  • int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
  • {
  • // Charger la zlib.dll:
  • HINSTANCE hDLL1 = LoadLibrary("zlib.dll");
  • // Si dll introuvable alors l'installer à partir de la resoource:
  • if (!hDLL1)
  • {
  • // Obtenir le chemin complet de l'application:
  • char path[MAX_PATH];
  • DWORD longueur=GetModuleFileName(0,path,MAX_PATH);
  • // Supprimer le nom de fichier du chemin:
  • for(int i=longueur;i>0;i--)
  • {
  • if (path[i]=='\\') {path[i]=0; break;}
  • }
  • // Ajouter le nom de la dll au chemin:
  • lstrcat(path,"\\zlib.dll");
  • // Trouver la ressource:
  • HRSRC DLLressource=FindResource(0,"ID_DLL","RT_RCDATA");
  • // Déterminer sa taille:
  • DWORD taille=SizeofResource(0,DLLressource);
  • // Charger la ressource en mémoire:
  • HGLOBAL hRessource=LoadResource(0,DLLressource);
  • // Obtenir un pointeur sur cette zone mémoire:
  • LPVOID pointeur=LockResource(hRessource);
  • // Créer le fichier destination:
  • HANDLE hFichier=CreateFile(path,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  • // Copier la ressource dans le fichier:
  • DWORD ecrits;
  • WriteFile(hFichier,pointeur,taille,&ecrits,0);
  • // Fermer le fichier:
  • CloseHandle(hFichier);
  • // Libérer la ressource de la mémoire:
  • FreeResource (hRessource);
  • // Charger la dll en mémoire:
  • hDLL1 = LoadLibrary("zlib.dll");
  • // Si erreur de chargement de la dll alors quitter:
  • if (!hDLL1) return 1;
  • }
  • // Obtenir un pointeur sur la fonction "uncompress":
  • uncompress = (Puncompress) GetProcAddress(hDLL1,"uncompress");
  • // Définir type de pointeur pour la fonction AtlAxAttachControl:
  • typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
  • // Charger la atl.dll:
  • HINSTANCE hDLL2 = LoadLibrary("atl.dll");
  • // Si dll non chargée alors quitter:
  • if (!hDLL2) return 1;
  • // Obtenir pointeur sur la fonction AtlAxAttachControl:
  • PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL2, "AtlAxAttachControl");
  • // Déclarer notre classe de fenêtre et définir ses membres:
  • WNDCLASS wc;
  • char NomClasse[] = "Lecteur_Flash";
  • wc.lpszClassName = NomClasse;
  • wc.hInstance = hInst;
  • wc.lpfnWndProc = WndProc;
  • wc.hCursor = LoadCursor( 0, IDC_ARROW );
  • wc.hIcon = LoadIcon( hInst, "ID_ICO" );
  • wc.lpszMenuName = 0;
  • wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
  • wc.style = 0;
  • wc.cbClsExtra = 0;
  • wc.cbWndExtra = 0;
  • // Enregistrer la classe de notre fenêtre:
  • if (!RegisterClass(&wc)) return 0;
  • // Obtenir la hauteur de la barre de titre:
  • int barre=GetSystemMetrics(SM_CYCAPTION);
  • // Créer notre fenêtre principale:
  • HWND hWnd = CreateWindow( NomClasse," Lecteur d'animations Flash",WS_SYSMENU | WS_MINIMIZEBOX ,0,0,640,460+barre, 0, 0, hInst,0);
  • // Montrer la fenêtre:
  • ShowWindow(hWnd, nCmdShow );
  • UpdateWindow( hWnd );
  • // Créer notre EDIT conteneur:
  • hConteneur=CreateWindow("STATIC","",WS_CHILD | WS_VISIBLE ,0,0,0,0,hWnd,0,0,0);
  • // Initialiser la librairie COM:
  • CoInitialize(0);
  • // Créer une instance de l'interface IShockwaveFlash:
  • HRESULT res=CoCreateInstance(CLSID_ShockwaveFlash,0,CLSCTX_ALL,IID_IShockwaveFlash,(void**)&pIswf);
  • // Attacher l'interface à notre conteneur:
  • res =AtlAxAttachControl(pIswf,hConteneur,NULL);
  • // Boucle des messages:
  • MSG Msg;
  • while( GetMessage(&Msg, 0, 0, 0))
  • {
  • TranslateMessage( &Msg );
  • DispatchMessage( &Msg );
  • }
  • // Libérer notre instance de IShockwaveFlash;
  • pIswf->Release();
  • // Fermer la librairie COM:
  • CoUninitialize();
  • // Libérer les DLLs:
  • FreeLibrary(hDLL1);
  • FreeLibrary(hDLL2);
  • // Quitter le programme:
  • return( Msg.wParam);
  • }
  • //--------------------------------------------------------------------------------------------------//
// Les includes:
#include <windows.h>
#include "swf.h"
#include "flash.h"

// Déclarer un pointeur sur l'interface IShockwaveFlash:
IShockwaveFlash *pIswf;
// Déclarer le HWND de notre conteneur Activex en global:
HWND hConteneur;

// ----------- Fonction permettant de calculer la position et les dimensions de l'animation dans la fenêtre:
void PosDim (HWND wnd,int largeur, int hauteur, RECT* rec)
{
	// Obtenir les dimensions de la zone interne de la fenêtre:
	RECT wndrec;
	GetClientRect(wnd,&wndrec);
	// Fixer la largeur et hauteur utiles dans la fenêtre:
	int wndlarg=wndrec.right-6;
	int wndhaut=wndrec.bottom-38;
	// Déclaration d'un float pour calculer les rapports:
	float rap;
	// Si les dimensions de l'animation sont inférieurs à la fenêtre:
	if (largeur<=wndlarg && hauteur<=wndhaut)
	{
		// Centrer le rectangle:
		rec->left=(wndlarg-largeur)/2+2;
		rec->top=((wndhaut-hauteur)/2+2);
		rec->right=largeur;
		rec->bottom=hauteur;
		return;
	}
	// Si seule la hauteur est supérieure à la fenêtre:
	if (largeur<=wndlarg && hauteur>wndhaut)
	{
		// Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
		rap=(float)hauteur/wndhaut;
		rec->right=(long)(largeur/rap);
		rec->bottom=wndhaut;
		rec->left=(wndlarg-rec->right)/2+2;
		rec->top=2;
		return;
	}
	// Si seule la largeur est supérieure à la fenêtre:
	if (largeur>wndlarg && hauteur<=wndhaut)
	{
		// Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
		rap=(float)largeur/wndlarg;
		rec->right=wndlarg;
		rec->bottom=(long)(hauteur/rap);
		rec->left=2;
		rec->top=(wndhaut-rec->bottom)/2+2;
		return;
	}
	// Si la largeur et la hauteur sont supérieurs à la fenêtre:
	if (largeur>wndlarg && hauteur>wndhaut)
	{	
		// Déterminer les rapports avec les dimensions maximales de la fenêtre:
		float rapx=(float)largeur/wndlarg;
		float rapy=(float)hauteur/wndhaut;
		// si le rapport de la largeur est plus grand:
		if (rapx>rapy)
		{
			// Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
			rec->right=wndlarg;
			rec->bottom=(long)(hauteur/rapx);
			rec->left=2;
			rec->top=(wndhaut-rec->bottom)/2+2;
			return;
		}
		// si le rapport de la hauteur est plus grand:
		if (rapx<=rapy)
		{
				//Redimensionner le rectangle pour qu'il tienne dans la fenêtre:
				rec->right=(long)(largeur/rapy);
				rec->bottom=wndhaut;
				rec->left=(wndlarg-rec->right)/2+2;;
				rec->top=2;
				return;
		}
	}	
}
//-----------------------------------------------------------------------------------//

//------------------- Procédure de notre fenêtre principale -----------------------//
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
{	
	// Déclaration des variables:
	static HWND hOuvrir,hLire,hArret,hRembob, hQuitter,hCadre1, hCadre2;//.....
	static SWFINFOS swi;

	// Interception et traitement des messages:
	switch(messg)
	{
		case WM_CREATE:
			// Créer tous les controles:
			hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hWnd,0,0,0);
			hLire=CreateWindow("BUTTON","Lire",WS_CHILD | WS_VISIBLE,170,428,90,20,hWnd,0,0,0);
			hArret=CreateWindow("BUTTON","Arrêter",WS_CHILD | WS_VISIBLE,270,428,90,20,hWnd,0,0,0);
			hRembob=CreateWindow("BUTTON","Rembobiner",WS_CHILD | WS_VISIBLE,370,428,90,20,hWnd,0,0,0);
			hQuitter=CreateWindow("BUTTON","Quitter",WS_CHILD | WS_VISIBLE,520,428,90,20,hWnd,0,0,0);			
			hCadre1=CreateWindow("BUTTON","",BS_GROUPBOX | WS_CHILD | WS_VISIBLE,15,415,600,37,hWnd,0,0,0);
			hCadre2=CreateWindow("STATIC","",SS_SUNKEN | SS_CENTER | WS_CHILD | WS_VISIBLE,0,0,632,420,hWnd,0,0,0);
			break;

		case WM_COMMAND:
			if( (HWND)lParam ==  hOuvrir)
			{
				// Déclarer et intialiser un buffer:
				char tampon[MAX_PATH];
				tampon[0]=0;
				// Déclarer une structure OPENFILENAME:
				OPENFILENAME ofn;
                // Mettre tous les membres de la structure à 0:
                memset( &ofn, 0, sizeof(OPENFILENAME) );
                // Définir les membres:
                ofn.lStructSize = sizeof(OPENFILENAME);
				ofn.hwndOwner = hWnd;
                ofn.lpstrFilter = "Animations Macromedia Flash\0*.swf\0\0";				
                ofn.lpstrFile = tampon;
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrTitle = "Choisir un fichier :";
                ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                // Lancer la boite de dialogue pour choisir un fichier:
                if(!GetOpenFileName(&ofn)) break;
				// Lire l'en-tête du fichier pour obtenir des infos sur l'animation:
				if(!LireEnTete(tampon,&swi)) 
				{
					// Afficher un message d'erreur quand le fichier n'est pas valide:
					MessageBox(hWnd,"\nLe fichier que vous avez tenté d'ouvrir n'est pas une animation Flash valide.","Lecteur d'animations Flash",0);
					break;
				}
				// Obtenir la version du composant ShockwaveFlash installé:
				long version;
				pIswf->FlashVersion(&version);
				if(swi.version>HIWORD(version))
				{
					// Afficher un message d'erreur quand la version de l'animation est plus récente que le composant installé:
					MessageBox(hWnd,"\nLa version de cette animation est plus récente que celle du composant installé.","Lecteur d'animations Flash",0);
					break;
				}
				// Appel de la fonction qui calcule la position et les dimensions du conteneur:
				RECT rct;
				PosDim(hWnd,swi.largeur,swi.hauteur,&rct);
				// Positionner le conteneur:
				MoveWindow(hConteneur,rct.left,rct.top,rct.right,rct.bottom,1);
				// Initialiser la couleur de fond de l'animation:
				pIswf->put_BackgroundColor(swi.fond);
				// Convertir le chemin en UNICODE:
				WCHAR fichier[MAX_PATH];
				MultiByteToWideChar (CP_ACP, 0, tampon, -1, fichier, MAX_PATH+1);
				// Charger et jouer l'animation:
				pIswf->put_Movie(fichier);
				break;
			}

			// Clic sur le bouton "Arrêter":
			if((HWND)lParam ==  hArret)
			{				
				pIswf->Stop();	
				break;
			}
			// Clic sur le bouton "Lire":
			if((HWND)lParam ==  hLire)
			{				
				pIswf->Play();	
				break;
			}
			// Clic sur le bouton "Rembobiner":
			if((HWND)lParam ==  hRembob)
			{
				pIswf->Rewind();
				break;
			}
			// Clic sur le bouton "Quitter":
			if((HWND)lParam ==  hQuitter)
			{
				// Envoi du message WM_CLOSE à notre fenêtre:
				SendMessage(hWnd,WM_CLOSE,0,0);
			}
			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 à la procédure par défaut:
			return( DefWindowProc( hWnd, messg, wParam, lParam ) );
	}
	return 0;
}
//---------------------------------------------------------------------------------//

//------------------------------ Fonction WinMain -----------------------------------------//
int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
{
	
	// Charger la zlib.dll:
	HINSTANCE hDLL1 = LoadLibrary("zlib.dll");
	// Si dll introuvable alors l'installer à partir de la resoource:
	if (!hDLL1) 
	{
		// Obtenir le chemin complet de l'application:
		char path[MAX_PATH]; 
		DWORD longueur=GetModuleFileName(0,path,MAX_PATH);
		// Supprimer le nom de fichier du chemin:
		for(int i=longueur;i>0;i--) 
		{
			if (path[i]=='\\') {path[i]=0; break;}
		}
		// Ajouter le nom de la dll au chemin:
		lstrcat(path,"\\zlib.dll");    
		// Trouver la ressource:
		HRSRC DLLressource=FindResource(0,"ID_DLL","RT_RCDATA");
		// Déterminer sa taille:
		DWORD taille=SizeofResource(0,DLLressource);
		// Charger la ressource en mémoire:
		HGLOBAL hRessource=LoadResource(0,DLLressource);
		// Obtenir un pointeur sur cette zone mémoire:
		LPVOID pointeur=LockResource(hRessource);
		// Créer le fichier destination:
		HANDLE  hFichier=CreateFile(path,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
		// Copier la ressource dans le fichier:
		DWORD ecrits;
		WriteFile(hFichier,pointeur,taille,&ecrits,0);
		// Fermer le fichier:
		CloseHandle(hFichier);
		// Libérer la ressource de la mémoire:
		FreeResource (hRessource);
		// Charger la dll en mémoire:
		hDLL1 = LoadLibrary("zlib.dll");
		// Si erreur de chargement de la dll alors quitter:
		if (!hDLL1) return 1;
	}
	// Obtenir un pointeur sur la fonction "uncompress":
	uncompress = (Puncompress) GetProcAddress(hDLL1,"uncompress");
	// Définir type de pointeur pour la fonction AtlAxAttachControl:
	typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
	// Charger la atl.dll:
	HINSTANCE hDLL2 = LoadLibrary("atl.dll");
	// Si dll non chargée alors quitter:
	if (!hDLL2) return 1;
	// Obtenir pointeur sur la fonction AtlAxAttachControl:
	PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL2, "AtlAxAttachControl");
	// Déclarer notre classe de fenêtre et définir ses membres:
	WNDCLASS wc;
	char NomClasse[]    = "Lecteur_Flash";
	wc.lpszClassName 	= NomClasse;
	wc.hInstance 		= hInst;
	wc.lpfnWndProc		= WndProc;
	wc.hCursor			= LoadCursor( 0, IDC_ARROW );
	wc.hIcon			= LoadIcon( hInst, "ID_ICO" );
	wc.lpszMenuName	    = 0;
	wc.hbrBackground	= GetSysColorBrush(COLOR_BTNFACE);
	wc.style			= 0;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	// Enregistrer la classe de notre fenêtre:
	if (!RegisterClass(&wc)) return 0;
	// Obtenir la hauteur de la barre de titre:
	int barre=GetSystemMetrics(SM_CYCAPTION);
	// Créer notre fenêtre principale:
	HWND hWnd = CreateWindow( NomClasse," Lecteur d'animations Flash",WS_SYSMENU | WS_MINIMIZEBOX  ,0,0,640,460+barre, 0, 0, hInst,0);
	// Montrer la fenêtre:
	ShowWindow(hWnd, nCmdShow );
	UpdateWindow( hWnd );
	// Créer notre EDIT conteneur:
	hConteneur=CreateWindow("STATIC","",WS_CHILD | WS_VISIBLE ,0,0,0,0,hWnd,0,0,0);
	// Initialiser la librairie COM:
	CoInitialize(0);
	// Créer une instance de l'interface IShockwaveFlash:
	HRESULT res=CoCreateInstance(CLSID_ShockwaveFlash,0,CLSCTX_ALL,IID_IShockwaveFlash,(void**)&pIswf);
	// Attacher l'interface à notre conteneur:
	res =AtlAxAttachControl(pIswf,hConteneur,NULL); 
	// Boucle des messages:
	MSG Msg;
	while( GetMessage(&Msg, 0, 0, 0))
	{
		TranslateMessage( &Msg );
		DispatchMessage( &Msg );
	}
	// Libérer notre instance de IShockwaveFlash;
	pIswf->Release();
	// Fermer la librairie COM:
	CoUninitialize();
	// Libérer les DLLs:
	FreeLibrary(hDLL1);
	FreeLibrary(hDLL2);
	// Quitter le programme:
	return( Msg.wParam);
}
//--------------------------------------------------------------------------------------------------//

 Conclusion

Le projet complet est dans le zip.

 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


 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

 Sources en rapport avec celle ci

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip LECTEUR MULTIMÉDIA par omegatou
Source avec Zip Source avec une capture INSERER UNE ANIMATION FLASH (WIN32-DEVCPP) par gagah1
Source avec Zip Source avec une capture LECTEUR DE MUSIQUE AVEC SDL ET FMOD par Lemng
Source avec Zip Source avec une capture YOUTUBE VIDEO par f_l_a_s_h_b_a_c_k

Commentaires et avis

Commentaire de racpp le 05/08/2005 22:30:26 administrateur CS

J'ai oublié de préciser que la dll est sous forme de ressource dans l'exécutable. Si ce dernier ne la trouve pas à son lancement, il l'installe dans le même répertoire.

Commentaire de victorcoasne le 08/08/2005 11:54:31

Bonjour,
Des warning pas méchant (il suffit de rajouter une ligne vide en fin de fichier):
In file included from LecteurFlash.cpp:3:
swf.h:144:110: warning: no newline at end of file
In file included from LecteurFlash.cpp:4:
flash.h:187:7: warning: no newline at end of file

Ce qui m'inquiète c'est que le programme quand il est lancé, j'ai beau ouvrir puis lire, arrêter, rembobiner, lire, arrêter, ouvrir, lire...... rien ne s'affiche (à part le fond traditionnel des contrôles Windows.

Je suis sous Dev-C++.

Commentaire de racpp le 09/08/2005 00:44:52 administrateur CS

Je vais voir ça après avoir installé Dev-C++.  :)

Commentaire de racpp le 09/08/2005 01:45:28 administrateur CS

Je viens d'installer Dev-C++. J'ai Créé le projet. Pour les deux warnings, il suffit d'aller dans le fichier "flash.h" sur les lignes indiquées puis taper ENTREE. Pour le reste c'est vrai que ça n'affiche que la fenêtre. Je dois donc deboguer sous Dev-C++ mais le débogage ne se lance pas. Chaque fois que j'appuie sur le bouton de débogage une messagebox me dit qu'il faut recompiler le code. Même en cliquant "ok" rien ne se passe. Y'a t-il un truc à paramètrer?

Commentaire de racpp le 09/08/2005 02:08:50 administrateur CS

Ca y est, j'ai fait marcher le débogueur. Le programme s'arrête à la ligne où on appelle la fonction de la "atl.dll" => res =AtlAxAttachControl(pIswf,hConteneur,NULL);
Tout était normal avant l'appel de cette fonction. ça m'intrigue. Je vais voir.

Commentaire de racpp le 09/08/2005 19:58:46 administrateur CS

Salut,
Avec Dev-C++ le programme refuse toujours d'exécuter la fonction AtlAxAttachControl(). l'appel à la fonction se fait mais sans jamais en sortir = plantage.
Ca marche bien avec les autres Activex mais avec Flash c'est impossible. Je vais essayer de trouver une solution quand j'aurai du temps. Je pense qu'il reste encore des choses à améliorer dans Dev-C++. Avec Visual 6, tout fonctionne sans problème.

Commentaire de vecchio56 le 09/08/2005 20:56:17 administrateur CS

Géniale comme source, ca marche nickel, je mets 10

Commentaire de racpp le 10/08/2005 02:09:23 administrateur CS

Merci beaucoup vecchio56. C'est très encourageant, surtout après les heures que j'ai passées à concevoir manuellement le fichier "flash.h" à partir des données fournies pas "OLE Viewer". Données que j'ai ensuite dû corriger à cause d'erreurs dans quelques définitions. Correction faite après installation de de la version 5 de Flash Activex à la place de la 7. J'allais plusieurs fois abandonner le projet jusqu'au jour où un membre pose une question à ce sujet dans le forum. Je lui ai donné ma parole et je n'avais plus le droit de tout laisser tomber. Merci à lui aussi. Ca fait toujours plaisir de savoir qu'on a apprécié notre travail. Ca fait oublier toutes les peines qu'on a vécues pour le réaliser. Merci encore.

Commentaire de victorcoasne le 10/08/2005 12:22:18

Bonjour,

Je te comprends et je suis sûr que tu serais encore plus content si tu arrivais à trouver pourquoi sous Dev-C++ on y arrive pas alors que les autres activeX de ta part fonctionnent (Navigateur, MediaPlayer)

Bon courage et bonne continuation,

Sincèrement,@++

Commentaire de racpp le 10/08/2005 14:15:24 administrateur CS

salut,
Le défaut peut venir du compilateur Dev-C++ et ça peut venir aussi de l'Activex Flash. Peut-être qu'il comporte une faille que Visual sait corriger automatiquement. J'èspère un jour arriver à découvrir la cause de ce disfonctionnement. Tout est question de temps. En attendant, je vais essayer de teser le maximum d'Activex avec Dev-C++, comme ça je saurai si le problème vient du compilateur ou non.

Commentaire de Urgo le 28/08/2005 17:03:00

Merveilleuse source! 10/10

Commentaire de visionor le 01/10/2005 23:02:59

moi aussi je te remercie, je cherche ce type de source depuis longtemps!!!
Je t'Aime!

Commentaire de fuliculi le 01/03/2006 16:15:04

Sympa ce code, mais j'ai un problème dès que je veux utiliser les autres méthodes comme GetVariable, j'ai un gros message d'erreur.

Commentaire de hakim0 le 03/08/2006 20:27:40

j'ai une question,
ou tu trouve le fichier flash.h est swf.h?
est pour d'autre controle par exemple ms flexgrid et datagrid ou on peu trouve ces ficier la .h ??

Commentaire de hakim0 le 05/08/2006 12:49:11

une autre question:
comment on peut convirtire le clsid {D27CDB6E-AE6D-11CF-96B8-444553540000} EN {0xD27CDB6E,0xAE6D,0x11CF,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}};

Commentaire de racpp le 15/08/2006 16:32:09 administrateur CS

Salut,
hakim0 >> Désolé pour le retard. "flash.h" est fait à partir des infos fournies pas l'outil OLE/View. Ces infos ont été écrites manuellement dans ce fichier. "swf.h" contient l'implémentation de quelques fonctions utilisées par le programme.
pour la conversion, tu peux faire petit outil simple qui fait cette conversion. C'est simple:
{  D27CDB6E   AE6D   11CF    96   B8   44   45   53   54   00   00}
{0xD27CDB6E,0xAE6D,0x11CF,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}};

Commentaire de hakim0 le 16/08/2006 12:50:05

Ok Merci.

Commentaire de thomas007 le 17/10/2006 14:10:48

Bonjour,

tout d'abord merci pour ce code. Une petite note toutefois, j'ai utilisé cette methode dans un projet pour jouer de nobreuses animations flash et il y a un "memory leak" suite au bug suivant portant sur les atl: http://support.microsoft.com/kb/258235/EN-US/
10/10 tout de même.

Commentaire de NeoUmbrella le 09/11/2007 00:15:50

Fonctionne impécablement bien, même pour les animations flash hebergées sur un serveur distant.
Très bon travail, comme la plupart de tes codes-sources.
Merci bien RACPP.

Commentaire de Miquel75 le 24/03/2008 13:31:13

Malheureusement, complètement bidon, vu que c'est 0% API, puisque 100% ATL (exemples ATL complets dans MSDN)
Alors qu'on peut le faire 100% api, avec la classe de fenêtre non documentée donnée sur les Newsgroups de prog Windows.

Commentaire de vecchio56 le 24/03/2008 15:36:53 administrateur CS

Tu peux en dire plus?

Commentaire de racpp le 27/03/2008 23:18:01 administrateur CS

miquel75 >> Il parait que tu ne connais pas la différence entre API et ATL. Ce dernier est un type de projet à part dans Visual C/C++. Mon code est donc 100% API et 0% ATL car il ne fait qu'utiliser les fonctions API exportées par atl.dll dans un projet Win32 API. Les exemples fournis par MSDN sont tous en ATL et utilisent une classe de fenêtre spéciale ATL. Je ne connais pas la "classe de  fenêtre non documentée donnée sur les Newsgroups de prog Windows". Fais nous un code source pour nous faire découvrir cette nouvelle classe de fenêtre. On te remerciera beaucoup.

Commentaire de BruNews le 28/03/2008 11:36:56 administrateur CS

"complètement bidon, vu que c'est 0% API..."
Défaut d'optique, erreur de source lue ou incompréhension des termes employés ???

Commentaire de shuttleur le 15/04/2008 14:55:05

Salut racpp !

Je me suis très inspiré de tes sources sur les conteneurs activeX en win32, et te remercie d'avoir partagé cette trouvaille.

Cette technique me permet d'inclure dans une ihm en win32 un activeX "reader" de vidéos développé par un collègue.

Je cherche en ce moment à capturer l'evènement WM_NCHITTEST de l'activeX dans la procédure de ma fenêtre container. Saurais-tu si je dois modifier qqch dans l'activeX ou s'il y a une astuce pour que la fenètre mère aie une notification d'un évènement de l'activeX ?

Merci d'avance.

Commentaire de Miquel75 le 15/04/2008 16:09:27

C'est donc bien 100% ATL comme je notais et comme les exemples MSDN dont c'est pompé.
La classe de fenêtre non documentée est incluse dans Windows et fait tout l'OCX embedding nativement (postée sur Usenet)

Commentaire de racpp le 16/04/2008 22:23:13 administrateur CS

miquel75 >> Avant de mettre des commentaires ici, il serait préférable de commencer par bien se documenter pour comprendre les termes et les notions dont on parle. Sinon, on ne parlerait pas le même langage. Essaie aussi d'argumenter tes propos. Tu peux pas donner les liens MSDN et Usenet?

Commentaire de racpp le 16/04/2008 23:14:19 administrateur CS

Salut shuttleur,
Je pense que cette fonctionnalité doit être implémentée dans l'Activex. Ce dernier envoie un événement à une interface (ou classe) implémentée dans le code du projet contenant la fenêtre mère. Jette un coup d'oeil sur mon code de Navigateur Web dans lequel j'intercepte les événements générés par l'activex WebBrowser.

Commentaire de victorcoasne le 17/04/2008 15:03:17

Miquel75> J'utilise Dev-C++ et j'ai jamais utilisé les ATL.
Le code source compile ! Donc c'est pas des ATL.
Il se sert d'une DLL mais code le programme en API !
Je suis impatient de voir sa source vu que tu sais apparemment ce que c'est que "pomper".

Commentaire de Miquel75 le 17/04/2008 15:17:14

Oui, il faut bien comprendre de quoi on parle, savoir ce qu'est un OLE container client,
comment sont implémentées IOleClientSite ou IOleInPlaceSite, ce qu'est un appel dynamique ou statique, etc... bref les bases COM et autres.
Certaines réponses ci-dessus dénotent une grande puérilité.
Les exemples MSDN ATL, publiés depuis 11 ans dans le SDK, sont évidemment basés sur la Q192560,
alors ressortir la même chose en croyant avoir inventé la roue...
Et si en plus on ne sait pas chercher sur Usenet ou désassembler une DLL par W32Dasm...

Commentaire de Miquel75 le 17/04/2008 15:18:39

> Le code source compile ! Donc c'est pas des ATL.

Alors, celle-là, je l'archive !
Hallucinant.

Commentaire de racpp le 17/04/2008 19:20:58 administrateur CS

miquel75 >> La tu continues de prouver que tu ne sais pas de quoi tu parles. victorcoasne a raison car DEV C++ ne supporte pas les projets ATL. Ces derniers sont une exclusivité VC++ tout comme les MFC. Manipuler les objets OLE/COM et leurs interfaces n'est pas forcément de l'ATL.
Je viens de jeter un coup d'oeil sur la Q192560, et là je retrouve ce à quoi je m'attendais. C'est à dire, du code spécifique aux ATLs de VC++. Ca n'a rien à voir avec mon code.  Il suffit de faire une petite comparaison pour s'en convaincre. La démarche est totalement différente.
Je n'ai pas besoin de chercher sur Usenet car c'est à toi de le faire et nous fournir les liens pour nous apporter les preuves de tes dires. Si tu ne peux pas apporter ces preuves, ça veut dire qu'il n'y'en a pas.
Et pour finir, puisque tu crois comprendre mieux que tous les autres, pourquoi tu ne nous fais pas, au moins un code source pour nous apprendre à programmer?


Commentaire de racpp le 17/04/2008 19:26:00 administrateur CS

Voici le lien de la Q192560:
http://support.microsoft.com/?scid=kb%3Ben-us%3B192560&x=11&y=16
A noter qu'elle date du 02/09/2005 alors que ma source est postée presque 1 mois avant.

Commentaire de vecchio56 le 17/04/2008 20:58:58 administrateur CS

Je ne sais pas si Miquel75 dit vrai ou non, je ne connais pas les ATL, mais j'ai rarement vu autant d'arrogance. Ca serait bien plus constructif si tu fournissait les liens usenet dont tu parles depuis le début, et si tu essayais d'expliquer ton point de vue.
Pour la Q192560 elle doit dater de plus de 2 ans (2 septembre 2005 est la date de dernière mise à jour)

Commentaire de SamueleSam le 25/01/2009 00:52:14 10/10

Thanks, good job ;)

Commentaire de gm55 le 30/07/2009 09:50:51

Bonjour,

J'ai essayé de faire la même chose effectuée pour ShockwaveFlash avec le controle activex que je souhaite utiliser.
Malheureusment, même si j'ai finit à obtenir un code qui compile il n'a pas l'air d'appeller l'activex.

Je vous met le code obtenu sous visual c++ :
j'importe l'ativex, je met les clsid et iid correspondants. Pour l'instant j'ai créé une interface avec quelques fonctions reprenant celle d'ole viewer (mis en commentaire).
La différence avec le code exposé c'est que pour permettre la compilation je suis obligé d'importer l'activex.

#import"C:\\Program Files\\Posiflex Inc\\Posiflex OPOS Control\\CashDwr\\OPOSCashDrawer.ocx"

const GUID CLSID_IOPOSCashDrawer = {0xccb90042,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};
const GUID IID_IOPOSCashDrawer  = {0xccb92041,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};

interface IOPOSCashDrawer : public IDispatch
    {
    public:
virtual HRESULT STDMETHODCALLTYPE get_DeviceEnabled(BOOL* pDeviceEnabled) = 0;
//[id(0x00000011), propget, helpstring("property DeviceEnabled")]HRESULT DeviceEnabled([out, retval] VARIANT_BOOL* pDeviceEnabled);

virtual HRESULT STDMETHODCALLTYPE Open(LPCTSTR DeviceName, long* pRC) = 0 ;
//[id(0x00000025), helpstring("method Open")] HRESULT Open([in] BSTR DeviceName, [out, retval] long* pRC);
        
    };

HWND hConteneur;
IOPOSCashDrawer *pIswf;

Aprés j'ai repris le code sans charger la dll zlib car je ne penses pas qu'elle me soit utile. J'ai juste effectué les modifications suivantes

// Créer notre EDIT conteneur:
hConteneur=CreateWindow("STATIC","",WS_CHILD | WS_VISIBLE ,0,0,0,0,hWnd,0,0,0);
// Initialiser la librairie COM:
CoInitialize(0);
// Créer une instance de l'interface IShockwaveFlash:
HRESULT res = CoCreateInstance(CLSID_IOPOSCashDrawer,0,CLSCTX_ALL,IID_IOPOSCashDrawer,(void**)&pIswf);
res = AtlAxAttachControl(pIswf,hConteneur,0);

Ensuite j'ai juste gardé de la fonction WndProc
case WM_CREATE:
// Créer tous les controles:
hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hWnd,0,0,0);
break;

case WM_COMMAND:
if( (HWND)lParam ==  hOuvrir)
{
res = pIswf->get_DeviceEnabled(&a); // int a = 10;
//res = pIswf->Open(DeviceName, &b); // HRESULT res = 5;
}

avec get_DeviceEnabled  a reste inchangé et res prend pour valeur -2147467263 donc ça ne fonctionne pas vraiment
avec open j'obtiens une erreur à l'exécution qui quitte le programme

Voilà si quelqu'un pouvait m'aider ça serait sympa.
je précise que j'ai déjà utiliser cet activex avec les MFC donc je connais en partie son fonctionnement et ses méthodes mais j'ai maintenant besoin de l'utiliser sans.

Merci

Commentaire de gm55 le 31/07/2009 12:00:46

Bonjour, en fait j'ai fini par réussir j'avais pas vu qu'il fallait utiliser un using name space dans le fichiers . tlh. Ce qui fait que maintenant je suis arrivé à appeler directement l'interface importé et donc ça marche beaucoup mieux.

Juste question il n'y a aucun moyen d'importer l'activex sans l'insérer dans une fenêtre ?

Merci

Commentaire de shuttleur le 31/07/2009 12:07:42

Si tu veux le rendre invisible à l'écran, tu peux toujours le mettre dans une fenêtre de dimensions 0x0.

Tu auras le son et pas la vidéo par exemple..

Commentaire de gm55 le 31/07/2009 12:33:56

// OPOS1000.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#import"C:\\Program Files\\Posiflex Inc\\Posiflex OPOS Control\\LineDisp\\OPOSLineDisplay.ocx"\
rename("CreateWindow", "CreateWindov")

OposLineDisplay_1_8_Lib::IOPOSLineDisplay *m_opos;

const GUID CLSID_IOPOSLineDisplay = {0xccb90102,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};
const GUID IID_IOPOSLineDisplay  = {0xccb94101,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};

HWND hConteneur;

int main(int argc, char* argv[])
{
HRESULT res = 5;
short a = 10;
LPCTSTR DeviceName = "LD demo";

CoInitialize(0);
CoCreateInstance(CLSID_IOPOSLineDisplay,0,CLSCTX_ALL,IID_IOPOSLineDisplay,(void**)&m_opos);

res = m_opos->get_DeviceEnabled(&a);
printf("get()_DeviceEnabled() : %d\n",res);

res = m_opos->Open(DeviceName);
printf("Open() : %d\n",res);
res = m_opos->ClaimDevice(300);
//res = m_opos->put_DeviceEnabled(TRUE);
//res = m_opos->DisplayText("abc", 0 );
//res = m_opos->DisplayTextAt(1,0,"abc", 0 );

return 0;

}
je penses avoir réussi à ne pas le mettre dans un conteneur. En tout cas ça marche sous une application console.
C'est pas le même activex qu'avant mais en fait c'est celui que je voulais utilisé mais il avait un petit défaut de redéfinition de la fonction createwindow que j'ai réussi à corriger.

Commentaire de gm55 le 31/07/2009 12:40:01

d'ailleurs la définition du conteneur n'a plus lieu d'être

donc la ligne HWND hConteneur; est inutile.

Commentaire de Leucistic le 24/11/2009 11:37:58

Bonjour,

Tout d'abord merci pour cette source très très bien codée et commentée.
J'ai essayé de le compiler avec Code::Blocks 8.02 et il me met les messages d'erreur suivant :

262|undefined reference to `_CoInitialize@4'|
264|undefined reference to `_CoCreateInstance@20'|
277|undefined reference to `_CoUninitialize@0'|

Est-ce que vous savez comment résoudre ce problème ???
Merci d'avance

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

[BAR]Lecteur flash pour lire des bande dessinées [ par bilbaroud ] Bonjour, Je suis un dessinateur de bande dessinées amateur et je voudrais que l'on puisse lire mes bd en ligne sur mon site... Je voudrais que cela re jouer un mp3 avec lecteur par defaut ou autre... [ par fhoest ] Bonjour, je voudrais sans mettre Windows media player 11(wmp) dans une form jouer un son mp3 afin que si je poste mon ptit prog sur un autre pc qui ne Accéder aux données d'une carte flash [ par Yoy ] Je souhaite pouvoir lire les données d'une carte flash insérée dans un connecteur PCMCIA d'un portable.La carte flash contient des données qui ne sont lecteur de carte [ par cyril ] Avec un lecteur de carte typeCKL2000 modèle ECR8 peux-on changer le programme pour lire des cartes bancaire ou des cartes de code.Merci pour une répon ajout d'un lecteur virtuel [ par EXOCET ] salut a tous se serait pour savoir comment ajouter un lecteur virtuel dans le poste de travail.merci d'avanceEXOCET B-) lecteur virtuel d'image [ par fyleo ] je cherche les sources d'un programme servant à créer un lecteur virtuel (cdrom) et de pouvoir monter une image dedant ouverture du lecteur CD ? [ par stjo ] Comment puis-je faire pour ouvrir le lecteur de mon programme comme avec VB6 en Dev C++, VC++ ou Gtk+ ?TymkMerci d'avance Builder5 et Flash [ par xxlm ] Tout d'abord bonjour tout le monde.Bon voilà le pb (si pb il y a pour vous lol). Je souhaite intégrer une anim flash dasn mon application.J'ai donc in C++ && DLL ==> CGI [ par amosc ] salut cppfrance.comVoila j ai un programme en c++ qui appel une DLL, ce programme pilote un lecteur carte a puce, je voulai l incorporer dans une pag Ouvrir-Fermer lecteur cd [ par Xentor609 ] bonjour a tous,J'ai 2 ptite question:1) Existe t-il un moyen de detecter si un lecteur de cd est ouvert ou ferme? si oui, lequel?2) Lorsque j'utilise


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

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

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