IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Windows: problème avec PrintDlg()


Sujet :

C

  1. #1
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut Windows: problème avec PrintDlg()
    Bonjour à tous,

    Comme le dit le titre, j'ai un problème avec la fonction PrintDlg(). Celle-ci me renvoie systématiquement 0, avec un extended return code de 1, qui signifie que j'ai mal renseigné la taille de la structure passée en paramètre.

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	PRINTDLG pdlg;
     
    	setmem(&pdlg,sizeof(PRINTDLG),0);
    	pdlg.lStructSize=sizeof(pdlg);
    	rc=PrintDlg(&pdlg);
    	if(rc==0) printf("Printdlg returns 0, extended error code is %d\n",CommDlgExtendedError());
    Pour info,
    CommDlgExtendedError()
    Structure PRINTDLG
    PrintDlg()

    En espérant que quelqu'un ait une idée.... Merci d'avance.

    Edgar;

    PS: je suis sous win7, mais la même erreur survient sous xp (machine virtuelle)
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Salut
    C'est bizarre que tu doives stocker la taille de ta structure dans un de ses membres vu que la taille est facilement récupérable via sizeof() quand on en a besoin. J'ai pensé que tu t'étais trompé sur ce champ mais différents exemples du net m'ont montré que c'était ainsi donc je reste sur mon étonnement mais j'admets que c'est comme ça.
    Ceci dit, toi tu mets tous les autres champs à 0 alors qu'ici il y a un exemple détaillé dans lequel il est mentionné d'autres champs à remplir avec certaines valeurs...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est bizarre que tu doives stocker la taille de ta structure dans un de ses membres vu que la taille est facilement récupérable via sizeof() quand on en a besoin.
    Oui, je suis d'accord avec toi, mais la plupart des structures (windows) passées à des fonctions de l'api windows, doivent avoir leur taille renseignée dans (je pense) le premier membre.... va savoir pourquoi....

    Si tu as des exemples complets sur le net (et pourtant j'ai cherché!), stp donne-moi les url --> sorry, je n'avais pas vu que c'était un lien. Je vois ça cette nuit et reposte....

    Merci de ta réponse,

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est bizarre que tu doives stocker la taille de ta structure dans un de ses membres vu que la taille est facilement récupérable via sizeof() quand on en a besoin.

    http://blogs.msdn.com/b/oldnewthing/.../12/56061.aspx

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello à tous,

    Merci, magma, pour ta piste.

    J'ai fini par trouvé la solution (très vilaine, mais elle ne doit fonctionner que sur mon pc et celui de mon épouse (win7 64bits))

    Ayant ras-le-bol de tâtonner, j'ai écrit ce bout de code, jusqu'au moment où j'ai eu la fenêtre de choix devant les yeux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	setmem(&pdlg,sizeof(PRINTDLG),0);
    	pdlg.lStructSize=0;
     
    	do {
    		rc=PrintDlg(&pdlg);
    		if(rc==0) printf("Printdlg returns 0, extended error code is %d," ,CommDlgExtendedError());
    		printf("lstructsize=%d\n",pdlg.lStructSize);
    		pdlg.lStructSize++;
    	} while (rc==0);
    Il s'avère que si sizeof(PRINTDLG) renvoie 68, c'est 66 qu'il faut mettre dans lStructSize.... que je vais hardcoder! Si quelqu'un a une explication, je suis preneur....

    Merci à ceux qui ont lu ce post,

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Il s'avère que si sizeof(PRINTDLG) renvoie 68, c'est 66 qu'il faut mettre dans lStructSize...
    Impressionnant. Et si tu essayais de continuer ta boucle avec 67, 68, 69, 70, 71, ... pour voir si ça fonctionne avec d'autres valeurs ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello Sve@r,

    Merci de ton attention.

    Citation Envoyé par Sve@r Voir le message
    Impressionnant. Et si tu essayais de continuer ta boucle avec 67, 68, 69, 70, 71, ... pour voir si ça fonctionne avec d'autres valeurs ?
    Testé jusqu'à 1000: chnol ! Il n'y a que 66 qui fonctionne.... et heureusement que 666 ne fonctionne pas, ça foutrait la trouille !

    A+

    Edgar;

    EDIT: petit oubli: Joyeux Noël à tous !
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne reproduis pas ce comportement sous mon Windows 8.1 avec Visual 2005, ni Visual 2013.
    Ce code marche parfaitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void TestPrintDialog(void)
    {
    	PRINTDLG pdlg = {0};
    	pdlg.lStructSize = sizeof(pdlg);
    	printf("Test PrintDlg(): sizeof(pdlg) = %d.\n", (int)sizeof(pdlg));
    	BOOL rc = PrintDlg(&pdlg);
    	if(rc==FALSE) printf("Printdlg returns 0, extended error code is %d\n", CommDlgExtendedError());
    }
    Par contre, il m'affiche une taille de 66 pour 32 bits et 120 pour 64 bits. Il n'est pas normal que sizeof(pdlg) retourne 68 chez toi.

    Edit: Cela pourraît être un problème d'alignement: La somme des tailles des membres est égale à 66 (la valeur de sizeof), ce qui signifie qu'il n'y a aucun bourrage. Le membre hInstance n'est pas aligné sur sa taille, ce qui signifie que le compilo est réglé pour forcer l'alignement de la structure sur deux octets ou moins au lieu de l'alignement normal. Je parie que dans ta version, tu as deux octets de bourrage entre nCopies et hInstance.

    Edit2: Je confirme, le fichier d'en-tête ComDlg.h commence pratiquement par un #include <pshpack1.h> /* Assume byte packing throughout */ qui désactive tout bourrage (et il se termine par un #include <poppack.h> qui rétablit l'alignement normal). Cela doit être manquant dans ta version. Utiliserais-tu MinGW au lieu de Visual?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello Médinoc,

    Citation Envoyé par Médinoc Voir le message
    Utiliserais-tu MinGW au lieu de Visual?
    Ni l'un, ni l'autre, j'utilise Borland bcc32 (v5.6). Donc, si je te suis bien, je devrais forcer (en tout cas pour cette structure) mon compilateur à ne pas mettre de field de bourrage pour forcer l'alignement à l'intérieur de PRINTDLG ? Je vais voir comment faire ça avec les #pragma de Borland.... si c'est faisable !

    Merci de ta réponse,

    Edgar.

    EDIT: c'est bien la première fois que cela m'arrive, mais.... il faut un début à tout
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Borland C++ 5 ?
    N'est-ce pas pratiquement contemporain de Visual C++ 6, ce truc?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Borland C++ 5 ?
    N'est-ce pas pratiquement contemporain de Visual C++ 6, ce truc?
    Je n'en sais rien (et j'adore le "ce truc")
    Il ne compile qu'avec la norme C89, mais cela m'est amplement suffisant pour ce que je fais.

    A+

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  12. #12
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Je viens de tester avec le compilateur Borland ver 5.5, ça fonctionne correctement, la taille est 66.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  13. #13
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello CGI,

    Merci de ta réponse.

    Citation Envoyé par CGi Voir le message
    Je viens de tester avec le compilateur Borland ver 5.5, ça fonctionne correctement, la taille est 66.
    Voici un extrait de code, son output, la version du compliateur et la manière de compiler le programme (ligne de commande)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	PRINTDLG pdlg;
     
    	printf("sizeof(pdlg) is %d, sizeof(PRINTDLG)=%d\n",sizeof(pdlg),sizeof(PRINTDLG));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(pdlg) is 68, sizeof(PRINTDLG)=68
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Echo off
    bcc32 -Ob -d -w -q -c -WC %1.c
    if errorlevel 1 goto eob
    ilink32 -Tpe -ap -Gn -x -c c0x32 %1,%1,,import32 cw32i
    :eob
    C'est fou cette histoire !

    A+

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce n'est pas seulement la version du compilo qui est importante, mais aussi la version du SDK.
    J'ignore où la trouver, pas contre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. %display %window problème avec %if %then
    Par L0007 dans le forum SAS AF et formulaires
    Réponses: 2
    Dernier message: 24/10/2011, 13h03
  2. [Code::Blocks/Windows]Problème avec les thèmes GTK+
    Par 3alaovic dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 16/09/2009, 20h02
  3. [Installation] [Windows] Problème avec notepad
    Par kamy86 dans le forum Subversion
    Réponses: 1
    Dernier message: 26/02/2009, 11h42
  4. [Pthreads/Windows] Problème avec pthread_t
    Par dapounet dans le forum POSIX
    Réponses: 18
    Dernier message: 22/10/2008, 22h01
  5. Service Windows : problème avec état du service
    Par dlayla4 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/05/2008, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo