2016-05-11 48 views
2

私は、(動的にshcore DLLを読み込んだ後に)私のDelphi XE7アプリケーションの最初のものとして、SetProcessDpiAwarenessウィンドウ関数への呼び出しを追加しています。私はマニフェストを使用してDPIAwareの値を設定することが望ましいことを知っています。私はそれを別に動作させ、最終的に使用します。しかし、開発中に私はDPIAwareness値を設定するためにコマンドラインパラメータを使用したい、そうでなければ、このステータスを変更するために、アプリケーションを再構築する必要があります。SetProcessDpiAwarenessエラーコード

問題は、SetProcessDpiAwarenessがエラーコード$ 800700A0を返すことです。 関数の説明には記載されていませんが、コードはどういう意味ですか?

私はそれを見つけたああは、パラメータを見て答えのおかげで、私は関数型が間違っていると宣言していた、私が持っていた:

TSetDPIFunc =関数(定数PROCESS_DPI_AWARENESS):HRESULTを。 stdcall;

しかし、PROCESS_DPI_AWARENESSは列挙型として定義されていませんでした。 以下に変更され、正常に動作します。

TSetDPIFunc = function(const x:整数):HRESULT; stdcall;

+1

あなたは 'SetProcessDPIAwareness'または' SetProcessDPIAware'を呼び出していますか?タイトルは前者を示唆している。後者はエラーコードを返しません。ゼロ以外の戻り値は関数が成功したことを意味します。質問を編集してクリアしてください。 –

+0

実際にSetProcessDPIAwareNESSを呼び出している場合は、どの引数で呼び出すかを教えてください! – CherryDT

+0

この関数はSetProcessDpiAwarenessです。元の投稿には誤字があります。 – kaj66

答えて

1

0x8007XXXXは、HRESULT_FROM_WIN32()を使用してWin32 error code encapsulated in a COM HRESULTです。 WIN32_FROM_HRESULT(0x800700A0)0xA0となり、エラーコード160はERROR_BAD_ARGUMENTS(「1つ以上の入力パラメータが正しくありません」)となります。

このエラーは、は何も引数を取らないので、私には意味がありません。

だから私は考えることができる唯一のことは、それはあなたがDPIは、テストのために自分自身を設定し、それが失敗した変更と仮定すると、the issue described hereとに何かを持っていることを次のようになります。

をだから、SetProcessDPIAwareためにと思われます(および関連するアプローチ:SetProcessDpiAwareness()とマニフェストをtrueにする)が正しく機能するには、DPI設定を変更してからプログラムを実行する前にログアウトして再度ログインする必要があります。ところで

は、ケースでは、これは便利です:テストは完全に再構築することなく現れるためには、コマンドラインからアプリケーションにマニフェストを添付するmt.exeを使用することができます。

+1

マニフェストのコンテンツを、リソースにコンパイルするのではなく、実行可能ファイルと同じフォルダにある別の '.manifest'ファイルに保存することもできます。たとえば、アプリケーションの実行ファイルの名前が 'MyApp.exe'である場合、マニフェストを' MyApp.exe.manifest'に保存します。次に、実行の間に必要に応じてファイルを編集するだけです。 –

+0

マニフェストが既に組み込まれていない場合にのみ、コンパイラのデフォルトである可能性があります(これはMicrosoftによっても推奨されているためです)。 Windows Vista以降、組み込みのマニフェストが存在する場合、外部マニフェストは無視されます。 – CherryDT

+2

[プロジェクトオプション]でデフォルトの埋め込みマニフェストをオフにすることができます。 –