2

Delphi 6 アプリケーションでEOSError 例外、コード 5、アクセスが拒否されますが、別の Windows 7 ユーザー アカウントに切り替えたとき、またはステーションをロックしたときにのみ発生します。スタック トレースを出力していますが、スタックのすぐ下にある Application.ProcessMessages() を使用した Application.Run() ステートメントからエラーが発生しているようです。残りのスタックは、私の例外処理コードです。

操作中、コードは ShellExecuteEx() を呼び出し、COM/ActiveX オブジェクトにアクセスしますが、それはユーザーがボタンを明示的にクリックした場合のみです。これは Windows 7 でのみ発生し、Windows XP では発生しません。ユーザーアプリデータディレクトリに完全にインストールされるようにアプリケーションを変更したため、管理者権限ディレクトリへのアクセスは必要ありません。それが問題ではないことはわかっていますが、念のため指摘しています。

これが発生すると、例外が猛烈に速くなります。私はそれらをトラップしてエラー ログに記録し、大量のダイアログ ボックスでユーザーを悩ませないようにしています。現在ログインしているユーザーから切り替えるか、ロックするだけで、これらのエラーの洪水を引き起こす原因を誰か教えてもらえますか? 現在のユーザー アカウントがアクティブでない場合、アプリで問題が発生するのはなぜですか?

一つの考え。ユーザーが現在ログインしていない場合、一部のビットマップ操作で問題が発生しますか? Windows API ビットマップ操作を継続的に実行してタグ クラウド イメージを更新する、回転するタグ クラウドがあります。それと何か関係があるのでしょうか?

もしそうなら、現在のユーザーが切り替えられたりロックされたりしたときにタグ クラウドを非アクティブ化することもできますが、次のスタック オーバーフローの投稿で言及されているイベントに反応する Delphi 用のコードが必要になると思います。

WPF アプリケーションから Lock This Computer コマンドを検出するにはどうすればよいですか?

更新:追加のテストをいくつか行いました。対話しているソフトウェアである Evernote の COM/ActiveX インターフェイスにアクセスするまで、エラーは発生しません。COM API を介して Evernote への最初の呼び出しを行うと、ステーションをロックするとすぐにエラーが発生します。

4

2 に答える 2

2

問題を見つけました。これは、タイマーでControls.TMouse.GetCursorPos()を呼び出して、元の投稿で言及したタグクラウドビューを更新しているためです。別のユーザーアカウントに切り替えたり、ステーションをロックしたりする場合など、現在のデスクトップが利用できない場合、この関数は例外を発生させます。このStackOverflowの投稿では、GetCursorPos()関数の一般的なWinAPIコンテキストからの問題について説明しています。

TMouse.GetCursorPosの呼び出しが、「OS関数の呼び出しに失敗しました」で失敗することがあります

上記の投稿の著者とは対照的に、それはWindows 7でのみ発生し、WindowsXPでは発生しません。コードを変更して、アクティブデスクトップが使用できなくなったことを検出し、TLamaから提案された、以下のリンク先の投稿で説明されているセッションロック/ロック解除/ログオン/ログオフ検出手法を使用してその呼び出しを抑制する必要があります。DavidHeffernanの答えを参照してください:

リモートデスクトップサービスを「サポート」するために、アプリケーションは何をする必要がありますか?

于 2012-10-09T01:09:51.093 に答える
1

可能であれば、ユーザーがプログラムを互換モード XP SP3 に変更すると、これらのエラーが解消される可能性があります。これは明らかに回避策です。

Windows で何が起こっているかを確認するために processmonitor使用できます: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspxfilemon

完全なスイートの場合: http://technet.microsoft.com/en-us/sysinternals/bb842062

于 2012-10-08T10:37:33.833 に答える