2010-08-31 29 views
6

Tôi đã thiết lập phần mở rộng tệp trong Registry cho chương trình của tôi as Windows requires.Làm cách nào để tôi có thể tải Hiệp hội tệp của mình để mở nhiều tệp trong một bản sao chương trình duy nhất?

Trong Registry, dưới vỏ/mở/lệnh, tôi đã có:

"C:\MyProgramPath\MyProgram.exe" "%1" 

này hoạt động tốt đối với tôi. Khi ai đó nhấp vào một hoặc nhiều tệp được liên kết với ứng dụng của tôi, ứng dụng của tôi sẽ mở tệp một cách chính xác nhưng mỗi tệp được mở trong một cá thể chương trình riêng biệt.

Có cách nào tôi có thể thực hiện việc này và mở tất cả các tệp trong một phiên bản chương trình không?

Trả lời

1

Bạn có thể sử dụng DDE. Xem http://cc.embarcadero.com/Item/17787 để biết ví dụ tại Delphi.

EDIT:

Các liên kết mà bạn đã nói về phương pháp khác: sử dụng IDropTarget. Điều này có thể phù hợp hơn với khả năng kéo và thả đã chạy của bạn.

+0

Tại trang MSDN tôi liên kết tới, nó nói "Lưu ý: Phương thức DDE không được dùng nữa, thay vào đó hãy sử dụng phương thức DropTarget." Tôi đang gặp khó khăn trong việc tìm ra cách thiết lập IDropTarget trong Delphi. Tôi có nên đi với DDE không? – lkessler

+0

Dường như IDropHandler là con đường để đi. Bây giờ tất cả những gì tôi phải làm là tìm ra cách để làm điều đó. Tôi đã hỏi một câu hỏi khác để được trợ giúp về điều đó tại: http://stackoverflow.com/questions/3613333/how-do-i-get-droptarget-to-work-with-my-drop-handler-in-delphi – lkessler

4

Đây là một câu hỏi khá phổ biến và nó thực sự không liên quan gì đến phần mở rộng tệp của Windows. Khi bạn doubleclick một tệp thuộc loại tùy chỉnh của chương trình, Windows sẽ bắt đầu ứng dụng được liên kết MyProgram.exe và chuyển tên tệp %1 làm đối số dòng lệnh.

Bây giờ, nếu bạn muốn chỉ có một trường hợp duy nhất của ứng dụng của bạn, bạn cần phải làm điều này:

  1. Khi chương trình của bạn (MyProgram.exe) bắt đầu, nó sẽ kiểm tra nếu có đã là một thể hiện của nó chạy.
  2. Nếu có trường hợp trước đó, phiên bản mới MyProgram.exe sẽ gửi một tin nhắn (loại nào đó, không nhất thiết là thông báo cửa sổ) đến phiên bản cũ yêu cầu mở tệp %1.
  3. Phiên bản mới sẽ tự chấm dứt chính nó.

Một cách tiếp cận rất đơn giản

Có một số cách thực hiện điều này. Một trong những cách đơn giản nhất là đặt khóa/giá trị đăng ký mỗi khi ứng dụng của bạn bắt đầu và xóa nó khi ứng dụng tồn tại. Sau đó, khi (một phiên bản mới của) ứng dụng của bạn bắt đầu, trước khi thiết lập khóa/giá trị này, nó sẽ kiểm tra xem nó đã được thiết lập chưa. Nếu vậy, hãy làm theo các bước (2) và (3) ở trên. Đây có thể không phải là cách tiếp cận ổn định nhất (thực tế nó là một ý tưởng rất tồi, vì bạn không thể đảm bảo rằng ứng dụng sẽ loại bỏ khóa/giá trị khi nó tồn tại nếu nó không bình thường), nhưng nó sẽ cho bạn ý tưởng cơ bản. Khác, có lẽ cách tốt hơn, bao gồm FindWindow và, thậm chí tốt hơn, việc sử dụng mutexes.

Bước hai có thể được thực hiện bằng cách gửi thông báo cửa sổ (có thể là WM_COPYDATA) hoặc bằng cách đặt giá trị đăng ký hoặc bằng cách ghi tệp hoặc ... Có nhiều cách liên lạc giữa quá trình xử lý khác nhau.

Chi tiết

Vì đây là một câu hỏi khá phổ biến nên đã được xử lý trước đó. Xem, ví dụ: this Delphi-specific article.

+2

Thật không may, việc xây dựng chương trình này vào chương trình của tôi sẽ luôn ngăn chặn nhiều phiên bản. Nhưng đó không phải là điều tôi muốn. Nếu tập tin A được nhấp vào, tôi muốn nó trong ví dụ 1. Nếu sau đó tập tin B được nhấp vào, sau đó tôi muốn nó trong ví dụ 2. Tuy nhiên nếu cả A và B được nhấp vào trong cùng một nhấp chuột, sau đó họ sẽ có 2 tham số được chuyển đến chương trình cùng một lúc và tôi muốn cả hai đều mở trong một trường hợp. Tại sao tôi muốn điều đó? Vì vậy, nó sẽ có tác dụng tương tự như chạy chương trình của tôi từ dòng lệnh với 2 tham số, hoặc kéo và thả 2 tập tin vào chương trình của tôi. Cảm ơn, nhưng điều này không giúp tôi. – lkessler

+0

@Ikessler: Tôi hiểu rồi. Tôi không hiểu rằng bạn có ý như vậy. Có lẽ bạn nên viết điều này trong câu hỏi của bạn? –

+0

Xin lỗi vì đã không đề cập đến nó trước đó, nhưng tôi đã không nhận ra rằng nó có liên quan cho đến khi bạn đưa ra câu trả lời của bạn. Cảm ơn bạn rất nhiều vì đã dành thời gian viết câu trả lời chi tiết của bạn. – lkessler

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