2016-05-11 1 views
2

J'appelle un appel à la fonction Windows SetProcessDpiAwareness comme première chose dans mon application Delphi XE7 (après le chargement dynamique de la DLL shcore). Je sais qu'il est préférable d'utiliser un manifeste pour définir la valeur de DPIAware et je l'ai fait fonctionner séparément et je l'utiliserai éventuellement. Cependant, pendant le développement, je veux utiliser un paramètre de ligne de commande pour définir la valeur DPIAwareness, sinon je dois reconstruire l'application pour changer cet état.Code d'erreur SetProcessDpiAwareness

Le problème est que SetProcessDpiAwareness renvoie le code d'erreur $ 800700A0. Cela n'est pas documenté dans la description de la fonction, que signifie le code?

Ah je l'ai trouvé, grâce à la réponse à regarder le paramètre, je l'avais déclaré le type de fonction mal, j'avais:

TSetDPIFunc = function (const PROCESS_DPI_AWARENESS): HRESULT; stdcall;

mais PROCESS_DPI_AWARENESS n'a pas été défini comme une énumération. Modifié pour le suivant et il fonctionne maintenant bien:

TSetDPIFunc = fonction (const x: Entier): HRESULT; stdcall;

+1

Appelez-vous 'SetProcessDPIAwareness' ou' SetProcessDPIAware'? Le titre suggère le premier. Ce dernier ne renvoie aucun code d'erreur, un retour non nul signifie que la fonction a réussi. S'il vous plaît modifier la question pour effacer. –

+0

Si vous appelez en effet SetProcessDPIAwareNESS, veuillez nous indiquer avec quel argument vous l'appelez! – CherryDT

+0

La fonction est SetProcessDpiAwareness, désolé typo dans la publication originale. – kaj66

Répondre

1

0x8007XXXX est un Win32 error code encapsulated in a COM HRESULT utilisant HRESULT_FROM_WIN32(). WIN32_FROM_HRESULT(0x800700A0) donne 0xA0, c'est-à-dire le code d'erreur 160, qui est ERROR_BAD_ARGUMENTS ("Un ou plusieurs des paramètres d'entrée ne sont pas corrects").

Cela n'a aucun sens pour moi que vous obtenez cette erreur, puisque cette fonction ne prend même pas d'arguments!

La seule chose que je peux penser serait qu'il a quelque chose à avec the issue described here, en supposant que vous avez changé vous-même paramètres que le DPI pour les tests et il a échoué alors:

Il semble donc que pour SetProcessDPIAware (et les approches connexes: SetProcessDpiAwareness() et manifester avec true) pour fonctionner correctement, il faut se déconnecter et se reconnecter après avoir modifié le paramètre DPI et avant d'exécuter le programme.

Par ailleurs, dans le cas où cela est utile: Pour les tests se manifeste sans totalement la reconstruction, vous pouvez utiliser mt.exe pour attacher un manifeste à l'application de la ligne de commande.

+1

Vous pouvez également enregistrer le contenu du manifeste dans un fichier '.manifest' distinct dans le même dossier que l'exécutable, au lieu de le compiler dans une ressource. Par exemple, si l'exécutable de votre application s'appelle MyApp.exe, enregistrez le manifeste dans MyApp.exe.manifest. Ensuite, vous pouvez simplement modifier le fichier au besoin entre les exécutions. –

+0

Seulement si vous n'avez pas de manifeste déjà incorporé, ce qui pourrait être la valeur par défaut du compilateur (parce que c'est aussi encouragé par Microsoft). Depuis Windows Vista, les manifestes externes seront ignorés s'il en existe un. – CherryDT

+2

Vous pouvez désactiver le manifeste incorporé par défaut dans les options du projet. –