2012-01-26 35 views
6

Bối cảnh:Giám sát In ống chỉ Không dùng Interop/Switch Mã

Tôi đang viết một ứng dụng trong C# sử dụng .NET 4.0. Nó in một loạt các tài liệu theo một thứ tự nhất định. Các tài liệu có tất cả các loại khác nhau và thực sự được in bằng ShellExecute với động từ "in".

Để đảm bảo đơn đặt hàng không bị xáo trộn, tôi muốn kiểm tra hàng đợi in cho máy in có liên quan. vòng lặp chính của tôi sẽ như thế nào:

  1. Invoke "in" hành động trên các tài liệu
  2. Chờ tài liệu để hiển thị trong hàng đợi in
  3. Lặp lại cho đến khi thực hiện

Làm thế nào tôi có thể giám sát Hàng đợi in bằng mã được quản lý?

Tôi đã tìm thấy một số ví dụ tuyệt vời về thực hiện những việc tương tự bằng cách sử dụng các cuộc gọi không được quản lý (Giống như: http://blogs.msdn.com/b/martijnh/archive/2009/08/05/printmonitor-a-c-print-spooler-monitor.aspx). Ngoài ra, tôi biết làm thế nào để nhìn vào các tập tin spooled dưới c: \ windows \ system32 \ spool ... và con số những điều trên con đường đó.

Làm thế nào, không có giải pháp nào trong số đó rất thỏa mãn ... với số lượng cá tuyết không được quản lý Tôi gọi tôi cảm thấy như tôi chỉ cần viết ứng dụng bằng C++. (Và không có phụ thuộc .NET.)

Câu hỏi chính: Có thực sự không có cách nào để theo dõi hàng đợi in chỉ bằng các cuộc gọi được quản lý?

Câu hỏi chung khác: Tôi đến từ thế giới java, và thường chỉ sử dụng ngôn ngữ .NET khi tôi muốn làm một cái gì đó OS cụ thể hoặc cái gì đó cần tương tác với những thứ khác trong thế giới MS. (Ví dụ thành phần SSIS.)

Nó có vẻ như mỗi khi tôi bắt đầu một dự án tôi kết thúc trong cùng một đống lộn xộn này: tất cả các loại cuộc gọi đến các chức năng có nguồn gốc, COM thứ, vv, vv

Câu hỏi Secondary : Có điều gì tôi thiếu về triết lý hoặc triển khai .NET không? .NET có phải là sự lựa chọn sai cho bất cứ thứ gì cần phải làm những thứ đặc trưng cho Windows như thao tác hàng đợi in không?) Tôi nhận được (hoặc nghĩ rằng tôi nhận được). về mặt lý thuyết được cho là độc lập với hệ điều hành .. nhưng chắc chắn hệ điều hành hiện đại nhất có máy in và hàng đợi in và những thứ tương tự. (Vì vậy, nếu bạn có các cuộc gọi chung để thực hiện các loại điều này, chúng có thể được triển khai trên từng phiên bản của khung nền tảng ..)

+0

Tại sao các downvotes? Đây là một câu hỏi lập trình rất cụ thể. Câu hỏi thứ hai, mơ hồ hơn chỉ là một bên. (Bởi vì nó có vẻ như gốc rễ của câu hỏi cụ thể của tôi có thể là một sự hiểu lầm cơ bản.) – user426724

Trả lời

5

Câu hỏi chính: Hãy xem PrintQueueLocalPrintServer lớp trong không gian tên System.Printing.

Câu hỏi phụ: .NET không được viết là độc lập với hệ điều hành (sans Mono), nó được viết thành phiên bản Windows độc lập. Trong khi nó sẽ được tốt đẹp chỉ đối phó với các đối tượng quản lý và các cuộc gọi quản lý, tôi thấy điều này như là một kỳ vọng hơi không thực tế. Kích thước và khối lượng tuyệt đối của các hàm C và COM hiện có mà Windows tiếp xúc làm cho gói mọi thứ một nhiệm vụ khó khăn. Trong khi tôi chắc chắn Microsoft có rất nhiều nhà phát triển trong bảng lương, tôi sẽ nói rằng lợi tức đầu tư khá thấp đối với một cam kết như vậy, xem xét việc sử dụng hỗ trợ COM & P/Invoke tương đối dễ dàng.

+0

Âm thanh về quyền. – Kir

+0

Đây chính là lý do tại sao * hỗ trợ COM và P/Invoke được tạo sẵn và dễ sử dụng. Họ chỉ quấn các tính năng phổ biến nhất. –

+0

Điều đó, công trình, cảm ơn câu trả lời. @Cody Grey: Điều đó không phủ nhận mục tiêu phiên bản windows-độc lập mặc dù? Hoặc là họ giả định rằng hầu hết các ứng dụng có thể được xây dựng bằng cách sử dụng chỉ các tính năng phổ biến mà họ quấn? – user426724