2010-08-04 27 views
8

Tôi có dịch vụ cửa sổ được viết bằng C# đọc văn bản từ tài liệu từ (doc và docx) bằng cách sử dụng VBA Interop. Tuy nhiên, trên một số tài liệu, dường như nó treo trên lời gọi đến phương thức Open. Dường như tất cả các tài liệu đều có macro trong đó. Phiên bản cài đặt tại địa phương của từ có macro tàn tật và mã tôi sử dụng để mở tài liệu như sau:Mở tài liệu Microsoft Word trong dịch vụ Windows có vẻ như treo

using Word = Microsoft.Office.Interop.Word; 
using OfficeCore = Microsoft.Office.Core; 

Word.Application m_wordApp = new Word.ApplicationClass(); 
Word.Document m_wordDoc = null; 

object TRUE_VALUE = true; 
object FALSE_VALUE = false; 
object MISSING_VALUE = System.Reflection.Missing.Value; 

m_wordApp.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone; //will still fail with this line removed 
m_wordApp.Visible = false; //will still fail with this line removed 
m_wordApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable; //will still fail with this line removed 
m_wordDoc = m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE); 

tôi có thể xử lý các tài liệu này bằng tay trên máy tính phát triển của tôi. Có ai biết tại sao điều này đang xảy ra hoặc có thêm bất kỳ câu hỏi nào về câu hỏi của tôi không?

+2

Phiên bản Word trên lời nhắc máy sản xuất cho macro hay tắt âm thanh chúng? –

+0

Điều gì sẽ xảy ra khi bạn đặt mã vào ứng dụng Bảng điều khiển thông thường và thực thi trên máy sản xuất? Có một số hộp thoại bật lên không? – Heinzi

+0

Mke - Word sẽ tắt âm thầm các macro. Tôi tìm thấy khóa đăng ký tương ứng với tùy chọn "vô hiệu hóa tất cả các macro mà không thông báo" trong trung tâm tin cậy Word và đặt cho người dùng dịch vụ chạy nhưng điều này chưa khắc phục được sự cố –

Trả lời

4

Tôi đã hy vọng cuối cùng tìm thấy tất cả các vấn đề liên quan đến điều này và đã kết thúc với dòng sau để mở doc:

m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref TRUE_VALUE, ref MISSING_VALUE, ref TRUE_VALUE, ref MISSING_VALUE); 

Các thứ 4 và thứ 2 thông số cuối cùng ngăn chặn sửa chữa và mã hóa các hộp thoại từ mở mà cố định hầu hết các lỗi.

Chìa khóa registry để biến disable macro mà không cần thông báo là:

[HKEY_USERS\S-x-x-xx-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxx\Software\Microsoft\Office\12.0\Word\Security] 
"VBAWarnings"=dword:00000004 

Cuối cùng, sau tất cả những gì vẫn còn tài liệu đã được đâm dịch vụ và rò rỉ trường winword. Sau khi đăng nhập với tư cách là người dùng dịch vụ và mở một trong các tài liệu này, tôi nhận được hộp thoại thông báo này từ từ: "Word không thể khởi động công cụ chuyển đổi mswrd632". Điều này được khắc phục bằng cách xóa khóa đăng ký như được giải thích trong http://support.microsoft.com/kb/973904.

Chỉnh sửa: Tôi cũng thấy rằng vì VBA chưa được cài đặt Word mở hộp thoại để báo cho dịch vụ biết điều này khiến một số tài liệu bị treo dịch vụ. Cài đặt lại nó sau đó vô hiệu hóa mặc dù Word chính nó (như đã giải thích ở trên) có một vài tài liệu xử lý. Vẫn còn một vài tài liệu không thể xử lý được. Hãy suy nghĩ về việc cố gắng http://poi.apache.org/text-extraction.html với ikvmc để phân tích cú pháp tài liệu thay thế.

5

