2012-01-10 20 views
17

Điều này có vẻ giống như một câu hỏi phổ biến nhưng sau khi thực hiện một số tìm kiếm, tôi đã không thực sự có thể tìm thấy câu trả lời của mình. Có một bài báo trên đây này:Làm cách nào để viết phần mở rộng vỏ trong C++?

http://www.codeproject.com/KB/shell/shellextguide1.aspx

Nhưng đó là cho một phiên bản rất cũ của Visual Studio. Tôi đang sử dụng VS 2008, vì vậy các hướng dẫn và giao diện dường như không khớp với những gì tôi thấy.

Tôi muốn tạo tiện ích mở rộng vỏ đơn giản bằng cách sử dụng C++ tạo trình đơn ngữ cảnh cho các tệp có phần mở rộng .GZ. Khi nhấp chuột phải vào các tệp này, tôi sẽ có thể nhấp vào mục menu ngữ cảnh của mình và có một cuộc gọi lại trong mã để thực hiện một số thao tác trên tệp đó.

Các mục menu ngữ cảnh khác sẽ thực hiện những việc như hộp thoại không mod đẻ trứng để chấp nhận đầu vào của người dùng trước khi thực hiện một số thao tác.

Từ những gì tôi đã thấy, ATL được sử dụng cho điều này nhưng tôi chưa bao giờ sử dụng ATL, vì vậy tất cả các loại đối tượng và giao diện rất khó hiểu với tôi. Nó sẽ không được như vậy xấu nếu tôi đã có một hướng dẫn thích hợp hoặc tài liệu để đọc.

Có ai có thể giúp tôi không? Không phải là có một số loại hướng dẫn ra khỏi đó mà không phải là 10 tuổi?

+1

Đây thực sự là một điều đặc biệt khó làm. Tôi đã phát triển một mục trình đơn ngữ cảnh khi người dùng nhấp chuột phải vào máy in. Mặc dù mã của tôi chỉ có 40 dòng hoặc hơn, có khoảng 1.000 dòng mã được tạo. Tôi ước tôi có thể hữu ích hơn nhưng tôi không thể chia sẻ bất kỳ mã nào tôi có. Như một mẹo, phần mở rộng shell của bạn phải nằm trong một DLL, và nó phải có GUID riêng của nó, và DLL cần phải được đăng ký với regsvr32. Bạn muốn thực hiện ** CẢ ** IContextMenu và giao diện COM IShellExtInit. Có một cách để có được VS để tạo ra hầu hết nó cho bạn, nhưng tôi không thể nhớ làm thế nào. – dreamlax

+0

