Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过SendKeys取消对excel VBA项目的保护_C#_Excel_Vba - Fatal编程技术网

C# 通过SendKeys取消对excel VBA项目的保护

C# 通过SendKeys取消对excel VBA项目的保护,c#,excel,vba,C#,Excel,Vba,我在解除受保护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 + "~

我在解除受保护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)

这方面有什么帮助吗?为什么它能工作?

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

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

从:

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

更新

根据OP的评论,似乎确实在COM+容器中承载的程序集没有被授予FullTrust

为了解决此问题,您可以考虑将一个单独的程序集部署到目标机器上的GAC中,并使用FultReal信任并启用该程序集上的AuthPrimeRealStistDel来电选项。此程序集必须是在其他COM+托管程序集上调用SendKeys的程序集


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

这就撇开了一个问题,即是否有人真的可以依靠SendKeys在productiion环境中解除对VB项目的保护,或者甚至是否应该这样做!我们使用经典的asp作为前端。我们将把dll对象部署到com+应用程序中您尝试使用哪个版本的Excel,以及您使用它的目的是什么?是报告还是计算?我们使用的是office 2010,我们在报告和计算中都使用它。我可以问一下,为什么要在运行时取消对VB项目的保护?我们要求在运行时向excel中添加一个新宏。老实说,这不是您想要做的。您只需打开Excel文件,在Visual Basic编辑器项目资源管理器中手动取消对其的保护,然后在保存宏工作簿并使其可供用户使用之前添加新代码。您可能希望使用API,如图所示