2013-09-06 87 views
5

Khi mở, ví dụ: một bảng tính với PyWin32, tôi thấy hai lựa chọn để làm như vậy:Sử dụng pywin32, sự khác nhau giữa Dispatch và DispatchEx là gì?

excel1 = win32com.client.DispatchEx('Excel.Application') 
wb = excel1.Workbooks.Open('myxls.xls') 

hoặc tôi có thể làm

excel2 = win32com.client.Dispatch('Excel.Application') 
wb = excel2.Workbooks.Open('myxls.xls') 

và tôi tự hỏi nếu điều này làm cho bất kỳ sự khác biệt. Các docstrings không giúp tôi nhiều trong hai:

>>> w32.Dispatch.__doc__ 
'Creates a Dispatch based COM object.\n ' 

>>> w32.DispatchEx.__doc__ 
'Creates a Dispatch based COM object on a specific machine.\n ' 

Trong this trang web mà họ cho rằng DispatchEx có thể truy cập từ xa.

Có tạo sự khác biệt nào cho phương pháp tôi sử dụng khi tôi chỉ đơn giản là cố gắng tự động hóa bảng tính trên máy tính của riêng mình không?

+0

Cho rằng 'DispatchEx' không được ghi lại và' Dispatch' là, có vẻ như khá rõ ràng rằng bạn nên sử dụng thứ hai trừ khi bạn có lý do chính đáng để làm khác. Nếu bạn đang hỏi một câu hỏi thực tế, đó là câu trả lời. Nếu bạn muốn biết làm thế nào những thứ làm việc dưới mui xe, sau đó chúng tôi có thể cần phải nhìn vào nguồn. – abarnert

Trả lời

11

Tùy thuộc vào những gì bạn muốn. Nếu Excel đã mở, việc sử dụng công văn sẽ tạo một tab mới trong cá thể Excel đang mở. Nếu Excel đã mở, sử dụng dispatchEx sẽ mở một phiên bản Excel mới.

+1

Tôi đang sử dụng Công văn và nó sẽ mở một phiên bản Excel mới. Tại sao? Tôi muốn kết nối với cá thể đã mở. Làm thế nào tôi nên làm gì? –

3

DispatchEx không được ghi lại và Dispatch là, đã hàm ý câu trả lời thực tế: Chỉ cần sử dụng Dispatch, trừ khi bạn có một số lý do rất tốt để tin rằng bạn có trường hợp đặc biệt.

Tuy nhiên, nếu bạn muốn biết sự khác nhau dưới chăn:

Từ the pywin32 source, bạn có thể thấy rằng DispatchEx cố gắng để trả lại một bọc lên giao diện IDispatchEx hơn IDispatch. (Không quá ngạc nhiên, đưa ra các tên.)

Bạn có thể tra cứu IDispatchEx tại MSDN, và bạn sẽ thấy rằng nó

một phần mở rộng của giao diện IDispatch, hỗ trợ các tính năng phù hợp với ngôn ngữ động như ngôn ngữ kịch bản.

Ý tưởng là, nếu điều bạn đang tự động hóa là một đối tượng động (như loại đối tượng bạn có trong Python hoặc Javascript), chứ không phải là đối tượng tĩnh (như loại đối tượng bạn có C++ hoặc Java), mã Visual Basic có thể truy cập vào tính chất động của nó — liệt kê, thêm và loại bỏ các thành viên trong thời gian chạy, v.v.

Và dĩ nhiên pywin32 có thể làm hầu như mọi thứ VB có thể, bạn chỉ cần rõ ràng hơn một chút đôi khi. Trong trường hợp này, bạn cần phải tạo một DispatchEx và gọi phương thức DeleteMemberByName v.v.

1

Nếu bạn đang sử dụng COM để tự động, nói, Excel sẽ đến lúc bạn muốn .Dispatch để kích hoạt một phiên bản ứng dụng mới, không can thiệp vào ứng dụng đang chạy trên màn hình.

Sử dụng DispatchEx thay vì Công văn

+0

Điều gì sẽ xảy ra với 'Công văn'? – pandita

+2

Một cái gì đó tôi chỉ cần chạy vào đó có thể đi sai với công văn.Nếu bạn đang viết một GUI (hoặc bất kỳ chuỗi) và muốn làm một số công việc nền trong một chủ đề yêu cầu một đối tượng com object, trước tiên bạn phải gọi pythoncom.CoInitialize() hoặc bạn sẽ nhận được một loạt các com_errors. Bây giờ, nếu bạn cố gắng làm điều gì đó trong nền trước bằng cách sử dụng một đối tượng được tạo bởi Dispatch, trong khi nhiệm vụ nền đang sử dụng một đối tượng được tạo bởi Dispatch (chúng sẽ tham chiếu đến cùng một ứng dụng), các cuộc gọi sẽ bị từ chối. DispatchEx sửa lỗi bằng cách sử dụng các cá thể riêng biệt cho mỗi luồng. –