begin process at 2012 05 29 06:00:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Fenetre dans DLL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Fenetre dans DLL

mercredi 30 novembre 2005 à 17:30:46 | Fenetre dans DLL

ncoder

Bonjour à tous,

Dans beaucoup de mes programmes, lorsqu'une opération assez longue est en cours, j'utilise une petite fenètre indicant l'état et la tache en cours d'exécution.

Fatigué d'avoir à chaque fois a retaper les lignes de code pour cette petite fenètre, j'ai voulu mettre tout ce code dans une DLL, en faisant 3 fonctions:
- une pour créer la fenètre (initialiser)
- une pour changer le texte de l'opération en cours
- et une pour changer la valeur de la progressbar.

Ce qui donne ça :

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>

HBRUSH FondStatic=(HBRUSH)(COLOR_WINDOW);
HWND Fen_Sync, Tache, Statut, ProgressBar;
   
__declspec (dllexport) HWND CreateUserForm (char *Name, char* szClassName, HINSTANCE hThisInstance, int ID_LABEL)
{
 // Calcule la résolution de l'écran
 POINT Ecran = {GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)};    

 // Crée la fenêtre de synchronisation
 Fen_Sync = CreateWindowEx(0, &szClassName[0], &Name[0], WS_OVERLAPPED,
  (Ecran.x-277)/2, (Ecran.y-105)/2, 277, 105, HWND_DESKTOP, NULL, hThisInstance, NULL);
  
 //Labels
    Tache = CreateWindowEx(0, "STATIC", "Tache :", WS_VISIBLE|WS_CHILD, 10, 25, 200, 13, Fen_Sync, (HMENU)ID_LABEL, hThisInstance, NULL);
    Statut = CreateWindowEx(0, "STATIC", "Statut :", WS_VISIBLE|WS_CHILD, 10, 40, 200, 13, Fen_Sync, (HMENU)ID_LABEL, hThisInstance, NULL);

    //ProgressBar
    typedef VOID (CALLBACK* INITCOMMONCONTROLSEX)(VOID);
    INITCOMMONCONTROLSEX InitCommonControlsEx;
    HINSTANCE hDLL;
    hDLL = LoadLibrary("comctl32.dll");
    InitCommonControlsEx = (INITCOMMONCONTROLSEX)GetProcAddress(hDLL, "InitCommonControlsEx");
   
 ProgressBar = CreateWindow(PROGRESS_CLASS, NULL,WS_CHILD|WS_VISIBLE,
       10, 57, 250, 10, Fen_Sync, NULL, hThisInstance, NULL);
 SendMessage(ProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0,100));
 SendMessage(ProgressBar, PBM_SETSTEP, (WPARAM)1, 0);
 SendMessage(ProgressBar, PBM_SETPOS, (WPARAM)0, 0);
 
 // Changements des polices
 HGDIOBJ PoliceNormale = GetStockObject(DEFAULT_GUI_FONT);
 SendMessage(Tache, WM_SETFONT, (WPARAM)PoliceNormale, MAKELPARAM(TRUE, 0));
 SendMessage(Statut, WM_SETFONT, (WPARAM)PoliceNormale, MAKELPARAM(TRUE, 0));
 ShowWindow(Fen_Sync, 1);
 return Fen_Sync;
}

/*
__declspec (dllexport) void ShowForm (char* Name, char* Tache, int Valeur_ProgressBar, int Show)
{
SetWindowText(Fen_Sync, &Name[0]);
SetWindowText(Tache, &Tache[0]);
SendMessage(ProgressBar, PBM_SETPOS, (WPARAM)Valeur_ProgressBar, 0);
ShowWindow(Fen_Sync, Show);
MessageBox(NULL, "ShowForm","Fonction appelée", MB_OK);
}
*/

__declspec (dllexport) void UpdateFormT (char* Tache)
{
SetWindowText(Tache, &Tache[0]);
ShowWindow(Fen_Sync, 1);
UpdateWindow(Fen_Sync);
MessageBox(NULL, "UpdateFormT","Fonction appelée", MB_OK);
}

__declspec (dllexport) void UpdateFormV (int Valeur_ProgressBar)
{
SendMessage(ProgressBar, PBM_SETPOS, (WPARAM)Valeur_ProgressBar, 0);
ShowWindow(Fen_Sync, 1);
UpdateWindow(Fen_Sync);
MessageBox(NULL, "UpdateFormV","Fonction appelée", MB_OK);
}

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

Dev Cpp ne me génère aucune erreur, me crée la lib et la DLL.
Mais qd j'utilise ma DLL, les MsgBox s'affichent bien (donc les fonctions sont appelées),
mais ma fenètre n'apparait pas !!!

Où est le pb ?

Merci à tous.

jeudi 1 décembre 2005 à 08:22:55 | Re : Fenetre dans DLL

ricky78

Bonjour

Essaye de mettre cette ligne de code au debut des fonctions que tu exportes