[IContextMenu] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb776095 (v = vs.85) .aspx) doc, và cũng [IShellExtInit] (http: // MSDN. microsoft.com/en-us/library/windows/desktop/bb775096(v=vs.85).aspx) doc. – dreamlax

+0

@dreamlax Tôi đã sử dụng thuật sĩ dự án cho dự án ATL, nhưng khi tôi tạo một lớp mới, nó cũng tạo ra một giao diện cho nó - Tôi không muốn một giao diện, nhưng nó không dễ dàng loại bỏ chức năng đó. Plus Tôi không chắc chắn lý do tại sao cần phải được tạo ra mã. –

Trả lời

24

Tôi không thể cho bạn biết chính xác cách viết tiện ích mở rộng vỏ, nhưng tôi sẽ cung cấp một số mẹo. Viết một Extension Shell cung cấp một số lợi thế đáng kể so với đơn giản hơn nhiều “ registry chỉ ” phương pháp:

  • Với Extension Shell, bạn có thể tự động tạo ra một mục trình đơn ngữ cảnh (hoặc menu con) đó là phù hợp hơn với các tập tin được lựa chọn (S). Ví dụ, nếu bạn đang viết một phần mở rộng Shell cho các tệp nén, bạn có thể tạo một menu phụ trong trình đơn ngữ cảnh hiển thị toàn bộ nội dung của tệp nén.
  • Bạn có thể xử lý nhiều tệp cùng lúc, có thể mang lại lợi ích hơn không chỉ cho mục đích hiệu suất mà còn để bạn có thể làm việc dựa trên lựa chọn tổng thể thay vì chỉ cho mỗi tệp.

Một số downfalls để Shell Extensions là:

  • tăng đáng kể độ phức tạp. Hãy chuẩn bị để dành nhiều nỗ lực để làm cho nó hoạt động. Có một máy pha cà phê espresso được cài đặt bên cạnh máy tính của bạn và/hoặc thuê một người nào đó để pha cà phê cho bạn.

  • Khó khăn gia tăng đáng kể khi gỡ lỗi. Ditto về cà phê.

Thật khó để viết tiện ích mở rộng Shell vì chúng có thể rất khó gỡ lỗi.

  • Shell Extensions được nạp bởi quá trình explorer.exe, và không có cấu hình cụ thể của Explorer, bạn cần phải ép thoát khỏi quá trình explorer.exe để bạn có thể cài đặt một phiên bản mới hơn của Shell Extension của bạn.Có một cách để có được Explorer để dỡ bỏ DLL mà nó không còn sử dụng, nhưng bạn chỉ nên làm điều này trên một máy phát triển và không phải trên một mục tiêu triển khai:

    1. Trong RegEdit, duyệt đến khóa sau:

      HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer

    2. Thêm một khóa DWORD mới có tên gọi “ AlwaysUnloadDLL ” và đặt giá trị là 1.

    3. Restart explorer .

    Điều này hoạt động phần lớn thời gian, nhưng vẫn có những lúc bạn cần đóng Explorer vì Tiện ích mở rộng Shell chưa được tải.

  • Hãy nhớ rằng tiện ích mở rộng Shell của bạn có thể được tải bởi các ứng dụng khác, ví dụ: nếu bạn nhấp chuột phải vào tệp có ứng dụng “ mở tệp ” hộp thoại, thì Tiện ích mở rộng Shell của bạn sẽ được tải vào ứng dụng đó, và không phải Explorer.

  • Nếu Shell Extension của bạn gây ra lỗi thời gian chạy, thường thì kết quả đơn giản là mục menu ngữ cảnh của bạn không hiển thị, rất hiếm khi bạn được thông báo rằng tiện ích Shell không tải được hoặc lỗi gây ra lỗi thời gian chạy.
  • Cấu hình có thể khó, ngay cả khi cài đặt, dữ liệu đăng ký cần được tạo ở nhiều nơi và tùy thuộc vào nơi bạn muốn menu ngữ cảnh hiển thị, các địa điểm trong sổ đăng ký có thể khác nhau giữa các phiên bản Windows khác nhau.

Những gì bạn sẽ cần phải làm:

  • Visual Studio cung cấp một số phím tắt để tạo Shell Extensions, nhưng về cơ bản bạn sẽ cần phải tạo ra một DLL COM. Tiện ích mở rộng vỏ cho các mục menu ngữ cảnh phải triển khai cả giao diện IContextMenu và giao diện IShellExtInit.
  • Trong phương thức IShellExtInit::Initialize(), bạn có thể lấy các tệp đã chọn từ tham số IDataObject. Từ bộ nhớ, dữ liệu ở định dạng “ Kéo-n-Thả ”, vì vậy bạn cần phải xử lý HDROP từ IDataObject và truy vấn các tệp từ đó (đây là từ bộ nhớ, nó thực sự có thể khác với như tôi đã mô tả ở đây, vì vậy hãy tiến hành thận trọng).
  • Khi DLL của bạn đã sẵn sàng để được “ cài đặt ”, bạn phải sao chép nó ở đâu đó, và sau đó chạy regsvr32 để đảm bảo rằng nó đã được đăng ký.
  • Làm theo this guide để biết vị trí đặt khóa đăng ký.
  • có thể là sự cố với Windows 64 bit, nếu bạn xây dựng một DLL 32 bit, nó có thể không tải trong trình khám phá 64 bit & hellip; vì vậy hãy ghi nhớ điều này nếu bạn gặp sự cố với Windows 64 bit.
  • Dll của bạn sẽ thực sự có hai GUID được liên kết với nó. Tôi không thể nhớ chính xác cách nó hoạt động, nhưng một GUID đề cập đến bản thân DLL và cái kia đề cập đến phần mở rộng Shell thực tế. Hãy chắc chắn rằng bạn sử dụng GUID của Shell mở rộng thực tế khi tạo khóa trong sổ đăng ký nơi cần có GUID.

Mọi thứ được xem xét & hellip; (Tl; dr)

Cân nhắc các chi phí về việc liệu một Extension Shell là giá trị nó. Nếu bạn muốn tạo các mục trình đơn dựa trên các tệp được chọn, thì một phần mở rộng của Shell có thể là cách duy nhất. Nếu bạn muốn xử lý tất cả các tập tin cùng một lúc thì có thể bạn sẽ cần một phần mở rộng Shell.

Một thay thế cho phương pháp menu ngữ cảnh, có thể là để có một mục tiêu kéo-n-thả trên desktop của người dùng hoặc một cái gì đó. Khám phá các cách khác mà bạn có thể cho phép người dùng gửi tệp của bạn đến ứng dụng của bạn, bởi vì Tiện ích mở rộng Shell thường nỗ lực hơn rất nhiều so với giá trị của nó. Tôi thấy điều này một cách khó khăn và tôi nghĩ mọi người khác cũng vậy.

+3

+1 Bài đăng tuyệt vời, Mọi thứ trở nên dễ dàng hơn một chút với .NET 4, bạn có thể viết tiện ích mở rộng vỏ trong mã được quản lý ngay bây giờ. Đề cập đến nó ở đây để mọi người không hoàn toàn bị thuyết phục. – blak3r

+0

@ blak3r Điều đó [dường như] (https://stackoverflow.com/a/2194638/321973) không được khuyến khích. –