Microsoft.Office.Interop.Word sử dụng trình bao bọc COM để điều khiển từ xa thực thi từ thực tế. Nó là hoàn toàn khủng khiếp. Các thiết lập để vô hiệu hóa macro trong bản sao của Word nó đang sử dụng gần như chắc chắn là một thiết lập người dùng cụ thể và dịch vụ Windows sẽ chạy Word như bất kỳ tài khoản người dùng dịch vụ đang chạy dưới. Cơ hội là nó là cơ bản popping lên một số loại hộp thoại bảo mật vĩ mô trong một số netherworld lý thuyết đó là người sử dụng dịch vụ Windows máy tính để bàn/ui.

+0

Tôi tìm thấy khóa đăng ký tương ứng với tùy chọn "vô hiệu hóa tất cả các macro mà không thông báo" trong trung tâm tin cậy của Word và đặt cho người dùng dịch vụ chạy nhưng điều này không đúng với tình huống –

2

Có các đề xuất chống lại tự động hóa phía máy chủ của Microsoft, nhưng cũng có rất nhiều tài nguyên để giúp bạn nếu đó là những gì bạn vẫn sẽ làm. Hai bài viết sẽ cung cấp cho bạn đủ nền vào những gì để chiếm:

Tuy nhiên, nếu nó cũng đơn giản như tài liệu của bạn được treo vì bất kỳ AutoMacros, như AutoOpen , bên trong mã VBA phía sau, bạn sẽ cần phải sử dụng WordBasic để vô hiệu hóa chúng. Tôi không bao giờ có thể có được điều này để làm việc trong C#, nhưng tôi đã làm trong VB.NET. Xem How to open document that contains AutoOpen macro with PowerShell?

Tùy chọn cuối cùng sẽ là xem xét một công cụ được xây dựng cho tự động hóa văn phòng phía máy chủ, như Apose.Words.

2

Từ sẽ nhắc người dùng khi có sự cố nhỏ với tài liệu. Lời nhắc đó sẽ được hiển thị trên màn hình nền cho các dịch vụ trong trường hợp của bạn, nơi không ai có thể nghe thấy tiếng hét đó. Và ngăn chặn cuộc gọi phương thức Open() hoàn tất.

Đảm bảo đặt đối số OpenAndRepair của phương thức Open() thành True để điều này được xử lý tự động mà không cần nhắc người dùng.

+0

Tôi đặt lập luận mở và sửa chữa TRUE_VALUE và vẫn gặp lỗi. Cuộc gọi mở bây giờ trông giống như m_wordApp.Documents.Open (ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref TRUE_VALUE, ref MISSING_VALUE, ref TRUE_VALUE, ref MISSING_VALUE) –

+0

Bạn gặp lỗi? Tốt lắm, lỗi là gì? –

+0

Có, xin lỗi đã đưa ra lỗi chính trị khi đăng về lỗi và không đăng nó, xin lỗi! Tôi không có nó nữa nhưng khi tôi có thời gian tôi cố gắng xử lý tất cả các tài liệu có vấn đề, tôi chắc chắn tôi sẽ lấy lại nó. –

2

Bạn cũng có thể thử gọi phương thức.OpenNoRepairDialog (...). Nó tồn tại cho văn phòng 2007 và sau đó.

Lưu ý rằng tôi đang sử dụng các cuộc gọi COM thẳng, vì vậy tôi không chắc chắn rằng nó tồn tại trong các thư viện interop văn phòng.

+0

Phương pháp này nằm trong các tập tin interst dst của COM vsto. Tôi có cấu hình chuyển đổi mà tôi có thể sử dụng để cho phép các dịch vụ sử dụng nó thay vì phương pháp mở, nhưng khi sử dụng nó tôi vẫn không thể nhận được bất kỳ tài liệu vấn đề để mở. Hiện tại dịch vụ đang chạy đủ tốt mà không có nó vì vậy tôi sẽ không thực hiện bất kỳ thay đổi nào nhưng cảm ơn cho đề nghị. –

Các vấn đề liên quan