4

この質問をするのは、ログオン画面から実行できるスクリーンセーバー アプリを Delphi で作成するのが難しいことがわかったからです。

質問を参照してください: Delphi の Windows 7 ログオン スクリーンセーバー

問題 (または少なくとも 1 つの問題) を特定の Win API 呼び出しに絞り込みましたCreateEvent

SyncEvent := CreateEvent(nil, True, False, '');
if SyncEvent = 0 then
  RaiseLastOSError;

このコードは、ログオン画面から呼び出された場合にのみ失敗します。GetLastError は、アクセスが拒否されたことを返します。したがって、ログオン画面のセキュリティ制限により、CreateEvent(nil, True, False, '');必要に応じてイベントを作成できないことは明らかです。

(イベントがどのようにして悪用可能なセキュリティ リスクになるのか、私にはよくわかりません。)

質問は、ログオン画面からイベントを作成することは可能ですか? おそらく次のいずれかを介して:

  • 適切なlpEventAttributes
  • または、代わりに CreationEventEx を呼び出します。

この問題は Delphi で発生しましたが、これは Win API に関するものです。お好きな言語でお気軽にご回答ください

4

1 に答える 1

7

の代わりにの最後のパラメーターを設定してみてCreateEvent() ください。nil ポインターと長さ 0 の文字列へのポインターには違いがあります。ドキュメントには、長さ 0 の文字列が他の名前付き文字列とは異なる方法で処理されることについては何も記載されていません。 そのため、アプリがアクセスできないマシン上の別の場所に存在する、長さゼロの名前の別のイベントが存在する可能性があります。そのため、既存のイベントにアクセスしようとして失敗すると、アクセス拒否エラーが発生します。名前のないイベントを作成する場合は、代わりに を使用してください。nil''CreateEvent()nil

于 2014-07-14T15:03:27.720 に答える