Đâ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:
- 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.
- 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
.
- 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.
Nguồn
2010-08-31 04:54:13
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
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