【问题标题】:Un Protecting excel VBA Project through SendKeysUn 通过 SendKeys 保护 excel VBA 项目
【发布时间】:2013-03-07 13:42:17
【问题描述】:

我在取消保护受保护 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)

任何帮助说明为什么它的工作原理?

【问题讨论】:

  • 请问为什么要在运行时解除对VB项目的保护?
  • 我们需要在运行时向 excel 添加一个新宏
  • 老实说,这不是您想要做的。您应该只打开 Excel 文件,在 Visual Basic 编辑器项目资源管理器中手动取消保护,并在保存宏工作簿并使其可供用户使用之前添加新代码。
  • 你可能想使用HERE所示的API

标签: c# excel vba


【解决方案1】:

您部署到什么样的环境中?

似乎程序集没有在完全信任的安全上下文中运行,这就是不允许某些 API 调用的原因

来自documentation

对 Shell 函数的调用需要完全信任(SecurityException 类)。

更新

根据 OP 的 cmets,似乎确实没有授予在 COM+ 容器中托管的程序集 FullTrust。

为了解决此问题,您可以考虑使用 FullTrust 将单独的程序集部署到目标计算机上的 GAC 中,并在此程序集上启用 AllowPartiallyTrustedCallers 选项。该程序集必须是在您的其他 COM+ 托管程序集上调用 SendKeys 的程序集。

但最后,正如其他人指出的那样,这可能不是正确的解决方案。一般来说,SendKeys 应该非常谨慎地使用,并且可能还有其他更好的方法来实现您的目标..

【讨论】:

  • 这撇开是否有人真的可以依靠 SendKeys 在生产环境中解除对 VB 项目的保护的问题 - 甚至是否应该这样做!
  • 我们使用经典的 asp 作为前端。我们会将我们的 dll 对象部署到 com+ 应用程序中
  • 尝试使用什么版本的 Excel 以及 您使用它的目的是什么 - 是报告还是计算?
  • 我们使用的是 office 2010,我们将它用于报告和计算
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多