2016-05-11 11 views
2

Ich bin ein Aufruf der SetProcessDpiAwareness Windows-Funktion als erste Sache in meiner Delphi XE7-Anwendung (nach dem dynamischen Laden der Shcore-DLL). Ich weiß, dass es vorzuziehen ist, ein Manifest zu verwenden, um den DPIAware-Wert festzulegen, und ich habe das separat arbeiten und wird es schließlich verwenden. Während der Entwicklung möchte ich jedoch einen Kommandozeilenparameter verwenden, um den DPIA-Wert einzustellen, ansonsten muss ich die App neu erstellen, um diesen Status zu ändern.SetProcessDpiAwareness Fehlercode

Das Problem ist, dass SetProcessDpiAwareness den Fehlercode $ 800700A0 zurückgibt. Das ist nicht in der Funktionsbeschreibung dokumentiert, was bedeutet der Code?

Ah ich es gefunden habe, dank der Antwort auf den Parameter suchen, ich die Funktionstyp falsch erklärt hatte, ich hatte:

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

, aber PROCESS_DPI_AWARENESS wurde nicht als Aufzählung definiert. Geändert zu den folgenden und es funktioniert jetzt gut:

TSetDPIFunc = funktion (const x: Integer): HRESULT; stdcall;

+1

Rufen Sie 'SetProcessDPIAwareness' oder' SetProcessDPIAware' an? Der Titel deutet auf Ersteres hin. Letztere gibt keinen Fehlercode zurück, eine Rückgabe ungleich Null bedeutet, dass die Funktion erfolgreich war. Bitte bearbeiten Sie die zu löschende Frage. –

+0

Falls Sie tatsächlich SetProcessDPIAwareNESS aufrufen, zeigen Sie uns bitte, mit welchem ​​Argument Sie es nennen! – CherryDT

+0

Die Funktion ist SetProcessDpiAwareness, sorry Typo im ursprünglichen Beitrag. – kaj66

Antwort

1

0x8007XXXX ist ein Win32 error code encapsulated in a COM HRESULT mit HRESULT_FROM_WIN32(). WIN32_FROM_HRESULT(0x800700A0) ergibt 0xA0, d. H. Fehlercode 160, der ERROR_BAD_ARGUMENTS ist ("Einer oder mehrere der Eingabeparameter sind nicht korrekt").

Es ergibt keinen Sinn für mich, dass Sie diesen Fehler bekommen, da diese Funktion nicht einmal Argumente nimmt!

Das einzige, was ich denken kann, wäre, dass es etwas mit the issue described here hat, vorausgesetzt, Sie die DPI sich zum Testen Einstellungen geändert und es scheiterte dann:

So scheint es, dass, um für SetProcessDPIAware (und die damit verbundenen Ansätze: SetProcessDpiAwareness() und manifest mit true), um korrekt zu funktionieren, muss man sich abmelden und erneut einloggen, nachdem man die DPI-Einstellung geändert hat und bevor das Programm läuft.

By the way, für den Fall, das ist hilfreich: Für die Prüfung ohne völlig Wiederaufbau manifestiert, könnte man mt.exe verwenden, um ein Manifest für Ihre Anwendung von der Kommandozeile zu befestigen.

+1

Sie können den Manifest-Inhalt auch in einer separaten '.manifest'-Datei im selben Ordner wie die ausführbare Datei speichern, anstatt sie in eine Ressource zu kompilieren. Wenn die ausführbare Datei Ihrer App beispielsweise den Namen "MyApp.exe" hat, speichern Sie das Manifest in "MyApp.exe.manifest". Dann können Sie die Datei einfach zwischen den Läufen bearbeiten. –

+0

Nur wenn Sie kein Manifest bereits eingebettet haben, was der Standard vom Compiler sein könnte (weil es auch von Microsoft empfohlen wird). Seit Windows Vista werden externe Manifeste ignoriert, wenn ein eingebettetes vorhanden ist. – CherryDT

+2

Sie können das eingebettete Standardmanifest in den Projektoptionen deaktivieren. –