2015-01-21 50 views
0

我有一個Windows服務來轉換文件從用戶的上傳。但我發現有時服務會卡住,填充使服務卡住加密,當我調試它我發現程序仍沒有得到該行響應,同時該文件被加密:如何處理使用Microsoft.Office.Interop加密文件

doc = newApp.Documents.Open(ref Source, ref Unknown, ref readOnly, 
       ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, 
       ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown);` 

我試圖設置一個錯誤的密碼和預期的例外,但它仍然可以從同一個地方卡住:

object testPassword = "123"; 
doc = newApp.Documents.Open(ref Source, ref Unknown, ref readOnly, 
       ref Unknown, ref testPassword, ref Unknown, ref Unknown, ref Unknown, ref Unknown, 
       ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown);` 

我想這可能是密碼對話框阻止當前線程(wh恩打開加密文件直接,它會顯示),所以我試圖捕捉和利用的Windows API關閉它:

[DllImport("User32.dll ", EntryPoint = "FindWindowEx", SetLastError = true)] 
internal static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName); 

[DllImport("User32.dll ", EntryPoint = "SendMessage", SetLastError = true)] 
internal static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam); 

我使用其他線程來監視「密碼」對話框,只要它顯示,關閉它。

IntPtr passworHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "Password"); 
    if (passworHwnd != IntPtr.Zero) 
    { 
     //0x0010 is WM_CLOSE value 
     SendMessage(passworHwnd, 0x0010, IntPtr.Zero, "0"); 
    } 

但是我發現,當我在程序中打開文件時,將顯示不出「密碼」對話框,因爲這個詞的過程是不可見的對話框是看不見也因此在Windows API無法獲得的「密碼」對話框。

請給我一些建議。

回答

0

由於Office可能不支持Microsoft Office應用程序從任何無人值守的非交互式客戶端應用程序或組件(包括ASP,ASP.NET,DCOM和NT服務),因此Microsoft目前不推薦並不支持Microsoft Office應用程序的自動化。當Office在此環境中運行時表現出不穩定的行爲和/或死鎖。

如果您正在構建一個在服務器端上下文中運行的解決方案,那麼您應該嘗試使用對於無人執行安全的組件。或者,您應該嘗試找到允許至少部分代碼運行客戶端的替代方案。如果您從服務器端解決方案使用Office應用程序,則該應用程序將缺少成功運行所需的許多必要功能。此外,您將面臨整體解決方案穩定性的風險。

您可以在Considerations for server-side Automation of Office文章中閱讀更多關於此的內容。

+0

我知道,但是很難找到另一個免費的通用組件,比如office-interop.Do you have any suggestions about office components? – jarvanJiang 2015-01-22 00:53:04