2013-03-07 111 views
0

我在解除受保護的excel的VBA項目時遇到問題。通過SendKeys保護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) 

這個爲什麼它的工作任何幫助嗎?

+0

請問爲什麼要在運行時解除VB項目的保護? – 2013-03-07 14:02:32

+0

我們有要求在運行時向excel添加一個新宏 – 2013-03-07 14:38:00

+0

老實說,這不是你想要做的。 您應該打開Excel文件,在Visual Basic編輯器項目瀏覽器中手動解除保護,並在保存宏工作簿並將其提供給用戶之前添加新代碼。 – 2013-03-07 14:58:08

回答

1

你部署了什麼樣的環境?

這似乎是集未在其中是一個完全信任的安全上下文中運行,爲什麼某些API調用是不是允許

documentation

到Shell函數調用需要完全信任(SecurityException類)。

UPDATE

基於業務方案的意見,似乎確實正在舉辦一個COM組裝+容器沒有被授予FullTrust。

爲了解決這個問題,您可以考慮在FullTrust的目標計算機上將單獨的程序集部署到目標機器上的GAC中,並在此程序集上啓用AllowPartiallyTrustedCallers選項。此程序集必須是在其他COM +託管程序集上調用SendKeys的程序集。

但最終,正如其他人指出的,這可能不是正確的解決方案。一般SendKeys應該非常謹慎地使用,並且可能有其他更好的方法來實現您的目標。

+0

所示的API,這就拋開了是否有人可以真的要依靠SendKeys來解除生產環境中的VB項目 - 甚至是否應該完成! – 2013-03-07 14:02:08

+0

我們使用經典的asp作爲前端。我們將把我們的dll對象部署到com +應用程序中 – 2013-03-07 14:52:37

+0

您使用的Excel版本是什麼_和**你在用什麼** - 是報告還是計算? – 2013-03-07 15:07:31