2017-10-07 3 views
-2

J'utilise la fonction SystemParametersInfo pour obtenir le fond d'écran et il est supposé que lors de l'ajout de l'action SPI_GETDESKWALLPAPER à la fonction renvoie une chaîne.'SystemParametersInfo' fonction renvoie une valeur incorrecte lors de l'obtention du fond d'écran

LPWSTR bgPath; 
if(!SystemParametersInfo(SPI_GETDESKWALLPAPER, 0, bgPath, SPIF_UPDATEINIFILE)){ 
    qDebug() << *bgPath; 
    return; 
} 
qDebug()<< "an error occurred"; 

Le problème est que la fonction renvoie une valeur numérique (ex: 50121) au lieu d'une chaîne.
Y a-t-il un problème dans mon code?

+2

Il ne comprend pas pourquoi vous écrire ce code. C'est comme si vous n'aviez pas lu la documentation. Il dit ce qui suit: * Récupère le chemin complet du fichier bitmap pour le fond d'écran. Le paramètre pvParam doit pointer vers un tampon pour recevoir la chaîne de chemin à terminaison nulle. Définissez le paramètre uiParam sur la taille, en caractères, du tampon pvParam. La chaîne renvoyée ne dépassera pas les caractères MAX_PATH. S'il n'y a pas de fond d'écran, la chaîne renvoyée est vide. * –

+1

Vous avez donc les deux paramètres erronés et le paramètre Al du fichier est erroné. En plus de tout le reste, vous gérez mal la valeur de retour. –

+1

Oui, vous êtes censé utiliser un WCHAR [] pour écrire le nom du fichier dans le tampon. Et passez la taille du tableau pour qu'il ne puisse pas écrire trop. Et corrigez l'instruction if(), vous avez déjà remarqué qu'elle est retournée FALSE pour indiquer l'échec. Et utilisez GetLastError() pour découvrir pourquoi il a échoué, toujours important de découvrir pourquoi les appels de fonction winapi ne fonctionnent pas. –

Répondre

2

Vous n'allouer de la mémoire pour bgPath pour SystemParametersInfo() remplir

par la documentation SPI_GETDESKTOPWALLPAPER.

Le paramètre pvParam doit pointer vers un tampon pour recevoir la chaîne de chemin terminée par zéro. Définissez le paramètre uiParam sur la taille, en caractères, du tampon pvParam. La chaîne renvoyée ne dépassera pas MAX_PATH caractères.

Même si vous allouiez un tampon, vous vérifiez la valeur de retour de SystemParametersInfo() pour l'échec au lieu de succès. Et vous déréférencer votre pointeur de chaîne, donc au mieux vous ne sortirez que le premier caractère, pas la chaîne entière.

Utilisez ce lieu:

WCHAR bgPath[MAX_PATH]; 

if (SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, bgPath, 0)) 
{ 
    qDebug() << bgPath; 
    return; 
} 
qDebug() << "an error occurred"; 
+0

Je vous remercie pour votre réponse. malheureusement, la fonction renvoie une adresse (ex: 0x28c1c0). –

+0

@LionKing est-ce que 'qDebug()' accepte les chaînes Unicode pour commencer? Ou seulement les chaînes ANSI? Si c'est le cas, convertissez 'bgPath' en ANSI en utilisant' WideCharToMultiByte() ', ou utilisez' SystemParametersInfoA() 'avec un tampon' char [] ' –

+1

@LionKing: Comme il n'y a pas de surcharge' operator << 'pour' QDebug 'en prenant un' const wchar_t * ', la recherche correspondra à la surcharge du pointeur générique, prenant un' const void * '. Cela affichera la valeur du pointeur. Si vous voulez vider une chaîne de caractères large, vous devez d'abord construire un 'QString' temporaire:' qDebug() << QString (bgPath); '. – IInspectable