J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs, j'y ai
ajouté une ressource dialog puis enfin, j'ai une sub (dans 1 classe de la
DLL) qui doit simplement afficher cette boite et aussitôt rendre la main au
programme appelant la fonction de la DLL, il faut donc afficher la form en
non-modale.
En enlevant la msgbox, la boite se ferme aussitot (je suppose que quand la
sub est finie, toutes les classes crées sont détruites) et vu que je veux
rendre la main en laissant la feuille afficher je ne peux pas faire de
boucle d'attente (ca serait stupide en plus, autant faire un DoModal() dans
ce cas)...
Donc comment faire ?
Peut être déclarer la classe ailleur (en *public*) mais ou ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien LE LEZ
Pas le temps de lire sérieusement ton message, mais j'ai très très nettement l'impression qu'il est complètement HS ici, et aurait plus sa place sur fr.comp.os.ms-windows.programmation.
-- ;-)
Pas le temps de lire sérieusement ton message, mais j'ai très très
nettement l'impression qu'il est complètement HS ici, et aurait plus
sa place sur fr.comp.os.ms-windows.programmation.
Pas le temps de lire sérieusement ton message, mais j'ai très très nettement l'impression qu'il est complètement HS ici, et aurait plus sa place sur fr.comp.os.ms-windows.programmation.
-- ;-)
Pierre Maurette
"ng" a écrit [...]
J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs, j'y ai [etc.]
La seule chose qui est du C++, c'est qu'il est normal que oForm déclarée et créée dans la méthode PluginServeurDemarre soit détruite quand la méthode retourne. Je ne sais ce que propose les MFC et VS6, mais il vous faut peut-être créer la fenêtre dans DllMain. En fait, dans le traitement des inits, c'est à dire quand le second paramètre est DLL_PROCESS_ATTACH (et détruite quand ce parmètre est DLL_PROCESS_DETACH). Il semblerait indiqué de la créer iconisée dans la barre des tâches (tray icon). Ensuite, vous gérez sa visibilité et éventuellement son focus. Comme vous le suggère Fabien, fr.comp.os.ms-windows.programmation et un petit coup de MSDN. Pierre
"ng" <ng@babeuk.net> a écrit
[...]
J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs, j'y ai
[etc.]
La seule chose qui est du C++, c'est qu'il est normal que oForm déclarée et
créée dans la méthode PluginServeurDemarre soit détruite quand la méthode
retourne.
Je ne sais ce que propose les MFC et VS6, mais il vous faut peut-être créer
la fenêtre dans DllMain. En fait, dans le traitement des inits, c'est à dire
quand le second paramètre est DLL_PROCESS_ATTACH (et détruite quand ce
parmètre est DLL_PROCESS_DETACH).
Il semblerait indiqué de la créer iconisée dans la barre des tâches (tray
icon).
Ensuite, vous gérez sa visibilité et éventuellement son focus.
Comme vous le suggère Fabien, fr.comp.os.ms-windows.programmation et un
petit coup de MSDN.
Pierre
J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs, j'y ai [etc.]
La seule chose qui est du C++, c'est qu'il est normal que oForm déclarée et créée dans la méthode PluginServeurDemarre soit détruite quand la méthode retourne. Je ne sais ce que propose les MFC et VS6, mais il vous faut peut-être créer la fenêtre dans DllMain. En fait, dans le traitement des inits, c'est à dire quand le second paramètre est DLL_PROCESS_ATTACH (et détruite quand ce parmètre est DLL_PROCESS_DETACH). Il semblerait indiqué de la créer iconisée dans la barre des tâches (tray icon). Ensuite, vous gérez sa visibilité et éventuellement son focus. Comme vous le suggère Fabien, fr.comp.os.ms-windows.programmation et un petit coup de MSDN. Pierre
James Kanze
"ng" writes:
|> J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs, |> j'y ai ajouté une ressource dialog puis enfin, j'ai une sub (dans |> 1 classe de la DLL) qui doit simplement afficher cette boite et |> aussitôt rendre la main au programme appelant la fonction de la |> DLL, il faut donc afficher la form en non-modale.
|> En enlevant la msgbox, la boite se ferme aussitot (je suppose que |> quand la sub est finie, toutes les classes crées sont |> détruites) et vu que je veux rendre la main en laissant la |> feuille afficher je ne peux pas faire de boucle d'attente (ca serait |> stupide en plus, autant faire un DoModal() dans ce cas)...
|> Donc comment faire ?
|> Peut être déclarer la classe ailleur (en *public*) mais ou ?
C'est difficile pour ceux de nous qui ne connaît pas Windows à voir le C++ dans tout ça, mais j'ai quand même comme une impression que la réponse à ta question est une expression new -- il y a bien des objets créés dans la fonction qui doivent continuer à vivre après le rétour de la fonction. Alors : ils ne peuvent pas être des variables locales, parce que dans ce cas-là, les destructeurs en seraient appelés en sortie de la fonction. Et ils ne peuvent pas être des objets à durée de vie statique (des objets globaux, par exemple), parce que dans ce cas-là, le compilateur va les construire avant d'appeler ta fonction. Il ne reste que la durée de vie dynamique -- tu crées l'objet quand tu veux, au moyen d'une expression new, et tu le supprimes quand tu veux, au moyen d'une expression delete.
Voilà pour la partie C++. Maintenant, j'ai entendu dire qu'il y a parfois des problèmes avec new et delete dans les DLL de Microsoft, et qu'il faut s'assurer que le delete se fait dans la même DLL que le new. Donc, si ce n'est pas le cas, attention. Mais si c'est le cas, c'est assez facile à contourner -- il suffit d'avoir un gestionnaire :
class MainFormManager { public: static MainFormManager& instance() ; CMainForm* create( ??? ) ; void remove( CMainForm* form ) ;
private: MainFormManager() ; ~MainFormManager() ;
std::set< CMainForm* > myActiveForms ; } ;
MainFormManager& MainFormManager::instance() { // Selon l'utilisation, c'est possible qu'il // faut un lock ici. static MainFormManager theOneAndOnly ; return theOneAndOnly ; }
CMainForm* MainFormManager::create( ??? ) { CMainForm* result = new CMainForm( ??? ) ; myActiveForms.insert( result ) ; return result ; }
void MainFormManager::remove( CMainForm* form ) { myActiveForms.erase( form ) ; delete form ; }
MainFormManager::MainFormManager() { }
MainFormManager::~MainFormManager() { if ( ! myActiveForms.empty() ) { // Logge l'anomalie. On vire le DLL pendant qu'on // s'en sert encore... } while ( ! myActiveForms.empty() ) { delete *myActiveForms.begin() ; } }
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
"ng" <ng@babeuk.net> writes:
|> J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs,
|> j'y ai ajouté une ressource dialog puis enfin, j'ai une sub (dans
|> 1 classe de la DLL) qui doit simplement afficher cette boite et
|> aussitôt rendre la main au programme appelant la fonction de la
|> DLL, il faut donc afficher la form en non-modale.
|> En enlevant la msgbox, la boite se ferme aussitot (je suppose que
|> quand la sub est finie, toutes les classes crées sont
|> détruites) et vu que je veux rendre la main en laissant la
|> feuille afficher je ne peux pas faire de boucle d'attente (ca serait
|> stupide en plus, autant faire un DoModal() dans ce cas)...
|> Donc comment faire ?
|> Peut être déclarer la classe ailleur (en *public*) mais ou ?
C'est difficile pour ceux de nous qui ne connaît pas Windows à
voir le C++ dans tout ça, mais j'ai quand même comme une
impression que la réponse à ta question est une expression new --
il y a bien des objets créés dans la fonction qui doivent
continuer à vivre après le rétour de la fonction. Alors : ils
ne peuvent pas être des variables locales, parce que dans ce
cas-là, les destructeurs en seraient appelés en sortie de la
fonction. Et ils ne peuvent pas être des objets à durée de vie
statique (des objets globaux, par exemple), parce que dans ce cas-là,
le compilateur va les construire avant d'appeler ta fonction. Il ne
reste que la durée de vie dynamique -- tu crées l'objet quand tu
veux, au moyen d'une expression new, et tu le supprimes quand tu veux,
au moyen d'une expression delete.
Voilà pour la partie C++. Maintenant, j'ai entendu dire qu'il y a
parfois des problèmes avec new et delete dans les DLL de Microsoft,
et qu'il faut s'assurer que le delete se fait dans la même DLL que le
new. Donc, si ce n'est pas le cas, attention. Mais si c'est le cas,
c'est assez facile à contourner -- il suffit d'avoir un gestionnaire :
class MainFormManager
{
public:
static MainFormManager&
instance() ;
CMainForm* create( ??? ) ;
void remove( CMainForm* form ) ;
private:
MainFormManager() ;
~MainFormManager() ;
std::set< CMainForm* >
myActiveForms ;
} ;
MainFormManager&
MainFormManager::instance()
{
// Selon l'utilisation, c'est possible qu'il
// faut un lock ici.
static MainFormManager
theOneAndOnly ;
return theOneAndOnly ;
}
CMainForm*
MainFormManager::create( ??? )
{
CMainForm* result = new CMainForm( ??? ) ;
myActiveForms.insert( result ) ;
return result ;
}
void
MainFormManager::remove( CMainForm* form )
{
myActiveForms.erase( form ) ;
delete form ;
}
MainFormManager::MainFormManager()
{
}
MainFormManager::~MainFormManager()
{
if ( ! myActiveForms.empty() ) {
// Logge l'anomalie. On vire le DLL pendant qu'on
// s'en sert encore...
}
while ( ! myActiveForms.empty() ) {
delete *myActiveForms.begin() ;
}
}
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> J'ai fait une DLL COM (avec l'ATL wizard...) qui utilise les MFCs, |> j'y ai ajouté une ressource dialog puis enfin, j'ai une sub (dans |> 1 classe de la DLL) qui doit simplement afficher cette boite et |> aussitôt rendre la main au programme appelant la fonction de la |> DLL, il faut donc afficher la form en non-modale.
|> En enlevant la msgbox, la boite se ferme aussitot (je suppose que |> quand la sub est finie, toutes les classes crées sont |> détruites) et vu que je veux rendre la main en laissant la |> feuille afficher je ne peux pas faire de boucle d'attente (ca serait |> stupide en plus, autant faire un DoModal() dans ce cas)...
|> Donc comment faire ?
|> Peut être déclarer la classe ailleur (en *public*) mais ou ?
C'est difficile pour ceux de nous qui ne connaît pas Windows à voir le C++ dans tout ça, mais j'ai quand même comme une impression que la réponse à ta question est une expression new -- il y a bien des objets créés dans la fonction qui doivent continuer à vivre après le rétour de la fonction. Alors : ils ne peuvent pas être des variables locales, parce que dans ce cas-là, les destructeurs en seraient appelés en sortie de la fonction. Et ils ne peuvent pas être des objets à durée de vie statique (des objets globaux, par exemple), parce que dans ce cas-là, le compilateur va les construire avant d'appeler ta fonction. Il ne reste que la durée de vie dynamique -- tu crées l'objet quand tu veux, au moyen d'une expression new, et tu le supprimes quand tu veux, au moyen d'une expression delete.
Voilà pour la partie C++. Maintenant, j'ai entendu dire qu'il y a parfois des problèmes avec new et delete dans les DLL de Microsoft, et qu'il faut s'assurer que le delete se fait dans la même DLL que le new. Donc, si ce n'est pas le cas, attention. Mais si c'est le cas, c'est assez facile à contourner -- il suffit d'avoir un gestionnaire :
class MainFormManager { public: static MainFormManager& instance() ; CMainForm* create( ??? ) ; void remove( CMainForm* form ) ;
private: MainFormManager() ; ~MainFormManager() ;
std::set< CMainForm* > myActiveForms ; } ;
MainFormManager& MainFormManager::instance() { // Selon l'utilisation, c'est possible qu'il // faut un lock ici. static MainFormManager theOneAndOnly ; return theOneAndOnly ; }
CMainForm* MainFormManager::create( ??? ) { CMainForm* result = new CMainForm( ??? ) ; myActiveForms.insert( result ) ; return result ; }
void MainFormManager::remove( CMainForm* form ) { myActiveForms.erase( form ) ; delete form ; }
MainFormManager::MainFormManager() { }
MainFormManager::~MainFormManager() { if ( ! myActiveForms.empty() ) { // Logge l'anomalie. On vire le DLL pendant qu'on // s'en sert encore... } while ( ! myActiveForms.empty() ) { delete *myActiveForms.begin() ; } }
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
James Kanze
Fabien LE LEZ writes:
|> Pas le temps de lire sérieusement ton message, mais j'ai très |> très nettement l'impression qu'il est complètement HS ici, et |> aurait plus sa place sur fr.comp.os.ms-windows.programmation.
Je crois qu'il y a une partie au moins qui n'est pas HS, mais il faut dire qu'il a fait un maximum pour le camoufler:-).
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Fabien LE LEZ <gramster@gramster.com> writes:
|> Pas le temps de lire sérieusement ton message, mais j'ai très
|> très nettement l'impression qu'il est complètement HS ici, et
|> aurait plus sa place sur fr.comp.os.ms-windows.programmation.
Je crois qu'il y a une partie au moins qui n'est pas HS, mais il faut
dire qu'il a fait un maximum pour le camoufler:-).
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> Pas le temps de lire sérieusement ton message, mais j'ai très |> très nettement l'impression qu'il est complètement HS ici, et |> aurait plus sa place sur fr.comp.os.ms-windows.programmation.
Je crois qu'il y a une partie au moins qui n'est pas HS, mais il faut dire qu'il a fait un maximum pour le camoufler:-).
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Ok merci je vais analyser tout ça ;-) Bo,n courage.
Avant votre plongée dans le MSDN : - Penser à regarder les méthodes InitInstance et ExitInstance de votre classe CMain. Il me semble qu'elles sont appelées après décodage des paramètres de DllMain. - Le seul cas ressemblant que j'ai eu à traiter (DLL à tableau de bord dans mon cas) était un peu particulier, puisqu'il s'agissait de DLLs de hook. J'avais de toutes façons besoin d'un lanceur, qui tray-iconisait le tableau de bord. Dans ce cas, c'est bien entendu tout con. Pierre
"ng" <ng@babeuk.net> a écrit dans le message de news:
bspnbg$a1e$1@news-reader5.wanadoo.fr...
Ok merci je vais analyser tout ça ;-)
Bo,n courage.
Avant votre plongée dans le MSDN :
- Penser à regarder les méthodes InitInstance et ExitInstance de votre
classe CMain. Il me semble qu'elles sont appelées après décodage des
paramètres de DllMain.
- Le seul cas ressemblant que j'ai eu à traiter (DLL à tableau de bord dans
mon cas) était un peu particulier, puisqu'il s'agissait de DLLs de hook.
J'avais de toutes façons besoin d'un lanceur, qui tray-iconisait le tableau
de bord. Dans ce cas, c'est bien entendu tout con.
Pierre
Ok merci je vais analyser tout ça ;-) Bo,n courage.
Avant votre plongée dans le MSDN : - Penser à regarder les méthodes InitInstance et ExitInstance de votre classe CMain. Il me semble qu'elles sont appelées après décodage des paramètres de DllMain. - Le seul cas ressemblant que j'ai eu à traiter (DLL à tableau de bord dans mon cas) était un peu particulier, puisqu'il s'agissait de DLLs de hook. J'avais de toutes façons besoin d'un lanceur, qui tray-iconisait le tableau de bord. Dans ce cas, c'est bien entendu tout con. Pierre