1

我的代码:

void CWGAccountFilterDlg::OnDropFiles(HDROP hDropInfo)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CDialogEx::OnDropFiles(hDropInfo);
    wchar_t lpFilePath[MAX_PATH] = { 0 };
    int nCount = DragQueryFile(hDropInfo, -1, NULL, 0);
    DragQueryFile(hDropInfo, nCount, lpFilePath, _countof(lpFilePath));
    DragFinish(hDropInfo);
    GetDlgItem(IDC_EDIT_FILE)->SetWindowText(lpFilePath);
    m_FilePath.Format(L"%s", lpFilePath);
}

第二次调用DragQueryFile返回 0(这种情况是正确的)并且lpFilePath(这不是预期的)其中没有数据。我确定该nCount值是有效的,没有缓冲区溢出。

该对话框和 CEdit 控件都将“接受文件”设置为 true。并且有一个名为CMyEditimplement from的类CEdit,并处理了该OnDropFiles函数。

4

1 回答 1

3

DragQueryFileW的文档中:

要查询的文件的索引。如果此参数的值为 0xFFFFFFFF,则 DragQueryFile 返回已删除文件的计数。如果此参数的值介于零和删除的文件总数之间,则 DragQueryFile 将具有相应值的文件名复制到 lpszFile 参数指向的缓冲区。

在第二次调用中DragQueryFile,第二个参数应该在0and之间nCount。测试 的值nCount以确保它大于零,如果您只对第一个文件感兴趣,则传递零。

这假设只有一个文件被删除。如果有更多文件,则添加一个循环。

int nCount = DragQueryFile(hDropInfo, -1, NULL, 0);
if (nCount > 0)
{
    //(add a loop to get multiple files)
    DragQueryFile(hDropInfo, 0, lpFilePath, _countof(lpFilePath));
    GetDlgItem(IDC_EDIT_FILE)->SetWindowText(lpFilePath);
    m_FilePath.Format(L"%s", lpFilePath);
}
DragFinish(hDropInfo);
于 2018-09-28T04:12:35.420 回答