2010-09-21 38 views
5

tôi đang tạo một từ (14) ví dụ với interop ra khỏi C# .net4 winforms ứng dụng để làm việc với một tài liệu. Nếu một số tài liệu từ được mở ra ngoài ứng dụng của tôi, cùng một cá thể từ sẽ được sử dụng làm phiền ứng dụng của tôi.Tạo cá thể từ độc quyền

Câu hỏi đơn giản: Có cách nào để đặt cá thể từ của tôi dành riêng cho đơn đăng ký của tôi không?

Xin cảm ơn trước.

Btw: Tìm thấy một số nội dung có độc quyền/word/office/isolated/block/instance nhưng không có câu trả lời nào.

+1

Tôi rất muốn xem câu trả lời trên đó:> – naacal

+0

Thay đổi hành vi của Word sẽ khiến người dùng * rất * bối rối. Bạn đang cố giải quyết vấn đề gì? – egrunin

+0

Như tôi đã mô tả, người dùng và ứng dụng nên mỗi người có được một ví dụ khác nhau của từ. Nhưng nếu người dùng mở một tài liệu (nhấp đúp chuột vào docx) trong khi ứng dụng đang làm việc trong một cá thể từ ẩn, tài liệu người dùng sẽ được mở trong trường hợp này và treo các hoạt động của tôi trong trường hợp này vì tài liệu đang hoạt động thay đổi. – Gpx

Trả lời

6

Có một giải pháp, nhưng nó không đẹp. Vấn đề chính là từ đăng ký chính nó trong ROT (Chạy Object Table), và các ứng dụng khác sau đó có thể dễ dàng truy cập vào thể hiện của Word đăng ký trong ROT (đó là những gì VB GetObject chức năng chẳng hạn).

Vì vậy, trong ứng dụng của bạn, bạn muốn về cơ bản phải làm 2 việc

  1. Cố gắng GetObject (tức là truy vấn ROT cho một trường hợp chạy)
  2. Nếu bạn nhận được một, bạn biết bạn CÓ để tạo một phiên bản Word mới để sử dụng (CreateObject trong VB, quá trình này khác với các ngôn ngữ khác).
  3. Nếu bạn KHÔNG nhận được một, bạn phải tạo 2 phiên bản Word mới. Việc đầu tiên sẽ tự động đăng ký chính nó trong ROT, thứ hai sẽ không. Sử dụng dụ thứ hai, và khá là trường hợp đầu tiên.

Mặc dù bạn chấm dứt trường hợp đầu tiên, Nó sẽ không "tự động" đăng ký trong ROT và các ứng dụng khác nói chung sẽ không phản đối việc sử dụng nó, họ sẽ tự động tạo một phiên bản mới, trong đó, vì không có cá thể nào khác được đăng ký trong ROT nữa, sau đó sẽ được đăng ký.

Điều đó nói rằng, vẫn còn có thể để các ứng dụng khác nhận được phiên bản Word của bạn, vì vậy kỹ thuật này không chống đạn. Làm sao? Bởi vì Word ALSO đăng ký từng DOCUMENT được nạp trong ROT. Nhưng đó là một tính năng hiếm khi được sử dụng.

+0

điều này rất hữu ích! –

5

Không, không có cách nào để bạn khóa một phiên bản Word chỉ cho chính bạn.

Nhưng, dựa trên nhận xét của bạn, thật dễ dàng để giải quyết vấn đề - không sử dụng ActiveDocument. Bạn có thể đi xung quanh bằng cách sử dụng ActiveDocument bằng cách gọi tài liệu cụ thể và sau đó sử dụng biến đó (cho dù bạn đang mở tài liệu hiện có hay tạo tài liệu mới).

Ví dụ:

Sub NewDoc() 
    Dim d As Document 
    Set d = Documents.Add(Visible:=False) 
End Sub 
Sub ExistingDoc() 
    Dim d As Document 
    Set d = Documents.Open(FileName:="C:\myexisting.doc") 
End Sub 

Trong cả hai trường hợp trên, bạn sẽ chỉ cần sử dụng d ở vị trí của nơi bạn sử dụng để sử dụng ActiveDocument.

+0

Cảm ơn Otaku, nhưng đó không phải là ứng dụng của tôi đang mở tài liệu thứ hai. Tôi ổn với việc xử lý văn bản của tôi, nhưng một người dùng bên ngoài ứng dụng của tôi đang cố gắng mở một tài liệu từ và hệ thống sẽ tự động sử dụng bản invis của tôi. Vì vậy, tôi muốn chặn trường hợp của tôi chỉ dành cho tôi và người dùng sẽ nhận được một phiên bản mới. – Gpx

+0

@Gpx: Vì vậy, tài liệu thứ hai do người dùng mở cũng mở ra vô hình (nghĩa là họ không thể xem tài liệu của họ)? –

+0

Không, tài liệu thứ hai đang mở phiên bản hiện tại của tôi hiển thị với tài liệu mới dưới dạng tài liệu hiện hoạt. Vì vậy, ứng dụng của tôi đang cố tương tác với cá thể nhưng tài liệu sai. Vì vậy, tôi sẽ cố gắng để ngăn chặn trường hợp từ của tôi từ việc mở một tài liệu mới hoặc thiết lập một tùy chọn để luôn luôn mở tài liệu trong một ví dụ thứ hai. – Gpx

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