AFX_MANAGE_STATE(AfxGetStaticModuleState());

par exemple

__declspec (dllexport) void UpdateFormV (int Valeur_ProgressBar)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

SendMessage(ProgressBar, PBM_SETPOS, (WPARAM)Valeur_ProgressBar, 0);
ShowWindow(Fen_Sync, 1);
UpdateWindow(Fen_Sync);
MessageBox(NULL, "UpdateFormV","Fonction appelée", MB_OK);
}



TOCHE
jeudi 1 décembre 2005 à 10:44:50 | Re : Fenetre dans DLL

ncoder

Merci de ta réponse.

Dev cpp 4.9 me crée ce log :

dllmain.o(.text+0x5b):dllmain.c: undefined reference to `AfxGetStaticModuleState'
dllmain.o(.text+0x64):dllmain.c: undefined reference to `AFX_MANAGE_STATE'

Quel include (ou lib) dois-je ajouter pour empécher cette erreur ?

Merci de ton aide
jeudi 1 décembre 2005 à 10:49:08 | Re : Fenetre dans DLL

ricky78

Desole le  AfxGetStaticModuleState' est pour les prog utilsant les MFC, cela ne semble pas etre ton cas




TOCHE
jeudi 1 décembre 2005 à 11:08:51 | Re : Fenetre dans DLL

BruNews

Administrateur CodeS-SourceS
MFC n'était pas précisé et l'include de windows.h l'excluait implkicitement.

Tu n'as pas besoin de RegisterClass() ? ou alors est-il fait ailleurs ?

ciao...
[ Lien ]
BruNews, MVP VC++
jeudi 1 décembre 2005 à 17:32:40 | Re : Fenetre dans DLL

ncoder

Non je n'ai pas utilisé RegisterClass() !

Comment m'y prendre svp?

Un petit exemple ?

Merci!
jeudi 1 décembre 2005 à 17:49:35 | Re : Fenetre dans DLL

ncoder

J'ai fait ceci :

    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = gh;
    wincl.lpszClassName = "MsgBox";
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

où gh = hInst; (case DLL_PROCESS_ATTACH:)

Mais ça ne marche pas...

Why?

jeudi 1 décembre 2005 à 17:50:47 | Re : Fenetre dans DLL

ncoder

J'ai oublié : à wincl.lpfnWndProc  j'ai mis NULL
jeudi 1 décembre 2005 à 20:13:13 | Re : Fenetre dans DLL

ncoder

Ca marche toujours pas !!!
Que faire ??
jeudi 1 décembre 2005 à 20:26:36 | Re : Fenetre dans DLL

BruNews

Administrateur CodeS-SourceS
Pourquoi donc ne mets tu pas toute la logique de la fenêtre dans la dll, le RegisterClass y compris puisque la windProc esr dans la dll.
D'ordinaire ce sont pluto des dialogbox qu'on fournit en dll.

ciao...
[ Lien ]
BruNews, MVP VC++

1 2 3

Cette discussion est classée dans : dll, tache, progressbar, fen, sync


Répondre à ce message

Sujets en rapport avec ce message

DLL en C++, svp :( [ par NitRic ] Ca fait 4 jours que j'essaie de créée une simple DLL qui ne fait afficher qu'un simple MessageBox et ca ne fonctionne pas... :\Voici mon code au compl Probleme D'ordi [ par Ben-J ] J'ai un Probleme...Suite a une erreur de manip j'ai un prob avec les dll de mon ordi , la plupart des app bug a cause d'une exportation manquante NTDL dll C++ avec VB? harg! je craque! [ par BlackWizzard ] comment acceder aux element visual basic via une dll c++?par exemple, comment recuperer la valeur du pixel(3,2), changer la valeur de sa couleur et ap prob avec une dll [ par BlackWizzard ] Salut!je voudrais faire une dll avec un niveau tres bas...j'ai deja créé une dll de cryptage en me basant sur un code simple...la chose que je compren ouverture de base Access [ par denis ] salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset importer une DLL [ par sylfeline ] Comment faire pour utiliser une DLL externe avec VC++ ?Le problème venant que la DLL à été faite avec VB, j'ai 3 fichier générer : .DLL, .Lib et .exp Prob avec des dll (creation et utilisation) [ par DDway ] Voila : mon prob est fort simple :comment avec VC++ on creer une dll et comment on l'utilise dans une application(un exemple bete et mechant m'aiderai ODBC Connect dialog: lacks text if api called from dll [ par mfritschi ] hi,i am writing an abstract data access framework. it enables us amongother things to access databases without being interested in theactual underlyin Afficher un dialog modal dans une dll d'extension... [ par MadPlop ] J'ai cree la DLL avec une classe de dialogue (avec la ressource de dialogue associee) et une autre classe. Les fonctions de ces classes fonctionnent s dll pour asp avec connection odbc [ par denis ] salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset


Nos sponsors


Sondage...

Comparez les prix

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,530 sec (3)

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