C++ 处理多个文件时,我必须在COleDropTarget::OnDrop()中返回哪个值?

C++ 处理多个文件时,我必须在COleDropTarget::OnDrop()中返回哪个值?,c++,windows,mfc,drag-and-drop,ole,C++,Windows,Mfc,Drag And Drop,Ole,我通过从派生类CDropTarget并重写它,使我的MFC应用程序成为一个drop目标。一切正常。然而,的返回值让我感到困惑。其说明如下: 如果下降成功,则为非零;否则为0 如果在我的应用程序中删除多个文件,我不理解“成功”是什么意思。 例如,考虑以下实现: BOOL CDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObj, DROPEFFECT tDropEffect, CPoint tPoint) { // I left ou

我通过从派生类
CDropTarget
并重写它,使我的MFC应用程序成为一个drop目标。一切正常。然而,的返回值让我感到困惑。其说明如下:

如果下降成功,则为非零;否则为0

如果在我的应用程序中删除多个文件,我不理解“成功”是什么意思。 例如,考虑以下实现:

BOOL CDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObj, DROPEFFECT tDropEffect, CPoint tPoint)
{
    // I left out declaration/definition of hDrop and path for reasons of clarity.
    [...]

    UINT numHandledFiles = 0;

    // Determine the number of dropped files.
    UINT numDroppedFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);

    // Iterate over all dropped files.
    for (UINT n = 0; n < numDroppedFiles; n++)
    {
        // Get the path of the current file from the HDROP structure.
        if (DragQueryFile(hDrop, n, path, PATH_MAX) > 0)
        {
            // Try to handle each dropped file in my function handleFile().
            // It returns true if a file could be handled and false otherwise.
            // (The latter happens if a file with the wrong type was dropped.)
            if (handleFile(path))
                numHandledFiles++;
        }
    }

    return ?  // See description below.
}
以及:

我尝试了这两种方法,但从Windows资源管理器或Total Commander在我的应用程序中删除文件时,
我一点也没注意到有什么不同。返回值有什么影响?

当阅读MFC文档时,您会感到困惑,您应该按照您提供的链接“有关更多信息,请参阅Windows SDK中的”中的建议,查阅Windows SDK文档:

返回时,必须包含一个标志,该标志指示拖放操作的结果


请注意,
IDropTarget::Drop
与之更为相似,您应该实现它,而不是
COleDropTarget::OnDrop
。你所描述的情况没有严格的规定。但是,
DROPEFFECT
应该与应用程序行为相匹配(即接受或拒绝)。

对不起,我(再次)有点困惑。您引用的文本指的是
Drop()
函数的参数
DWORD*pdwefect
。这不是返回值。对于
Drop()
,返回值为
HRESULT
;对于my
OnDrop()
,返回值为
BOOL
。我读到,
OnDrop()
用于简单的拖放,我认为在我的情况下这就足够了。为什么使用<代码> OnDROPXEXE()/<代码>?@ HONK:在C++方面,<代码> HESRESU/<代码>是<代码> DROP()/<代码>的返回值。然而,这只是COM的一个产物。在大多数情况下,COM接口成员除了返回真实的返回值(使用
[out]
IDL属性修饰的值)外,还返回错误/成功代码。至于
OnDrop()
OnDropEx()
:与MFC中的许多方便实现一样,它们增加了复杂性,但没有带来实质性好处。在这种特定情况下,它还隐藏了重要信息(例如,
DROPEFFECT
BOOL
返回值
OnDop()
)相关的信息。谢谢,我现在更好地理解了您的答案!我想我会选择OnDropEx()。但是,我仍然不确定使用哪个
DROPEFFECT
。我的应用程序只是收集文件路径以便以后读取文件。因此,我既没有执行
复制
操作,也没有执行
移动
操作,因此决定执行
。哪一个(最)正确?它只是确定开始拖动的代码中DoDragDrop()的返回值,以便判断拖动是否成功。它可能会使用此值进行一些拖动后清理。这是非常不寻常的,尤其是在拖动文件时。隐含的是,您不知道这段代码是什么样子的,所以您永远无法100%确定它可能会产生什么影响。考虑到它成功的几率很低,而且你检查过它没有成功,最好的办法就是停止担心它。@HansPassant:好吧,这是我第一次实现下降目标。我很确定我做错了几件事,所以我试着去理解至少这一点。也许我想得太多了;)
return numHandledFiles > 0;                 // At least one file could be handled.
return numHandledFiles == numDroppedFiles;  // All files could be handled.