创建GUI以在上下文菜单外壳扩展中处理选定文件的正确方法

时间:2013-11-12 11:37:36

标签: c++ shell winapi com shell-extensions

在编写上下文菜单shell扩展时,我喜欢只捕获用户右键单击的所选文件列表的方法,然后以某种方式将它们传递给外部程序。主要工作在外部程序中完成,该程序具有自己的GUI,并在单独的进程中运行。 shell扩展代码只是将所选文件列表传递给外部程序。

(在我看来,这种方法也遵循其他实用程序,如7-zip。)

但是可以创建例如在Explorer进程内直接从shell扩展内部的对话框?我的理解是shell扩展中的代码应尽量少做,并将控件返回给Explorer,不要挂起Explorer进程。

如果我在shell扩展处理程序中创建一个对话框(例如在IContextMenu::InvokeCommand的实现中),那么最合适的方法是什么?

假设在对话框OnInitDialog()实现中我设置了对话框的GUI,我是否应该调用类似DoMainWork()的内容,并在此方法中插入消息循环来处理消息?<登记/> e.g。

// 1. Inside context-menu shell extension implementation
//
HRESULT CMyContextMenuShellExt::InvokeCommand(...)
{
      ...
     // Build a GUI to process the selected files
     CMyDialog dlg( ...pass the list of selected files to the dialog-box ... );
     dlg.DoModal();
      ...
}

// 2. Inside CMyDialog class
//
LRESULT CMyDialog::OnInitDialog()
{
    ... prepare the GUI of the dialog-box

    DoMainWork();     
}

// 3. Inside CMyDialog::DoMainWork():
//  
for (... loop to iterate over selected files ...) {
    ... do some processing for current file

    // Process messages
    // (including e.g. the pressing of a "Stop" button by the user)
    MSG msg;
    while (PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

0 个答案:

没有答案