0

保護されたExcelのVBAプロジェクトの保護を解除しているときに問題が発生しました。

IntPtr hWnd = FindWindow(null, ES.oXL.VBE.MainWindow.Caption);//Find window
  if (hWnd != IntPtr.Zero)
  {
      bool ret = BringWindowToTop(hWnd); //Bring VBE to top.
  }

  SendKeys.SendWait("%{F11}%TE" + strPassword + "~~%{F11}");
  SendKeys.SendWait("{ENTER}");
  SendKeys.SendWait("xyz");
  SendKeys.SendWait("{ENTER}");

VBAプロジェクトの保護を解除するために、このようなコードを作成しました。アプリケーションをデバッグするときに正常に動作します。

comオブジェクトモデルを使用します。dllハイブに同じdllを適用したときに、以下のエラーが発生する関数を呼び出します

System.ComponentModel.Win32Exception: Access is denied at System.Windows.Forms.SendKeys.SendInput(Byte[] oldKeyboardState, Queue previousEvents)

なぜそれが機能するのか、これに関する助けはありますか?

4

1 に答える 1

1

どのような環境にデプロイしましたか?

アセンブリが完全信頼のセキュリティ コンテキストで実行されていないように見えるため、特定の API 呼び出しが許可されていません。

ドキュメントから:

Shell 関数の呼び出しには、完全な信頼 (SecurityException クラス) が必要です。

アップデート

OP のコメントに基づくと、実際には COM+ コンテナーでホストされているアセンブリには FullTrust が付与されていないようです。

これを回避するには、FullTrust を使用して別のアセンブリをターゲット マシンの GAC に展開し、このアセンブリで AllowPartiallyTrustedCallers オプションを有効にすることを検討してください。このアセンブリは、COM+ でホストされている他のアセンブリで SendKeys を呼び出すアセンブリである必要があります。

しかし、結局のところ、他の人が指摘しているように、これは正しい解決策ではないかもしれません. 一般に、SendKeys は非常に慎重に使用する必要があり、目標を達成するための他のより良い方法がおそらくあります..

于 2013-03-07T13:47:11.847 に答える