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 :

SystemParametersInfo : ne fait rien


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut SystemParametersInfo : ne fait rien
    Bonjour,
    je suis actuellement en train de créer plusieurs fonctions pour un programme. Certaines de ces fonction font simplement appel à "SystemParametersInfo". Mais mon problème est que ça ne fonctionne pas...

    Voilà l'une de mes fonctions qui ne fonctionne visiblement pas, elle permet normalement de changer le fond d'écran. Les paramètres de la fonction sont obligatoirement comme ça (c'est une restriction à laquelle je dois faire face) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    short WINAPI DLLExport act_SetDeskWallpaper(LPRDATA rdPtr, long param1, long param2)
    {
    	LPSTR path	= (LPSTR)param1;
    	int save	= ((BOOL)param2!=0)?(SPIF_UPDATEINIFILE):(0);
    	SystemParametersInfo(SPI_SETDESKWALLPAPER,0,path,SPIF_SENDCHANGE | save);
    	return 0;
    }
    Comme précisé, je ne peux pas changer le prototype qui est une restriction car c'est destiné à la création d'une DLL utilisée comme plugin pour un autre logiciel.

    Cette fonction récupère deux arguments "param1" et "param2". Le premier est casté en Chaine de caractère (utilisée pour le chemin du wallpaper) et le deuxieme sert à indiquer si le changement doit être sauvé pour l'utilisateur ou temporaire (true/false).

    Un peu d'aide ou une piste pour savoir pourquoi ça ne fonctionne pas me serait très utile.

    Merci beaucoup d'avance,
    Sphax

  2. #2
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    Si ca ne marche pas, que retourne la fonction, ainsi que GetLastError() si la fonction est en erreur (tant qu'a faire, le message en clair, récupéré avec FormatMessate() - ref. MSDN)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    Merci pour cette piste !
    J'ai donc rajouté deux fonctions à ma DLL plugin pour récupérer l'erreur et j'obtiens l'erreur suivante :
    - Erreur 5 : Accès refusé

    Que faut-il faire pour avoir accès à cette fonction ?

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Sphaxou
    j'obtiens l'erreur suivante :
    - Erreur 5 : Accès refusé
    Que faut-il faire pour avoir accès à cette fonction ?
    C'est tout bonnement que pour effectuer cette opération tu n'as pas les droits utilisateurs pour le faire ( administrateur ? ) ou bien qu'il faille effectuer d'autres initialisations.

    short WINAPI DLLExport act_SetDeskWallpaper(LPRDATA rdPtr, long param1, long param2)
    {
    LPSTR path = (LPSTR)param1;
    Pourquoi passer un long en paramêtre ( long param1) qui est converti en LPSTR ?
    Eviter les "casts" à tout prix.
    Je ne comprends pas pourquoi tu passes un long alors qu'il suffit de passer un TCHAR ou LPSTR.
    Mets un point d'arrêt sur la ligne d'affectation ci-dessus et regardes ce que vaut path.
    Je suis persuadé que path vaut n'importe quoi sauf un fichier valide d'image

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    Je suis pourtant administrateur sur mon PC...

    Pour le prototype, j'ai bien précisé que je ne peux pas le changer car c'est un prototype type pour une DLL utilisé comme plugin par un logiciel. C'est une restriction à laquelle je dois faire face.
    Cependant le cast ne pose aucun problème car j'ai déjà fait d'autres fonctions du type et elles fonctionnent (comme changer le titre de l'application).

    Le problème est l'erreur étrange...

    tu dit :
    ou bien qu'il faille effectuer d'autres initialisations.
    Quel genre d'initialisations ?

    Merci pour l'aide

    EDIT: Je précise que changer le Wallpaper ne fonctionne pas tout comme TOUTES les autres constantes utilisées avec "SystemParametersInfo" sauf les constantes GET.

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Sphaxou
    Cependant le cast ne pose aucun problème car j'ai déjà fait d'autres fonctions du type et elles fonctionnent (comme changer le titre de l'application).
    Si quelqu'un peut m'expliquer comment d'un long on obtient une chaine de caractêres je lui tire ma révérence.
    Un long c'est 4 octets en général donc ça fait 4 caractères suffisant pour stocker ".bmp" par exemple

    Tu déclares ceci:
    short WINAPI DLLExport act_SetDeskWallpaper(LPRDATA rdPtr, long param1, long param2)
    {
    LPSTR path = (LPSTR)param1;
    ESt-ce que j'ai bien lu et 2iemement est-ce que tu as mis un point d'arrêt sur ces lignes ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    le "long" contient sans aucun doute un pointeur et non la chaine même. D'où le cast possible (de types pointeur).

    Pour le point d'arrêt, je ne peux pas utiliser ça vu que c'est une DLL que je compile et que son fonctionnement ne se fait que dans le logiciel qui la charge.

    Ensuite, merci de m'aider, c'est super sympa mais le problème ne viens pas de là du cast ni du prototype car comme j'ai dit je fait déjà une fonction qui change le titre de la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    short WINAPI DLLExport act_SetWindowTitle(LPRDATA rdPtr, long param1, long param2)
    {
    	LPCTSTR title=(LPCTSTR)param1;
    	SetWindowText(rdPtr->win,title);
    	return 0;
    }
    Cette fonction fonctionne très bien... hors les fonctions avec "SystemParametersInfo" (avec une constante set) ne font rien et l'erreur retournée est "accès refusé"...



    EDIT: rdPtr->win contient un handle d'une fenêtre.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sous quel utilisateur s'exécute le programme ? S'il s'exécute sous un utilisateur différent, c'est peut-être normal que l'accès soit refusé...
    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 à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    D'après le gestionnaire des taches de Windows, le programme s'execute sous mon compte (ce qui parrait logique)...

    J'ai beau chercher, je pige vraiment pas le soucis... En plus le MSDN ne dit pas pour quelles raison il peut y avoir un accès refusé aux paramètres systèmes...

Discussions similaires

  1. [PHP-JS] Méthode flush() qui ne fait rien
    Par Khrysby dans le forum Langage
    Réponses: 9
    Dernier message: 21/05/2006, 19h55
  2. PostQuitMessage ne fait rien
    Par venomelektro dans le forum Windows
    Réponses: 1
    Dernier message: 04/01/2006, 11h16
  3. [debutant]programme qui ne fait rien.
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 04/12/2005, 22h19
  4. procédure stockée qui ne fait rien
    Par trotters213 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 10/03/2005, 20h25
  5. [Process] pb exec sous unix, ne plante pas mais ne fait rien
    Par NiBicUs dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/12/2004, 05h27

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